лучший способ использования Cuda - PullRequest
1 голос
/ 13 сентября 2010

Существует несколько способов использования cuda:

  1. инструменты автоматического параллелизма, такие как рабочая станция PGI;
  2. оболочка, например Thrust (в стиле STL)
  3. NVidiaGPUSDK (API времени выполнения / драйвера)

Какой из них лучше для производительности или кривой обучения или других факторов?Любое предложение?

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

Рейтинг производительности, скорее всего, будет 3, 2, 1. Кривая обучения равна (1 + 2), 3.

Если вы станете экспертом CUDA, то почти невозможно будет превзойти производительностьваш вручную свернутый код, использующий все приемы из книги с использованием GPU SDK, благодаря предоставленному вам элементу управления.

При этом оболочка типа Thrust написана инженерами NVIDIA и показала несколько проблем,Эффективность 90-95 +% по сравнению с CUDA, свернутым вручную.Сокращения, сканы и многие классные итераторы, которые у них есть, полезны и для широкого класса задач.

Инструменты автоматического распараллеливания, как правило, не так хорошо справляются с работой с различными типами памяти, как упоминал Карлфиллип.

Мой предпочтительный рабочий процесс - использовать Thrust для записи как можно больше, а затем использовать GPU SDK для остальных.Это в значительной степени является фактором того, что вы не теряете слишком много производительности, чтобы сократить время разработки и повысить удобство обслуживания.

2 голосов
/ 13 сентября 2010

Используйте традиционный CUDA SDK для повышения производительности и уменьшения кривой обучения.

CUDA предоставляет несколько типов памяти (глобальную, разделяемую, текстурную), которые оказывают существенное влияние на производительность вашего приложения, в Интернете есть отличные статьи об этом.

Эта страница очень интересна и упоминает большую серию статей о CUDA на Dr. Добба .

1 голос
/ 25 ноября 2011

Это зависит от того, что вы хотите сделать на GPU.Если ваш алгоритм получит большую выгоду от таких вещей, как тяга, таких как сокращение, префикс, сумма, тогда толчок определенно стоит попробовать, и я уверен, что вы не можете писать код быстрее на чистом CUDA C.

Однако, если вы переносите уже параллельные алгоритмы с CPU на GPU, может быть проще написать их на простом CUDA C. У меня уже были успешные проекты с хорошим ускорением в этом направлении, и код CPU / GPU, который выполняетфактические вычисления практически идентичны.

Вы можете объединить две парадигмы в некоторой степени, но, насколько я знаю, вы запускаете новые ядра для каждого вызова Thrust, если вы хотите, чтобы все было в одном большом толстом ядре(принимая слишком частые запуски ядра из уравнения), вы должны использовать простой CUDA C с SDK.

Я считаю, что чистый CUDA C на самом деле легче освоить, поскольку он дает вам довольно хорошее понимание того, чтопроисходит на GPU.Thrust добавляет много магии между вашими строками кода.

Я никогда не использовал инструменты параллелизма, такие как рабочая станция PGI, но я бы не советовал добавлять еще больше «магии» в уравнение.

1 голос
/ 21 сентября 2010

Я считаю, что NVIDIA GPU SDK - лучший, с несколькими оговорками. Например, старайтесь избегать использования функций cutil.h, так как они были написаны исключительно для использования с SDK, и я лично, как и многие другие, столкнулся с некоторыми проблемами и ошибками, которые трудно исправить. исправить (Там также нет документации для этой "библиотеки", и я слышал, что NVIDIA не поддерживает его вообще)

Вместо этого, как вы упомянули, используйте один из двух предоставленных API. В частности, я рекомендую API времени выполнения, так как это API более высокого уровня, и поэтому вам не нужно слишком сильно беспокоиться обо всех деталях реализации низкого уровня, как в API устройства.

Оба API полностью документированы в Руководстве по программированию CUDA и Справочном руководстве CUDA, оба из которых обновляются и поставляются с каждым выпуском CUDA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...