0

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

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

我当然知道,在这个项目中,函数总是返回 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)。

我哪里错了?感谢您的帮助!

4

1 回答 1

2

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

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

我假设每个块都有很多要自己计算的东西,这首先保证了 CUDA 的使用。

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

您提出的循环并没有真正意义。对于每个块,只有一个i会做某事。该代码将等同于简单地编写:

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

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

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


还:

于 2012-08-19T10:09:21.440 回答