2011-11-16 6 views
0

私はコードを実行すると完全に実行されますが、ビジュアルプロファイラで実行しようとすると初めて動作しますが、プログラムを7回実行したいと思われます。それが不特定の打ち上げ失敗の結果となる。なぜそれが起こるだろうか?私のコードは以下のようになり、私のエラーチェックでエラーが発生していることがわかります cudaMemcpy(p-> siteset、rsites、sitesize、cudaMemcpyDeviceToHost); (おそらく、memcpy11を検索してコード内で見つけるのが最も簡単です。上記の行になります)Cudaビジュアルプロファイラの不特定の起動失敗

プログラムは2回目に実行されたが、それをターミナルで何回も実行すれば、それはまったく問題ありません。誰が何が起こっているかもしれないと思い付くことができますか? ありがとう!

void fillin(node *p, node *left, node *rt) 
{ 
size_t stepsize = chars * sizeof(long); 
size_t sitesize = chars * sizeof(sitearray); 
seqptr lsites; 
    cudaMalloc((void **) &lsteps, stepsize); 

    checkCUDAError("malloc"); 
    cudaMalloc((void **) &lsites, sitesize); 
    checkCUDAError("malloc"); 
    cudaMemcpy(lsteps, left->numsteps, stepsize, cudaMemcpyHostToDevice); 
    checkCUDAError("memcpy7"); 
    cudaMemcpy(lsites, left->siteset, sitesize, cudaMemcpyHostToDevice); 
    checkCUDAError("memcpy8"); 
    steptr rsteps; 
    seqptr rsites; 
    cudaMalloc((void **) &rsteps, stepsize); 
    checkCUDAError("malloc"); 
    cudaMalloc((void **) &rsites, sitesize); 
    checkCUDAError("malloc"); 
    cudaMemcpy(rsteps, rt->numsteps, stepsize, cudaMemcpyHostToDevice); 
    checkCUDAError("memcpy9"); 
    cudaMemcpy(rsites, rt->siteset, sitesize, cudaMemcpyHostToDevice); 
    checkCUDAError("memcpy"); 
    //call kernel 
    int block_size = 1; 
    int n_blocks = chars; 
    fillinBoth <<<n_blocks, block_size>>> (lsteps, lsites, rsteps, rsites, chars); 
    cudaMemcpy(p->numsteps, rsteps, stepsize, cudaMemcpyDeviceToHost); 
    checkCUDAError("memcpy10"); 
    cudaMemcpy(p->siteset, rsites, sitesize, cudaMemcpyDeviceToHost); 
    checkCUDAError("memcpy11"); 
    cudaFree(rsites); cudaFree(rsteps); 
    cudaFree(lsites); cudaFree(lsteps); 
    checkCUDAError("free"); 
} 

}

__global__ void fillinBoth (steptr lsteps, seqptr lsite, steptr rsteps, seqptr rsite, long max){ 
boolean counted; 
aas aa; 
long s; 
long i, j, k, n; 
int idx = blockIdx.x; 
//reduce array references; may or may not be useful 
__shared__ long ls[3]; 
__shared__ long rs[3]; 
__shared__ long qs[3]; 
counted = false; 
k = 0; 
//computation from original program, but now need to do manual address calculation 
if(idx < max){ 
    for(i = 0; i < 3; i++){ 
     rs[i]=rsite[idx][i]; 
     ls[i]=lsite[idx][i]; 
    } 
    n = lsteps[idx] + rsteps[idx]; 
    counted = false; 
    for (i = 0; i <= 5; i++) { 
     if (k < 3) { 
      switch (i) { 

       case 0: 
        s = ls[0] & rs[0]; 
        break; 

       case 1: 
        s = (ls[0] & rs[1]) | (ls[1] & rs[0]); 
        break; 

       case 2: 
        s = (ls[0] & rs[2]) | (ls[1] & rs[1]) | (ls[2] & rs[0]); 
        break; 

       case 3: 
        s = ls[0] | (ls[1] & rs[2]) | (ls[2] & rs[1]) | rs[0]; 
        break; 

       case 4: 
        s = ls[1] | (ls[2] & rs[2]) | rs[1]; 
        break; 

       case 5: 
        s = ls[2] | rs[2]; 
        break; 
      } 
      if (counted || s != 0) { 
       qs[k] = s; 
       k++; 
       counted = true; 
      } else if (!counted) 
       n += cudaWeight[idx]; 
     } 
    } 
    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]; 
      } 
     } 
    } 
    rsteps[idx] = n; 
    for(i = 0; i < 3; i++) 
     rsite[idx][i]=qs[i]; 
} 

}

+1

cudamemchk' 'でコードを実行してみてください、それが境界メモリアクセスのうちのいくつかを報告するかどうかは。プロファイラインストゥルメントが実行されるたびに、コードリソースによって固有のプロファイラがコードによって破損する可能性があります。そうしないと、境界外アクセスが潜在する可能性があります。 – talonmies

+0

私はそれにcuda-memcheckを走らせてエラーが出ませんでした=========エラー概要:0エラー 他に何か問題がありますか? – Izri

答えて

1

プロファイルセッションの設定ですべてのカウンタを無効にしてください。また、 "temp_compute_profiler_1_1.csv"のようなすべてのファイルを作業フォルダから削除してください(プロファイル設定 "作業フォルダ"を参照してください。デフォルトでは実行ファイルの場所と同じです)。

同じエラー(CUDAオーバーOpenCLの)があります:http://www.khronos.org/message_boards/viewtopic.php?t=4324

関連する問題