CUDA-GDB вылетает в ядре - PullRequest
       60

CUDA-GDB вылетает в ядре

1 голос
/ 15 ноября 2011

Я пытался отладить свой код, так как я знаю, что что-то не так в ядре, и я пытался выяснить, что конкретно.Если я попытаюсь войти в ядро, оно, кажется, полностью перешагнет через функции ядра и в конечном итоге вызовет ошибку при выходе:

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 

И если я попытаюсь сломаться в Ядре, мой компьютер зависнет иЯ должен перезапустить его.

Я полагаю, что с тем, как я называю ядро, должно быть что-то не так, но я не могу понять, что.

Код довольно длинный,так что я только включаю отрывок из него:

__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);
}

Если у кого-то есть какие-либо идеи, пожалуйста, ответьте!Заранее спасибо!

1 Ответ

1 голос
/ 15 ноября 2011

Я полагаю, у вас есть одна конфигурация карты.Когда вы отлаживаете ядро ​​cuda и ломаете его, вы фактически ставите драйвер дисплея на паузу.Это вызывает то, что вы считаете крахом.Если вы хотите использовать cuda-gdb только с одной видеокартой, вы должны использовать ее в режиме командной строки (не запускайте X или не нажимайте ctrl-alt-fn из X).

Если у вас две картыВы должны запустить код на карте не работает дисплей.Используйте cudaSelectDevice (n).

...