我有一个我无法解决的问题。
问题如下。
CPP代码
const int dataSize = 65535;
const int category = 10;
float data[dataSize][category];
const float threshold = 0.5f;
int cnt = 0;
// data array contains any values
for(int i=0;i<dataSize;i++)
{
if( data[i][9] > threshold )
{
data[cnt][0] = data[i][0];
data[cnt][1] = data[i][1];
data[cnt][2] = data[i][2];
data[cnt][3] = data[i][3];
data[cnt][4] = data[i][4];
data[cnt][5] = data[i][5];
data[cnt][6] = data[i][6];
data[cnt][7] = data[i][7];
data[cnt][8] = data[i][8];
data[cnt][9] = data[i][9];
cnt++;
}
}
通过使用此代码,我希望“数据”数组的元素被收集到超过阈值。(未超过阈值的元素对我来说并不重要。重要的是刚刚超过阈值。)
我想要在 CUDA 中以相同结果运行的代码。
所以我试着这样做。
CUDA 代码
__global__ void checkOverThreshold(float *data, float threshold, int *nCount)
{
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if( data[idx*10+9] > threshold )
{
data[nCount+0] = data[idx*10+0];
data[nCount+1] = data[idx*10+1];
data[nCount+2] = data[idx*10+2];
data[nCount+3] = data[idx*10+3];
data[nCount+4] = data[idx*10+4];
data[nCount+5] = data[idx*10+5];
data[nCount+6] = data[idx*10+6];
data[nCount+7] = data[idx*10+7];
data[nCount+8] = data[idx*10+8];
data[nCount+9] = data[idx*10+9];
atomicAdd( nCount, 1);
}
}
....
// kernel function call
checkOverThreshold<<< dataSize / 128, 128 >>>(d_data, treshold, d_count);
但是 CUDA 代码的结果并不是我所期望的。
它包含很多垃圾价值,甚至结果与CPP的不一样。
我认为 nCount 变量的同步问题造成了这种情况。
但是,我不知道如何解决这个问题。
请帮助我的代码。先感谢您。