“对CUDA感到困惑”;“扭曲超出范围地址”;错误

“对CUDA感到困惑”;“扭曲超出范围地址”;错误,cuda,gpu,Cuda,Gpu,我用CUDA在GPU上实现了一个数值算法。首先,我设置了gridDim和blockDim,程序在只涉及一些基本算术运算的行中抛出了一个“扭曲超出范围地址”错误(我知道报告的错误位置不准确,我试图通过评论和排除搜索来找出错误的准确位置,但似乎这个错误不知从何而来!) 如果我把gridDim和blockDim的组合改为,程序运行得很好!我也尝试过gridDim和blockDim的组合,程序也运行得很好。有人能告诉我一些可能的原因吗 更新:我发现我的程序有可能崩溃,除非只有一个线程启动。崩溃是不可预

我用CUDA在GPU上实现了一个数值算法。首先,我设置了gridDim和blockDim,程序在只涉及一些基本算术运算的行中抛出了一个“扭曲超出范围地址”错误(我知道报告的错误位置不准确,我试图通过评论和排除搜索来找出错误的准确位置,但似乎这个错误不知从何而来!)

如果我把gridDim和blockDim的组合改为,程序运行得很好!我也尝试过gridDim和blockDim的组合,程序也运行得很好。有人能告诉我一些可能的原因吗


更新:我发现我的程序有可能崩溃,除非只有一个线程启动。崩溃是不可预测的。 如果我启动了多个线程,但只让一个线程执行内核函数,例如:

__global__ kernel<<<32, 32>>>{
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    if(tid != XXX)
        return;
    else{
        ...
    }

}
全局内核{
int tid=blockDim.x*blockIdx.x+threadIdx.x;
如果(tid!=XXX)
回来
否则{
...
}
}

我发现只有当XXX为0时,我的程序才能保证成功运行。我想知道原因。执行内核函数的线程之间有什么不同吗?

您计算的tid错误

tid的计算方法如下:


int tid=blockIdx.x*blockDim.x+threadIdx.x;

\uuuuuu global\uuuuuu内核{
这是无效语法。内核声明使用
\uuuu global\uuuuuuu
说明符,但使用执行配置(
)只能在内核调用时使用,即从主机代码调用内核时。请阅读CUDA编程指南或查看一些示例。如果要显示一些代码,请显示您正在使用的实际代码。您所显示的是不可编译的废话,对获取和回答您的问题完全没有帮助。比谢谢你的所有建议。但是我的程序有几千行代码,一些细节与问题无关。我只是想通过排除不重要的细节使问题更容易理解。无论如何,我会记住你的建议,并努力使我的问题既有意义又易于理解。再次感谢你是说你有一个包含数千行代码的内核吗?如果是这样,你就不能通过注释代码块开始调试,直到你分离出导致错误的代码吗?@talonmies是的,对于所有的子程序,我的内核的代码量是巨大的。我已经尝试过了,但是我发现错误很难确定。cuda gdb使一行代码崩溃,我对崩溃的代码进行了注释,cuda gdb在另一行崩溃。如果我在该行前面添加一些垃圾代码,错误的位置会改变。即使我在另一个地方打印一些单词,位置也会改变!我很沮丧。我想这可能是内存管理的错误,因为我使用CUDAMLARE()太多分散的数组。但是我找不到解决的办法。谢谢你指出我的错误。我在这里犯了一个拼写错误。HoRayay9:你是说这个答案解决了你的问题。如果是的话,请考虑。@ TalnMies对不起,但是我在我的程序代码中实现了。仍然在寻找bug。