我有一个关于减少 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 部分分配给线程使用?