2012-03-28 10 views
11

これは私のCUDAコードの一部です。しかし、このコードの最後の部分では、何らかのエラーメッセージが表示されます。CUDAエラーメッセージ:不明な起動エラー

unsigned int *mat_count; 
off_t *mat_position; 
unsigned int *matches_count; 
off_t *matches_position; 
...... 
cudaMalloc ((void **) &mat_count, sizeof(unsigned int)*10); 
cudaMalloc ((void **) &mat_position, sizeof(off_t)*10); 
...... 
matches_count = (unsigned int *)malloc(sizeof(unsigned int)*10); 
matches_position = (off_t *)malloc(sizeof(off_t)*10); 
for (i = 0 ; i < 10 ; i++) { 
    matches_count [i] = 0; 
    matches_position[i] = 0; 
} 
...... 
cudaMemcpy (mat_count, matches_count , sizeof(unsigned int)*10, cudaMemcpyHostToDevice); 
cudaMemcpy (mat_position, matches_position, sizeof(off_t)*10,  cudaMemcpyHostToDevice); 
...... 
match<<<BLK_SIZE,THR_SIZE>>>(
     reference_total, 
     indextable_total, 
     sequences, 
     start_sequence, 
     sequence_length, 
     end_sequence, 
     ref_base, 
     idx_base, 
     msk_base, 
     mat_count, 
     mat_position, 
     reference, 
     first_indexes, 
     seqmaskc 
     ); 
err=cudaGetLastError(); 
if(err!=cudaSuccess) 
{ 
printf("\n1 %s\n", cudaGetErrorString(err)); 
} 
err= cudaMemcpy (matches_count , mat_count, sizeof(unsigned int)*10, cudaMemcpyDeviceToHost); 
if(err!=cudaSuccess) 
{ 
printf("\n2 %s\n", cudaGetErrorString(err)); 
} 
err= cudaMemcpy (matches_position, mat_position, sizeof(off_t)*10, cudaMemcpyDeviceToHost); 
if(err!=cudaSuccess) 
{ 
printf("\n3 %s\n", cudaGetErrorString(err)); 
} 

次のコード部分では、「指定されていない起動エラー」というエラーメッセージが報告されました。 このエラーメッセージがなぜ報告されるのかわかりません。

err=cudaMemcpy (matches_position, mat_position, sizeof(off_t)*10, cudaMemcpyDeviceToHost); 
if(err!=cudaSuccess) 
{ 
printf("\n3 %s\n", cudaGetErrorString(err)); 
} 

以下は一致機能の一部です。

__global__ void match(...) 
{ 
    ...... 
reference_blk = (THR_SIZE * blockIdx.x + threadIdx.x) * 32 + reference; 
...... 
//-- added for parallize --// 
for (p = start_p ; p != last_p ; p++) { 
    for (s = start_sequence, sequence = sequences ; s != end_sequence ; 
      s++, sequence += sequence_bytes) { 
     ref_off = *(((unsigned int*)(idx_base)) + p); 

     shifted_in = 0; 

     if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) < 0){ 
      int shamt2 = (ref_off % 8 - first_indexes[s-start_sequence] % 8); 

      mask_buffer = *((unsigned long *)(msk_base + (ref_off - first_indexes[s-start_sequence])/8)) >> shamt2; 

      if(((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence)))^mask_buffer) << shamt2) continue; 
     } 
     else if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) == 0){ 
      mask_buffer = *((unsigned long *)(msk_base + (ref_off)/8)); 

      if((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence))^mask_buffer)) continue; 
     } 
     else{ 
      int shamt2 = 8 - (first_indexes[s-start_sequence] % 8 - ref_off % 8); 

      mask_buffer = *((unsigned long *)(msk_base + (ref_off/8- first_indexes[s-start_sequence]/8) - 1)) >> shamt2; 

      if(((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence)))^mask_buffer) << shamt2) continue; 
     } 

     //full compare 
     if((int)(first_indexes[s-start_sequence] % 4 - ref_off % 4) < 0){ 
      int shamt = (ref_off % 4 - first_indexes[s-start_sequence] % 4) * 2; 
      memcpy(reference_blk, ref_base + ref_off/4 - first_indexes[s-start_sequence]/4, sequence_bytes); 
      ...... 
      //-- instead of memcmp --// 
      int v = 0; 
      char *p1 = (char *)sequence; 
      char *p2 = (char *)reference_blk; 
      int tmp_asd = sequence_bytes; 
      while(tmp_asd!=0){ 
       v = *(p1++) - *(p2++); 
       if(v!=0) 
        break; 
       tmp_asd--; 
      } 

      if(v == 0){ 
       mat_count[s - (int)start_sequence]++;  /* Maintain count */ 
       mat_position[s - (int)start_sequence] = ref_off-first_indexes[s-start_sequence]; /* Record latest position */ 
      } 
     } 
     else if((int)(first_indexes[s-start_sequence] % 4 - ref_off % 4)== 0){ 
      memcpy(reference_blk, ref_base + ref_off/4 - first_indexes[s-start_sequence]/4, sequence_bytes); 
      ....... 
      //-- instead of memcmp --// 
      int v = 0; 
      char *p1 = (char *)sequence; 
      char *p2 = (char *)reference_blk; 
      int tmp_asd = sequence_bytes; 
      while(tmp_asd!=0){ 
       v = *(p1++) - *(p2++); 
       if(v!=0) 
        break; 
       tmp_asd--; 
      } 
      if(v == 0){ 
       mat_count[s - (int)start_sequence]++;  /* Maintain count */ 
       mat_position[s - (int)start_sequence] = ref_off-first_indexes[s-start_sequence]; /* Record latest position */ 
      } 
     } 
     else 
     { 
      int shamt = 8 - (first_indexes[s-start_sequence] % 4 - ref_off % 4) * 2; 

      memcpy(reference_blk, ref_base + ref_off/4 - first_indexes[s-start_sequence]/4 - 1, 32); 
      ...... 
      //-- instead of memcmp --// 
      int v = 0; 
      char *p1 = (char *)sequence; 
      char *p2 = (char *)reference_blk; 
      int tmp_asd = sequence_bytes; 
      while(tmp_asd!=0){ 
       v = *(p1++) - *(p2++); 
       if(v!=0) 
        break; 
       tmp_asd--; 
      } 

      if (v == 0){ 
       mat_count[s - (int)start_sequence]++;  /* Maintain count */ 
       mat_position[s - (int)start_sequence] = ref_off-first_indexes[s-start_sequence];/* Record latest position */ 
      } 
     } 
    } 
} 

}

+0

? –

+0

BLK_SIZEとTHR_SIZEは1です。 – Jimmy

+0

カーネル関数 'match'のコードを投稿する必要があるかもしれません –

答えて

30

未指定の打ち上げ失敗は、ほとんど常にセグメンテーション違反です。あなたはおそらくグローバルメモリにアクセスしている間に、カーネルのどこかでインデックスミスをしています。

私はあなたのコードに目を通すだろうが、それは穏やかに不可解だ...

22

nvcc -G -gデバッグフラグを使用してアプリケーションをコンパイルし、cuda-memcheckまたはcuda-gdb内のアプリケーションを実行してみてください。問題があるかもしれないヒントを与えるかもしれません。

ジャスト実行 `BLK_SIZE`と` THR_SIZE`の値であり、どのような

cuda-memcheck ./yourApp 
関連する問題