Скажем, у меня есть матрица со значениями 0 или 1. Это возможно в CUDA, чтобы сделать что-то вроде этого:
__global__ void kernel(float *matrix, float *count)
{
int row = blockIdx.y * blockDim.y + threadIdx.y;
int column = blockIdx.x * blockDim.x + threadIdx.x;
if (row >= MATRIXSIZE || column >= MATRIXSIZE)
{
return;
}
if (matrix[MATRIXSIZE * row + column] == 1)
{
count[0]++;
}
}
Поэтому я получаю в конце концов число единиц в матрице. Я знаю, это очень простой пример, но если это возможно, так и другие варианты...
Существуют высоко оптимизированные библиотеки для CUDA, которые выполняют эти типы операций, называемые сокращениями. Посмотрите на CUDA Thrust или CUB. В Thrust, вы можете использовать reduce
суммировать все значения или count
для подсчета количества экземпляров определенного значения.
Если вы действительно хотите это сделать. Вы должны использовать атомный add: atomicadd. atomicadd(count[0],1)
Но это может вызвать проблемы с производительностью.
atomicAdd(count, 1)
.
count[0]
адресовcount[0]
, вы можете построить вектор результата, который имеет размер вашей сетки, и каждый поток имеет свое собственное местоположение в этом векторе , так что вы можете сделать любую операцию с ним без вмешательства других потоков. Затем выполните сокращение над ним.