Cuda减少嵌套for循环

时间:2013-07-12 10:47:33

标签: c++ cuda nested-loops reduction

我对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部分地用于线程?

1 个答案:

答案 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]);检测到访问冲突的原因 我查看了有关此问题的其他一些答案,例如herehere,但这些对我没什么帮助。