我已经启动了一个包含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)。
我哪里错了? 谢谢你的帮助!
答案 0 :(得分:2)
要计算块的部分结果的最终总和,我建议按以下方式进行:
我假设每个块都有很多可以自行计算,这样就可以保证首先使用CUDA。
在你当前的状态---我认为你的内核可能有问题。在我看来,每个块都在汇总所有数据,返回最终结果,好像它是一个部分结果。
你提出的循环并没有多大意义。对于每个块,只有一个i
将执行某些操作。代码等同于简单编写:
currentErrors[threadIdx.x]=0;
currentErrors[threadIdx.x]+=globalError(mynet,myoutput);
除了一些不可预测的调度差异外。
请记住,块不同步执行。每个块都可以在任何其他块之前,期间或之后运行。
此外: