我用CUDA在GPU上实现了一个数值算法。首先,我设置gridDim< 32,1,1>和blockDim< 1,1,1>,程序在一行中抛出一个“Warp超出范围的地址”错误,其中只涉及一些基本的算术运算(我知道这个错误的报告位置不准确,我试图通过评论和排除搜索找出这个错误的准确位置,但似乎这个错误来自无处!)。
如果我改变gridDim< 32,1,1>的组合。和blockDim到< 32,1,1>,程序工作得很好!我还尝试了gridDim< 1,1,1>的组合。并且blockdim< 1,1,1>,该程序也可以正常工作。谁能告诉我一些可能的原因呢?
更新:我发现我的程序有可能崩溃,除非只启动一个线程。崩溃是不可预测的。 如果我启动多个线程,但只让一个线程执行内核函数,例如:
__global__ kernel<<<32, 32>>>{
int tid = blockDim.x * blockIdx.x + threadIdx.x;
if(tid != XXX)
return;
else{
...
}
}
我发现只有当XXX为0时我的程序才能保证成功运行。我想知道原因。执行内核函数的线程之间有什么区别吗?
答案 0 :(得分:1)
你正在计算错误。
tid计算如下:
int tid = blockIdx.x * blockDim.x + threadIdx.x;