嵌套for循环中的Cuda减少
Cuda reduction in nested for loops
我有一个关于CUDA中某种约简的问题。
distance
是具有gridSize*numberOfAngles
元素的矩阵,fftData
是具有numberOfAngles*NFFT
元素的矩阵。grid_magnitude
是我想要存储计算结果的结果矩阵,它具有gridSize
元素。
我想计算fftData
中对应于distance
中一个特定值的索引。之后,fftData
中该索引处的值被添加到对应的gridPoint
处的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++)
{
//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
没有任何更改。
我错过了什么?
我没能在完全并行的二维索引中做到这一点,也许我应该使用共享内存,但我如何将网格大小划分为线程部分使用?
我把代码改了一小部分。
__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]);
检测到访问违规的原因我看了一些关于这个问题的其他答案,比如这里和这里,但这些对我帮助不大。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 在已经使用Git的情况下减少编译时间
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 如何减少花费的时间
- CUDA内核和数学函数的显式命名空间
- C++减少modbus_connect超时
- CUDA Shuffle指导减少速度慢于减少共享记忆
- 为什么我在 CUDA 中实施总和减少时得到错误的结果?
- CUDA矢量减少以处理长度小于512的向量
- CUDA:在减少翘曲和易失性关键字中
- CUDA:最大限度地减少大型数据类型的银行冲突
- "官方"CUDA 减少功能不能接受某些数字?
- 迭代第二个周期,CUDA 中的总和减少
- 减少具有多个阵列的共享内存上的 CUDA
- 嵌套for循环中的Cuda减少
- OpenCL:减少示例,并保留内存对象/将cuda代码转换为OpenCL
- 如果不能在条件分支中调用 CUDA,如何在 CUDA 中减少__syncthreads?
- Mathematica/CUDA减少执行时间