Разреженный массив в CUDA или OpenCL - PullRequest
2 голосов
/ 15 августа 2010

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

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

Ответы [ 3 ]

4 голосов
/ 15 августа 2010

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

__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 голос
/ 18 января 2011

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

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

1 голос
/ 15 августа 2010

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

...