我对CUDA的某种减少有一个问题。
distance
是一个包含gridSize*numberOfAngles
元素的矩阵,fftData
是一个带有numberOfAngles*NFFT
元素的矩阵。 grid_magnitude
是结果矩阵,我想存储我的计算结果,并且它有gridSize
个元素。
我想计算fftData
中与distance
中某个特定值对应的索引。之后,fftData
中此索引处的值将添加到相应grid_magnitude
的{{1}}。
到目前为止,这是我的代码:
gridPoint
__global__ void calcBackProjection(cuFloatComplex* fftData,
cuFloatComplex* grid_magnitude,
float* distance,
int gridSize,
int numberOfAngles,
float rangeBin,
int NFFT)
{
int gridPointIdx = threadIdx.x + blockIdx.x*blockDim.x;
while(gridPointIdx < gridSize)
{
for(int angleIdx = 0; angleIdx < numberOfAngles; angleIdx++)
{
//find rangeBin in fftData corresponding to distance
float curDistance = distance[gridPointIdx + angleIdx*gridSize];
int wantedIdx = floor(curDistance / rangeBin);
if(wantedIdx < NFFT)
{
grid_magnitude[gridPointIdx + angleIdx*gridSize] =
addCmplx(fftData[wantedIdx + angleIdx*NFFT], grid_magnitude[gridPointIdx +
angleIdx*gridSize]);
}
}
gridPointIdx += blockDim.x * gridDim.x;
}
}
对于每个线程都应该是唯一的,因此每个线程应该在gridPointIdx
中的不同位置写入。但似乎这不起作用,因为grid_magnitude
没有改变。
我错过了什么?
我没有设法在完全并行的二维索引中执行此操作,也许我应该使用共享内存,但是如何将grid_magnitude部分地用于线程?
答案 0 :(得分:1)
我改变了代码。
__global__ void calcBackProjection(cuFloatComplex* fftData, cuFloatComplex* grid_magnitude,
float* distance, int gridSize, int numberOfAngles, float rangeBin, int NFFT){
int gridPointIdx = threadIdx.x + blockIdx.x*blockDim.x;
while(gridPointIdx < gridSize){
for(int angleIdx = 0; angleIdx < numberOfAngles; angleIdx++){
float curDistance = distance[gridPointIdx + angleIdx*gridSize];
int wantedIdx = ceil(curDistance / rangeBin) - 1;
if(wantedIdx){
int fftIdx = wantedIdx + angleIdx*NFFT;
int gridIdx= gridPointIdx + angleIdx*gridSize;
if((fftIdx < NFFT*numberOfAngles) && (gridIdx < gridSize*numberOfAngles)){
grid_magnitude[gridIdx] = cuCaddf(fftData[fftIdx], grid_magnitude[gridIdx]);
}
}
}
gridPointIdx += blockDim.x * gridDim.x; }}
问题似乎是,编译器不会评估变量curDistance和wantedIdx。当我想知道这些值时,它说“在目标位置没有价值”。这似乎是grid_magnitude[gridIdx] = cuCaddf(fftData[fftIdx], grid_magnitude[gridIdx]);
检测到访问冲突的原因
我查看了有关此问题的其他一些答案,例如here和here,但这些对我没什么帮助。