2010-09-13 3 views
1

Есть способы использования:лучший способ использования CUDA

CUDA
  1. авто-paralleing инструменты, такие как PGI станции;
  2. обертка, такие как Thrust (в стиле STL)
  3. NVidia GPUSDK (среда/API драйвер)

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

ответ

2

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

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

This page очень интересный и упоминает большую серию статей о CUDA на Dr. Dobb's.

1

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

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

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

3

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

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

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

Инструменты с автоматическим распараллеливанием, как правило, не выполняют столь же хорошую работу с различными типами памяти, как упоминалось в karlphillip.

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

1

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

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

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

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

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

Смежные вопросы