2011-11-15 19 views
1

私は自分のコードをデバッグしようとしていました。何かがカーネルでうまくいかないことを知っています。私はカーネルにステップインしようとした場合、完全にカーネル関数をステップオーバーしているようだ、と最終的に辞職にエラーが発生します。カーネルでCUDA-GDBがクラッシュする

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

、resondしてください!前もって感謝します!

答えて

1

私はあなたが1枚のカード構成を持っているとします。あなたがcudaカーネルをデバッグしているときに、その中でブレークすると、ディスプレイドライバが効果的に一時停止します。それはあなたがクラッシュだと思うものを引き起こします。 cuda-gdbを1つのグラフィックスカードでのみ使用する場合は、コマンドラインモードで使用する必要があります(Xを起動しないでください。あるいは、Xからctrl-alt-fnを押してください)。

カードが2枚ある場合は、ディスプレイを実行していないカードでコードを実行する必要があります。 cudaSelectDevice(n)を使用してください。

+0

ありがとうございました!それは理にかなっていますが、コマンドラインモードでどのように使用するのですか?私はそれが私がやっていることだと思います。私はコマンドラインからcuda-gdb a.outを実行しています。私はどのようにそれをやっていますか? – Izri

+0

おそらくデスクトップ環境の中で端末を開くだけです。 ctrl-alt-f1を押すと、あなたはデスクトップ環境の外でコマンドライン(私はそれがコンソールと呼ばれる)に行きます。返すには、Ctrl-Alt-F7を押してください。 – jmsu

関連する問題