За последние ~ 12 месяцев я перешел от написания преимущественно ядер CUDA к преимущественно использованию Thrust, а затем вернулся к написанию преимущественно ядер CUDA. В целом, написание собственных ядер CUDA должно обеспечивать более высокую производительность, но в более простых тестовых случаях разница должна быть незначительной.
Тяга имитирует C ++ STL, так что он несет в себе те же самые достоинства и недостатки, что и STL. А именно, он предназначен для работы с векторами данных в очень обобщенном виде. С этой точки зрения Thrust лучше, чем CUDA, но его не следует рассматривать как универсальное решение. Основные преимущества Thrust в таких областях, как абстракция и переносимость; вам не нужно думать о размерах блоков, и легко написать функторы, которые одинаково применимы к данным на устройстве или на хосте, тогда как ядро CUDA, очевидно, может работать только с памятью устройства. У этого также есть много очень полезных алгоритмов; приятно не писать свои собственные алгоритмы сокращения или сортировки, поскольку Thrust обеспечивает их очень эффективную реализацию. Но под капотом ваши шаблоны доступа к данным могут не совпадать с тем, для чего был разработан Thrust, и thrust имеет тенденцию выполнять много временного выделения памяти под капотом (что в контексте производительности часто не очень хорошо; вы можете взломать его модель управления памятью). для кэширования этих временных выделений, но я на самом деле не рекомендую делать это, просто вместо этого пишите ядра и полностью управляйте использованием памяти).
Мой предпочтительный режим работы сейчас - это использовать CUDA практически для всего, кроме погружения в алгоритмы Thrust для конкретных вещей. Я не хочу писать свои собственные сортировки или сокращения, поэтому я использую реализации Thrust этих и других операций.