1

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

4

1 回答 1

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 和 WantIdx。当我想知道这些值时,它会说“在目标位置没有价值”。这似乎是在grid_magnitude[gridIdx] = cuCaddf(fftData[fftIdx], grid_magnitude[gridIdx]); 我查看有关此问题的其他一些答案时检测到访问冲突的原因,例如此处此处,但这些对我没有太大帮助。

于 2013-07-16T09:02:41.740 回答