2010-08-04 3 views
4

В CUDA SDK имеется пример кода и презентационных слайдов для эффективного одномерного уменьшения. Я также видел несколько работ по реализации одномерных сокращений и префиксных сканирований в CUDA.Эффективное сокращение 2D-массива в CUDA?

Есть ли эффективный код CUDA для уменьшения плотности двухмерный массив? Было бы полезно оценить указатели на код или соответствующие документы.

ответ

1

Уменьшение матрицы может быть несколько проще для реализации, поскольку сокращение строк/столбцов вектора может быть выполнено независимо. Вы можете позволить каждому потоку обрабатывать столбец/строку (в зависимости от основной ориентации матрицы) и коалесцировать чтение в памяти. Я сомневаюсь, что вы можете купить большую производительность по сравнению с этим, не обращаясь к текстуре/постоянному кешу, где местность может стать важной.

+0

Итак, вы предполагаете, что я использую 1D потоковые блоки, сначала уменьшаю одно измерение массива, а затем уменьшаю полученный массив 1D? Одна из основных проблем эффективности заключается в том, что оба измерения в двумерном массиве, вероятно, меньше длины массива 1D, например. 4096x4096 против ~ 16M. Со схемой, подобной той, которую вы описываете, вы получаете меньше блоков потоков, меньше работы на поток и намного меньшее использование GPU в целом по сравнению с уменьшением 1D. –

+0

@ Bradford Larsen 64 поточных блоков потока - оптимальный размер. 4096 потребует 64 64-х мерных блоков, причем каждый поток уменьшает 4096 элементов без синхронизации. Этого должно быть достаточно, чтобы полностью использовать gpu и дать достаточно наложения для покрытия трафика памяти. – Anycorn

+0

Извините, но будут проблемы синхронизации из-за уменьшения операций между потоками в блоках и блоках в сетке. И если вы будете использовать такую ​​технику с простой сокращающейся операцией (например, sum или min ...), ядро ​​не сможет использовать весь GPU и пропускную способность. Должно быть больше блоков с более маленькими потоками. – KoppeKTop

4

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

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