对CUDA“Warp Out-of-range Address”错误感到困惑

时间:2012-03-01 02:06:50

标签: cuda gpu

我用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时我的程序才能保证成功运行。我想知道原因。执行内核函数的线程之间有什么区别吗?

1 个答案:

答案 0 :(得分:1)

你正在计算错误。

tid计算如下:

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