Как CUDA Thrust сравнивается с необработанным ядром? - PullRequest
2 голосов
/ 10 июля 2019

Я новичок в программировании на GPU и не уверен, что приведет к созданию наиболее эффективного кода. Каковы плюсы / минусы использования Thrust против написания собственного ядра и самостоятельного управления памятью?

Если это поможет уточнить мою цель: у меня есть большая матрица, где для каждого значения мне нужно выполнить несколько векторных операций. Я знаю, что мне нужен динамический параллелизм для этой задачи, и в настоящее время у меня есть собственное ядро, чтобы пройти через матрицу, которая будет вызывать другие ядра. Я рассматриваю вопрос о том, следует ли заменить ядро ​​вызовом Thrust (например, thrust :: for_each) и / или следует ли использовать Thrust внутри ядра для векторных операций.

1 Ответ

4 голосов
/ 10 июля 2019

За последние ~ 12 месяцев я перешел от написания преимущественно ядер CUDA к преимущественно использованию Thrust, а затем вернулся к написанию преимущественно ядер CUDA. В целом, написание собственных ядер CUDA должно обеспечивать более высокую производительность, но в более простых тестовых случаях разница должна быть незначительной.

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

Мой предпочтительный режим работы сейчас - это использовать CUDA практически для всего, кроме погружения в алгоритмы Thrust для конкретных вещей. Я не хочу писать свои собственные сортировки или сокращения, поэтому я использую реализации Thrust этих и других операций.

...