2010-08-15 3 views
2

У меня есть большой массив (скажем, 512K элементов), резидентный GPU, где нужно обрабатывать только небольшую часть элементов (например, 5K случайно распределенных элементов - множество S). Алгоритм для определения того, какие элементы принадлежат S, очень эффективен, поэтому я могу легко создать массив A указателей или индексов для элементов из набора S.Редкий массив в CUDA или OpenCL

Что такое наиболее эффективный способ запуска только ядра CUDA или OpenCL над элементами из S? Могу ли я запустить ядро ​​над массивом A? Все примеры, которые я видел до сих пор, касаются смежных 1D, 2D или 3D массивов. Есть ли проблема с введением одного слоя косвенности?

+0

Является ли массив массивным GPU-резидентным? Я помню, что скорость передачи на GPU не так велика, поэтому простое копирование A на графический процессор может сэкономить время, особенно если тест на A-версию равен O (1). – rampion

+0

Это резидент GPU (я отредактировал вопрос, чтобы отразить это). –

+0

Архитектура CUDA предоставляет различные виды памяти. Что вы используете? – karlphillip

ответ

4

В CUDA смежный (неслучайный) доступ к памяти является предпочтительным из-за возможного использования коалесценции памяти. Это не имеет большого значения, чтобы создать массив случайным образом распределенных индексов и проследовать один индекс от А на поток, что-то вроде этого:

__global__ kernel_func(unsigned * A, float * S) 
{ 
    const unsigned idx = threadIdx.x + blockIdx.x * blockDim.x; 
    const unsigned S_idx = A[idx]; 

    S[S_idx] *= 5; // for example... 
    ... 
} 

Но доступ к памяти для S [произвольного доступа] будет очень медленным (здесь будет наиболее возможное узкое место).

Если вы решили использовать CUDA, вы должны много экспериментировать с блоками/размерами сетки, минимизировать потребление в расчете на поток (чтобы увеличить количество блоков на мультипроцессор) и, возможно, сортировать A, чтобы использовать ближайший S_ind из ближайших потоков. .

1

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

1

Нет проблем с одним уровнем косвенности. Я использую эту сумму в моем собственном коде CUDA. Является ли набор S вероятным оставаться статическим с течением времени? Если это так, вполне может стоить генерировать поиск A, как вы сказали.

Кроме того, память текстур будет вашим другом в обеспечении местоположения кеша. Тип используемой текстуры (1D, 2D или 3D) будет зависеть от вашей проблемы.

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