В CUDA SDK имеется пример кода и презентационных слайдов для эффективного одномерного уменьшения. Я также видел несколько работ по реализации одномерных сокращений и префиксных сканирований в CUDA.Эффективное сокращение 2D-массива в CUDA?
Есть ли эффективный код CUDA для уменьшения плотности двухмерный массив? Было бы полезно оценить указатели на код или соответствующие документы.
Итак, вы предполагаете, что я использую 1D потоковые блоки, сначала уменьшаю одно измерение массива, а затем уменьшаю полученный массив 1D? Одна из основных проблем эффективности заключается в том, что оба измерения в двумерном массиве, вероятно, меньше длины массива 1D, например. 4096x4096 против ~ 16M. Со схемой, подобной той, которую вы описываете, вы получаете меньше блоков потоков, меньше работы на поток и намного меньшее использование GPU в целом по сравнению с уменьшением 1D. –
@ Bradford Larsen 64 поточных блоков потока - оптимальный размер. 4096 потребует 64 64-х мерных блоков, причем каждый поток уменьшает 4096 элементов без синхронизации. Этого должно быть достаточно, чтобы полностью использовать gpu и дать достаточно наложения для покрытия трафика памяти. – Anycorn
Извините, но будут проблемы синхронизации из-за уменьшения операций между потоками в блоках и блоках в сетке. И если вы будете использовать такую технику с простой сокращающейся операцией (например, sum или min ...), ядро не сможет использовать весь GPU и пропускную способность. Должно быть больше блоков с более маленькими потоками. – KoppeKTop