【问题标题】:Cuda kernel to calculate column mean of 2d arrayCuda内核计算二维数组的列平均值
【发布时间】:2019-06-14 07:55:21
【问题描述】:

我想创建一个内核,将两个 5x5 二维数组的列的平均值添加到第三个一维数组。

逻辑:

for(int j=0; j<N; j++)
{
    float suma = 0;

    for(int i=0; i<N; i++)
        suma += a[i][j] + b[i][j];

    c[j] = suma / N;    
    cout<<c[j]<<endl;
}

【问题讨论】:

  • 使用这样的列求和循环不需要二维网格。因此,您应该启动一维网格,并且您的线程检查应该是if (col &lt; 5)。为此,您只需要 5 个线程。您可以摆脱int row = ... 行。而不是这个:sum += a[col*5+i] + b[col*5+i](缺少分号)试试这个:sum += a[i*5+col] + b[i*5+col];c[row] = ... 不应该是 c[col] = ... 吗?如果这不能解决问题,那么您的代码或 CUDA 设置可能存在其他问题,并且至少应该提供minimal reproducible example
  • 感谢您的回复先生,我应用了您提供的更改,但现在在我看来它只添加了两个数组的第一行。如何也迭代其他行?
  • 您的代码中的其他地方可能有问题。内核本身不是minimal reproducible example。到目前为止,您显示的不是minimal reproducible example
  • 是的,问题出在 malloc 和 memset 上,所以我对它们进行了调整,现在它按预期工作了,非常感谢您的帮助
  • @StavrosSpiridis 考虑回答您自己的问题或将其删除以供将来参考

标签: arrays parallel-processing cuda


【解决方案1】:

计算?(1,?)=mean(?(:,?))+mean(?(:,?))的Cuda内核:

 __global__ void meanKernel(float *c,float *a, float *b)
{
   int col = blockIdx.x* blockDim.x + threadIdx.x;
   float sum = 0;
   if (col<N)
   {

       for (int i=0; i<N; i++){
        sum += a[i*5+col] + b[i*5+col];


       c[col] = sum/5;
       }
      }

 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多