我有一个关于减少 CUDA 的问题。
distance
是一个有gridSize*numberOfAngles
元素的矩阵,fftData
是一个有numberOfAngles*NFFT
元素的矩阵。grid_magnitude
是我要存储计算结果的结果矩阵,它有gridSize
元素。
我想计算fftData
对应于 中的一个特定值的索引distance
。之后,这个索引 in 处的值fftData
被添加到grid_magnitude
对应的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
.
我错过了什么?
我没有设法在完全并行的二维索引中做到这一点,也许我应该使用共享内存,但是如何将 grid_magnitude 部分分配给线程使用?