计算二维阵列CUDA的平均值

计算二维阵列CUDA的平均值,cuda,gpu,gpgpu,Cuda,Gpu,Gpgpu,我需要使用CUDA计算2D数组的平均值,但我不知道如何继续。我开始做列缩减,然后我将得到结果数组的和,在最后一步我将计算平均值 要做到这一点,我需要立即完成设备的全部工作?或者我只是一步一步地做,每一步都需要往返于CPU和GPU。如果是2D阵列中所有元素的简单算术平均值,则可以使用推力: int* data; int num; get_data_from_library( &data, &num ); thrust::device_vector< int > iVe

我需要使用CUDA计算2D数组的平均值,但我不知道如何继续。我开始做列缩减,然后我将得到结果数组的和,在最后一步我将计算平均值


要做到这一点,我需要立即完成设备的全部工作?或者我只是一步一步地做,每一步都需要往返于CPU和GPU。

如果是2D阵列中所有元素的简单算术平均值,则可以使用推力:

int* data;
int num;
get_data_from_library( &data, &num );

thrust::device_vector< int > iVec(data, data+num);

// transfer to device and compute sum
int sum = thrust::reduce(iVec.begin(), iVec.end(), 0, thrust::plus<int>());
double mean = sum/(double)num;
int*数据;
int-num;
从\u库中获取\u数据(&data,&num);
推力:设备_向量iVec(数据,数据+num);
//传输到设备并计算总和
int sum=threst::reduce(iVec.begin(),iVec.end(),0,threst::plus());
双平均值=总和/(双)数值;

如果您想编写自己的内核,请记住2D数组本质上是一个1D数组,分为行大小的块,并通过SDK“并行缩减”示例:

感谢@pSoLT给出您的答案,我对CUDA真的很陌生,我从您的答案中了解到,已经有内核可以做到这一点了?是的,它是优化的还是我可以做一个更好的内核?什么更好?使用这个还是创建我自己的内核?提前谢谢你,欢迎@alae。有一个名为的库,它基本上是一个基于STL的CUDA模板库。它允许您在一些典型问题中使用CUDA,而无需付出太多努力(您可能会注意到)<代码>推力算法是非常优化的,所以我怀疑使用自己的内核在减少数组方面能否取得更好的效果。这将是一个非常好的练习。非常感谢@pSoLT的回答,它非常清晰和准确^^