Cuda сокращение вложенных для петель

У меня есть проблема, касающаяся какого-то сокращения CUDA.

distance это матрица с gridSize*numberOfAngles элементы, fftData это матрица с numberOfAngles*NFFT элементы. grid_magnitude является матрицей результатов, где я хочу сохранить свой результат расчета, и он имеет gridSize элементы.

Я хочу рассчитать индекс в fftData что соответствует одному конкретному значению в distance, После этого значение по этому индексу в 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 для частичного использования потоками?

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]);
Я посмотрел на некоторые другие ответы об этой проблеме, как Вот а также Вот, но это мне не очень помогло.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]