这样的事情在CUDA中是可能的

时间:2014-03-20 16:29:54

标签: c++ c cuda counter

比方说,我有一个值为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]++;
    }
}

所以我最终得到矩阵中的一些数量。我知道,这是一个非常简单的例子,但如果这可能,那么其​​他变种......

2 个答案:

答案 0 :(得分:4)

CUDA有高度优化的库,可以执行这些类型的操作,称为缩减。查看CUDA Thrust或CUB。在Thrust中,您可以使用reduce来汇总所有值,或使用count来计算特定值的实例数。

答案 1 :(得分:0)

如果你真的想这样做。您应该使用原子添加:atomicaddatomicadd(count[0],1)

但这可能会导致性能问题。