【问题标题】:CUDA: Fill matrix with results of summationCUDA:用求和结果填充矩阵
【发布时间】:2019-06-14 04:01:10
【问题描述】:

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

__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 函数填充矩阵吗?提前致谢。

【问题讨论】:

    标签: c++ matrix cuda


    【解决方案1】:

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

    但是,即使您通过引用传递它,这仍然是一个设计不佳的内核。你看,如果你有一个每线程 sum 变量(你这样做),你就不需要原子。此外,您的 calc() 函数仅向每个总和值添加一个值 once,而您似乎希望它添加不止一次。

    【讨论】:

    • 我明白了,但是calc() 的功能应该如何正确呢?在用__powf(ar[idx], i + j); 映射后,必须减少arr 数组。我不确定如何实现。
    • 只需使用库中可用的缩减之一,如cubthrust,但使用输入迭代器在传递值之前应用幂函数。如果您需要更详细的解释,请阅读这些库缩减功能,如果没有帮助,请提出单独的问题。
    猜你喜欢
    • 2018-01-05
    • 2017-08-26
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多