Я очень новичок в программировании GPGPU, поэтому, пожалуйста, прости меня, если вопрос не особенно уместен. Из того, что я понимаю, программирование на GPU - очень сложная часть инженерной работы по сравнению с обычным программированием на CPU. Нужно быть очень осторожным в вопросах расхождения, тайлинга, распределенного распределения памяти и перекрытия связи между устройствами и вычислениями на устройстве.
После небольшого исследования я нашел библиотеку тяги, которая, похоже, пытается имитировать C ++ STL. Это довольно мило. Однако, исходя из моего очень ограниченного опыта и видя все микроуправления, необходимые для получения хорошей производительности, я немного скептически отношусь к производительности. Может ли тяга эффективно обрабатывать всю сложную часть программирования внутри? Некоторые очень известные библиотеки, такие как PETSc, похоже, используют этот пакет, что заставляет меня верить, что так или иначе должно.
Мне было интересно, могли бы люди с большим опытом работы с CUDA и толком сказать пару слов о производительности пакета по сравнению с низкоуровневым программированием CUDA. Когда я могу использовать тягу и когда я должен вернуться к CUDA?
источник
Ответы:
У меня нет личного опыта работы с Thrust, но я использую ViennaCL, еще одну высокоуровневую библиотеку GPU, которая скрывает почти все детали. Исходя из моего личного бенчмаркинга, я вижу ускорения в 2–40 раз при реальных вычислениях, если вы игнорируете время, необходимое для перемещения по памяти.
Когда вы должны использовать процессор против тяги против CUDA, все зависит от проблемы, которую вы решаете, ваших навыков и времени, которое у вас есть. Я бы порекомендовал начать с решения простых задач всеми тремя методами, чтобы увидеть их относительную производительность. Затем вы сможете быстро написать собственное программное обеспечение, сравнить его и применить соответствующий метод gpu в тех областях, где требуется ускорение, вместо того, чтобы тратить свое время на написание программного обеспечения CUDA, которое даст вам только пару минут времени выполнения. ,
источник
Я использовал Thrust в своем проекте расширения связанного кластера. В зависимости от ситуации Thrust может работать так же хорошо или даже лучше, чем низкоуровневая реализация, которую вы выполняете сами (в частности,
reduce
ядро работает довольно хорошо для меня). Однако общий характер и гибкость Thrust означают, что иногда приходится выполнять много дополнительного копирования, дополнения массивов и т. Д., Что может несколько замедлить его в некоторых неприятных крайних случаях. В прошлый раз я использовалsort
его довольно медленно по сравнению с другими библиотеками, такими как b40c или mgpu. Тем не менее, NVIDIA работает над улучшением алгоритмической производительности Thrust, так что в будущем это может стать менее серьезной проблемой.Вы должны попытаться написать свой код, используя Thrust и CUDA, а затем использовать Visual Profiler, чтобы определить, что лучше для конкретной задачи, которая вас интересует. Вероятно, что передача памяти займет больше всего времени работы вашей программы, и вы не не нужно беспокоиться об оптимизации собственных ядер для банковских конфликтов, количества команд и т. д., тогда я бы использовал Thrust. Это также имеет побочное преимущество, так как делает ваш код гораздо менее многословным и более легким для людей, которые не знакомы с программированием на GPU.
источник
Целью тяги (как и большинства библиотек шаблонов) является предоставление абстракции высокого уровня при сохранении хорошей или даже превосходной производительности.
Я бы посоветовал не сильно беспокоиться о производительности, а спросить себя,
Ваше приложение может быть описано с точки зрения алгоритмов, реализованных в тяге, и если
вам нравится возможность написания «общего» параллельного кода без необходимости вдаваться в подробности поиска эффективного сопоставления с данной аппаратной / программной архитектурой.
Если вы ответите положительно на оба вопроса, вы сможете реализовать свою программу с меньшими усилиями по сравнению с реализацией только CUDA. Затем вы можете профилировать свое приложение и решить, стоит ли пытаться улучшить производительность.
Тем не менее, я должен признаться, что мне не нравится «общее» программирование, потому что я готов изучать что-то новое, когда я пишу программу. Я бы пошел по другому пути: напишите реализацию прототипа на python + numpy + scipy, затем добавьте ядра CUDA для тех 1% - 2% кода, который действительно нуждается в оптимизации и подходит для запуска на GPU. Конечно, для этого вам понадобится некоторая предварительная наука, поскольку неправильное решение на этапе создания прототипа (например, структура данных, не подходящая для ядер CUDA) может привести к ужасным последствиям для производительности. Обычно для получения хорошего кода требуется больше итераций, и нет уверенности в том, что лучше, чем тяга.
источник