CUDA — лучшее использование или меньший доступ к глобальной памяти?

Мой код CUDA должен работать с (уменьшить до среднего/стандартного значения, рассчитать гистограмму) с 4 массивами, каждый из которых имеет длину 2048 чисел с плавающей запятой и уже хранится в памяти устройства из предыдущих ядер.

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

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

Каков наилучший способ параллелизации в такой ситуации?


person zenna    schedule 24.11.2009    source источник


Ответы (4)


Межблочное взаимодействие не рекомендуется в CUDA. Кроме того, Fermi будет поддерживать параллельное выполнение ядра, поэтому более высокая занятость станет менее важной в будущем. Поэтому я бы порекомендовал пока просто оставить его с более низкой заполняемостью, если только производительность не является неприемлемо низкой.

person Eric    schedule 25.11.2009
comment
Привет из будущего! Что-нибудь изменилось? Занятость, кажется, все еще имеет огромное значение. - person 3Dave; 08.06.2013
comment
Привет из будущего будущего! Занятость сейчас в моде. - person MaiaVictor; 09.06.2016

В этом примере показано, как вычислить все сводные статистические данные " в одном сокращении с Thrust. В другом примере показано, как вычислить гистограмму с помощью thrust::sort.

person wnbell    schedule 09.10.2010

Объем работы, которую вы выполняете, относительно невелик, поэтому вам, вероятно, следует придерживаться четырех блоков. Сохранение данных локально для графического процессора для предыдущих/последующих ядер по-прежнему имеет преимущество.

Fermi позволит использовать параллельные ядра, и именно в этом случае вы получите наибольшую выгоду, поскольку вы можете запустить следующее ядро, чтобы занять оставшиеся SM во время выполнения этого ядра. Однако это предполагает, что между двумя ядрами нет никаких зависимостей - естественно, вы не сможете запустить новое ядро, зависящее от результата предыдущего ядра, до того, как предыдущее ядро ​​завершит свою работу.

person Tom    schedule 25.11.2009

Я не думаю, что вам нужны все 2048 поплавков сразу, и если вам нужно уменьшить, вы можете разделить массивы на разные части, а затем объединить результат в конце выполнения блока. Можете ли вы показать пример кода?

person fabrizioM    schedule 11.12.2009