CUDA:用求和结果填充矩阵

时间:2019-01-20 16:29:46

标签: c++ matrix cuda

我需要使用从下面的函数返回的值来填充矩阵

__device__ float calc(float *ar, int m, float sum, int i, int j)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < m)
  {

    ar[idx] = __powf(ar[idx], i + j);
    atomicAdd(&sum, ar[idx]);
  }
return sum;
}

矩阵设置为一维数组并通过此函数填充

__global__ void createMatrix(float *A, float *arr, int size)
{
    A[threadIdx.y*size + threadIdx.x] = /*some number*/;
}

理论上应该是这样

__global__ void createMatrix(float *A, float *arr, int size)
{
    float sum = 0;
    A[threadIdx.y*size + threadIdx.x] = calc(arr, size, sum, threadIdx.x, threadIdx.y);
}

但是它不能那样工作, calc 总是返回0。我可以使用 global 函数填充矩阵吗?预先感谢。

1 个答案:

答案 0 :(得分:1)

您正在传递sum by value rather than by reference。因此,您所有的atomicAdd()对内核中的零初始化值都没有影响。

但是,即使您通过引用传递它,它仍然是一个设计不良的内核。您会发现,如果您具有每个线程的sum变量,则不需要原子。另外,您的calc()函数仅向每个和值添加一个一次值,而您似乎希望它会多次添加。