【发布时间】:2013-07-12 10:47:33
【问题描述】:
我有一个关于 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 没有任何更改。
我错过了什么?
我没有设法在完全并行的二维索引中做到这一点,也许我应该使用共享内存,但我如何将 grid_magnitude 部分分配给线程使用?
【问题讨论】:
-
你确定内核已经执行了吗?您是否对所有 CUDA 调用进行了正确的错误检查?
-
是的,你是对的,但这看起来很奇怪。内核执行后我做了 if ( cudaSuccess != cudaGetLastError() ){ cout
-
内核启动是异步的,内核执行过程中的错误将在稍后由于某些其他CUDA函数调用而报告。
-
所以这就是为什么最后一个错误不是cudaSuccess而是0的原因。但是为什么内核崩溃了?
-
0 表示 cudaSuccess。我不确定内核是否崩溃,我只是说这是一种可能性。能否提供一个完整的代码示例来重现问题?
标签: c++ cuda nested-loops reduction