比方说,我有一个值为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]++;
}
}
所以我最终得到矩阵中的一些数量。我知道,这是一个非常简单的例子,但如果这可能,那么其他变种......
答案 0 :(得分:4)
CUDA有高度优化的库,可以执行这些类型的操作,称为缩减。查看CUDA Thrust或CUB。在Thrust中,您可以使用reduce
来汇总所有值,或使用count
来计算特定值的实例数。
答案 1 :(得分:0)
如果你真的想这样做。您应该使用原子添加:atomicadd。 atomicadd(count[0],1)
但这可能会导致性能问题。