CUDA-GDB在内核中崩溃

CUDA-GDB在内核中崩溃,cuda,cuda-gdb,Cuda,Cuda Gdb,我一直在尝试调试我的代码,因为我知道内核中出现了一些问题,我一直在尝试找出具体的原因。如果我尝试进入内核,它似乎完全跳过了内核函数,最终会在退出时导致错误: Single stepping until exit from function dyld_stub_cudaSetupArgument, which has no line number information. [Launch of CUDA Kernel 0 (incrementArrayOnDevice<<<(

我一直在尝试调试我的代码,因为我知道内核中出现了一些问题,我一直在尝试找出具体的原因。如果我尝试进入内核,它似乎完全跳过了内核函数,最终会在退出时导致错误:

Single stepping until exit from function dyld_stub_cudaSetupArgument, 
which has no line number information. 
[Launch of CUDA Kernel 0 (incrementArrayOnDevice<<<(3,1,1),(4,1,1)>>>) on 
Device 0] 
[Termination of CUDA Kernel 0 (incrementArrayOnDevice<<<(3,1,1), 
(4,1,1)>>>) on Device 0] 
[Launch of CUDA Kernel 1 (fillinBoth<<<(40,1,1),(1,1,1)>>>) on Device 0] 
[Termination of CUDA Kernel 1 (fillinBoth<<<(40,1,1),(1,1,1)>>>) on Device 0] 
add (below=0x124400, newtip=0x124430, newfork=0x125ac0) at test.cu:1223 
单步执行,直到退出函数dyld\u stub\u cudaSetupArgument,
它没有行号信息。
[在上启动CUDA内核0(incrementArrayOnDevice)
设备0]
[在设备0上终止CUDA内核0(incrementArrayOnDevice)]
[在设备0上启动CUDA内核1(fillinBoth)]
[在设备0上终止CUDA内核1(fillinBoth)]
在测试中添加(低于=0x124400,newtip=0x124430,newfork=0x125ac0)。cu:1223
如果我试图破坏内核,我的整个计算机就会崩溃,我必须重新启动它

我想我调用内核的方式一定有问题,但我不知道是什么

代码相当长,因此我只包含其中的一个摘录:

__global__ void fillinOne(seqptr qset, long max) {
    int i, j;
    aas aa;
    int idx = blockIdx.x;
    __shared__ long qs[3];
    if(idx < max) 
    {
        memcpy(qs, qset[idx], sizeof(long[3]));
        for (i = 0; i <= 1; i++)
        {
            for (aa = ala; (long)aa <= (long)stop; aa = (aas)((long)aa + 1))
            {
                if (((1L << ((long)aa)) & qs[i]) != 0)
                {
                    for (j = i + 1; j <= 2; j++)
                        qs[j] |= cudaTranslate[(long)aa - (long)ala][j - i];
                }
            }
        }
    }
}

//Kernel for left!= NULL and rt != NULL

void fillin(node *p, node *left, node *rt)
{

    cudaError_t err = cudaGetLastError();
    size_t stepsize = chars * sizeof(long);
    size_t sitesize = chars * sizeof(sitearray);
    //int i, j;
    if (left == NULL)
    {
        //copy rt->numsteps into p->numsteps--doesn't actually require CUDA, because no computation to do
        memcpy(p->numsteps, rt->numsteps, stepsize);
        checkCUDAError("memcpy");

        //allocate siteset (array of sitearrays) on device
        seqptr qsites;    //as in array of qs's
        cudaMalloc((void **) &qsites, sitesize);
        checkCUDAError("malloc");

        //copy rt->siteset into device array (equivalent to memcpy(qs, rs) but for whole array)
        cudaMemcpy(qsites, rt->siteset, sitesize, cudaMemcpyHostToDevice);
        checkCUDAError("memcpy");

        //do loop in device
        int block_size = 1; //each site operated on independently
        int n_blocks = chars;
        fillinOne <<< n_blocks, block_size>>> (qsites, chars);
        cudaThreadSynchronize();

        //put qset in p->siteset--equivalent to memcpy(p->siteset[m], qs)
        cudaMemcpy(p->siteset, qsites, sitesize, cudaMemcpyDeviceToHost);
        checkCUDAError("memcpy");

       //Cleanup
       cudaFree(qsites);
}
\uuuuu全局\uuuuuu无效填充单(seqptr qset,最大长度){
int i,j;
原子吸收分光光度法;
intidx=blockIdx.x;
__共享长qs[3];
if(idxsiteset,sitesize,cudamemcpyhostodevice);
检查CUDAERROR(“memcpy”);
//do环路装置
int block_size=1;//每个站点独立运行
int n_块=字符;
fillinOne>(碳、碳);
cudaThreadSynchronize();
//将qset放入p->siteset——相当于memcpy(p->siteset[m],qs)
cudaMemcpy(p->siteset,qsites,sitesize,cudaMemcpyDeviceToHost);
检查CUDAERROR(“memcpy”);
//清理
cudaFree(qsites);
}

如果有人有任何想法,请回复!提前谢谢!

我想你有一个单卡配置。当你调试cuda内核时,你破坏了它,你会有效地暂停显示驱动程序。这会导致你认为的崩溃。如果你想只使用一个图形卡的cuda gdb,你必须使用它n命令行模式(不启动X或从X按ctrl-alt-fn)


如果您有两张卡,则必须在不运行显示器的卡中运行代码。使用CUDASELECT设备(n).

我想您有一个单卡配置。当您调试cuda内核并在内核内部中断时,会有效地暂停显示驱动程序。这会导致您认为的崩溃。如果您只想使用一个图形卡的cuda gdb,则必须在命令行模式下使用它(不要启动X或从X按ctrl-alt-fn)


如果您有两张卡,则必须在不运行显示器的卡中运行代码。使用CUDASELECT设备(n).

谢谢您的回复!这很有道理,但您是指在命令行模式下使用它吗?我想这就是我一直在做的。我一直在从命令行运行cuda gdb a.out。我应该怎么做?您可能只是在桌面环境中打开一个终端。如果按ctrl-alt-f1,您将转到命令行(我想这叫控制台)在桌面环境之外。要返回您,我想只需执行ctrl-alt-f7。感谢您的响应!这是有意义的,但您的意思是如何在命令行模式下使用它?我想这就是我一直在做的。我一直在从命令行运行cuda gdb a.out。我应该怎么做?您可能只是在桌面内打开一个终端顶部环境。如果按ctrl-alt-f1,则转到桌面环境之外的命令行(我认为它称为控制台)。要返回,我认为只需按ctrl-alt-f7。