Высокопроизводительная функция суммирования / сканирования префиксов в CUDA, поиск тяги, альтернатива библиотеке cuDPP

Я ищу высокопроизводительную мультисканируемую / мульти-префиксную сумму (много строк в одном ядре) для моего проекта в CUDA.

Я пробовал один из библиотеки Thrust, но он слишком медленный. Также вызывает сбой после компиляции с отладочными флагами nvcc (-g -G).

После неудачи с Thrust я сосредоточился на библиотеке cuDPP, которая раньше была частью инструментария CUDA. Производительность cuDPP действительно хорошая, но библиотека не соответствует последней версии cuda 5.5, и в функции cudppMultiScan() при отладке с помощью средства проверки памяти есть некоторые глобальные проблемы с нарушением памяти. (cuda 5.5, nsight 3.1, visual studio 2010, gtx 260 cc 1.3)

Кто-нибудь знает, что использовать вместо этих двух библиотек?

Р.

2 ответа

Эти библиотеки, особенно упорные, стараются быть как можно более универсальными, а оптимизация часто требует специализации: например, специализация алгоритма может использовать разделяемую память для фундаментальных типов (таких как int или float), но универсальная версия не может. Бывает, что для конкретной ситуации специализация отсутствует!

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

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

Такая специализация требует функтора, который возвращает поглощающее значение, которое предотвращает смешивание строк. Тем не менее, ваша собственная тщательная реализация, вероятно, будет намного быстрее.

Чтобы написать свой собственный префикс сканирования, вы можете обратиться к

  1. Пример сканирования CUDA SDK;
  2. Глава 13 Н. Уилта, "Справочник CUDA";
  3. Глава 6 S. Cook, "Программирование CUDA, Руководство разработчика по параллельным вычислениям с графическими процессорами";
  4. Параллельная сумма префикса (сканирование) с помощью CUDA.

Чтобы сделать multi-prefix-sum, вы можете многократно запускать одно и то же ядро ​​(как предложено a.lasram) или пытаться достичь cuncurrency с помощью потоков CUDA, хотя я не знаю, что это будет эффективно работать для вашей карты.

Другие вопросы по тегам