代码不起作用。但是,当我在以下代码中评论atomicAdd
时,代码可以正常工作。
原因是什么?
我在哪里可以得到浮点数组的直方图代码?
__global__ void calculateHistogram(float *devD, int* retHis)
{
int globalLi = getCurrentThread(); //get the thread ID
if(globalLi>=0 && globalLi<Rd*Cd*Dd)
{
int r=0,c=0,d=0;
GetInd2Sub(globalLi, Rd, Cd, r, c, d); //some calculations to get r,c,d
if(r>=stYd && r<edYd && c>=stXd && c<edXd && d>=stZd && d<edZd)
{
//calculate the histogram
int indexInHis = GetBinNo(devD[globalLi]); //get the bin number in the histogram
atomicAdd(&retHis[indexInHis],1); //when I comment this line the code works
}
}
}
答案 0 :(得分:3)
看看Jason Sanders和Edward Kandrot的 CUDA by Example 的第9章。它涵盖了原子,并通过一个简单的例子来计算8位整数的直方图。第一个版本为每个值使用原子添加,但是效果很慢。该示例的精炼版本为共享内存中的每个块计算直方图,然后将所有直方图合并到全局内存中以获得最终结果。您的代码就像第一个版本一样,一旦您开始工作,您将希望使其更像快速精炼版本。
您可以从书中下载示例,查看两个版本:CUDA by Example downloads
您似乎没有提供完整的代码或错误消息,因此我无法确切地说出您的代码中出现了什么问题。以下是一些想法:
retHis
的有效范围之外提供bin编号,我会在使用返回值之前添加一些检查,至少在调试时