CUDA:全局内存变量的数据总和

时间:2012-08-18 23:04:24

标签: cuda sum

我已经启动了一个包含2100个块和每个块4个线程的内核。

在这个内核中,所有线程都必须执行一个函数,并将其结果放在一个数组(在全局内存中)到“threadIdx.x”位置。

我当然知道,在这个项目的fase中,函数总是返回1.012086。 现在,我已经编写了这段代码来实现这一目标:

currentErrors[threadIdx.x]=0;
for(i=0;i<gridDim.x;i++)
{
    if(i==blockIdx.x)
    {
        currentErrors[threadIdx.x]+=globalError(mynet,myoutput);
    }
}

但是当内核结束时,所有数组的位置都有1.012086作为值(而不是1.012086 * 2100)。

我哪里错了? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

要计算块的部分结果的最终总和,我建议按以下方式进行:

  • 让每个块将部分结果写入gridDim.x大小的数组的单独单元格中。
  • 将阵列复制到主机。
  • 在主持人身上执行最终金额。

我假设每个块都有很多可以自行计算,这样就可以保证首先使用CUDA。

在你当前的状态---我认为你的内核可能有问题。在我看来,每个块都在汇总所有数据,返回最终结果,好像它是一个部分结果。

你提出的循环并没有多大意义。对于每个块,只有一个i将执行某些操作。代码等同于简单编写:

currentErrors[threadIdx.x]=0;
currentErrors[threadIdx.x]+=globalError(mynet,myoutput);

除了一些不可预测的调度差异外。

请记住,块同步执行。每个块都可以在任何其他块之前,期间或之后运行。


此外: