我需要使用从下面的函数返回的值来填充矩阵
__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 函数填充矩阵吗?预先感谢。
答案 0 :(得分:1)
您正在传递sum
by value rather than by reference。因此,您所有的atomicAdd()
对内核中的零初始化值都没有影响。
但是,即使您通过引用传递它,它仍然是一个设计不良的内核。您会发现,如果您具有每个线程的sum
变量,则不需要原子。另外,您的calc()
函数仅向每个和值添加一个一次值,而您似乎希望它会多次添加。