У меня есть проблема, касающаяся какого-то сокращения 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 для частичного использования потоками?
Я поменял код буквально.
__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]);
Я посмотрел на некоторые другие ответы об этой проблеме, как Вот а также Вот, но это мне не очень помогло.
Других решений пока нет …