2012-03-28 13 views
0

私はCUDAコードをプログラミングしました。CUDAが期待通りに機能しませんか?

unsigned long mask_buffer; 
int s; 
off_t p, 

for(p=0;p!=5000;p++) 
{ 
    for(s=start;s!=end;s++) 
    { 
     ref_off = *(((unsigned int*)(idx_base)) + p); 

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

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

     for (rp = last_rp ; rp != (unsigned long *) reference_blk ; rp--) 
     { 
      unsigned long tmp = ((*rp) & ((1 << shamt) - 1)) << (8 * sizeof(unsigned long) - shamt); 
      *rp = (*rp >> shamt) | shifted_in; 
      shifted_in = tmp; 
     } 

     *rp = (*rp >> shamt) | shifted_in; 

     if (sequence_length & 0x3) 
      reference_blk[sequence_length >> 2] &= (1 << ((sequence_length & 0x3) << 1)) - 1; 

     for (i = sequence_length >> 2 ; i & (SEQUENCE_ALIGN - 1) ; i++) 
      reference_blk[i] = 0; 

     //-- 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 */ 
     } 

    } 
} 

このforループは、私のコードの主な機能です。 しかし、問題は変数 "p"が5または6を超えて増加しないということです。 私のコンピュータにGT530があり、CUDAドライバのバージョンとランタイムバージョンも4.0です。 このコードの問題は何ですか?

+0

完全なコードを含めることができますか、またはコードの少なくとも一部に型を含めることができますか? –

+0

これ以上の文脈がなければ、私は非常に多くの助けを提供できるとは思わない。より多くのコードを貼り付けることは可能ですか? –

+0

自分のコードソースを編集してください – Jimmy

答えて

1

新しいコード編集前の元の投稿がそれを主張していたカーネルであると仮定すると、memcpyのような標準的なCライブラリ関数をCUDAカーネルの中で呼び出すことはできません(途中までコード)。カーネル内では__device__関数しか呼び出すことができません。 CUDAでmemcpyを再実装していない限り、カーネル内でその関数を呼び出すことはできません。

また、次の結果を確認する必要があるCUDAカーネルを作成しようとしている場合は、カーネルのメモリ比較セクションでやっているような、グループ内の他のスレッドが書いたものは、あなたのコードにいくつかの同期ポイントを入れて、すべてのスレッドが確実に特定のポイントに達したことを確認する必要がありますそれらのスレッドの結果をチェックし始めます。他のブロックがメインメモリに書き込まれている可能性のあるものをチェックしようとすると、その前のスレッドブロックの結果がメインメモリに確実に書き出されるようにするための同期プリミティブもあります。

+0

あなたの答えをありがとう。しかし、私のプログラムはまだ最終版ではありません。だから私は1つのブロックと1つのスレッドをシーケンシャルバージョンのようにこのコードを実行しようとしました。同期の問題は非常に重要な問題ですが、もっと重要な問題は今私が考える正しい問題です。そして私はmemcpyを別の方法に変換しようとします。 – Jimmy

+1

ところで、あなたはWindowsかLinuxですか?私が正しく思い出した場合、少なくとも2.xのようなCUDAの以前のバージョンでは、CUDAカーネルを実行しているカードでもWindowsのディスプレイドライバのタイムアウトにより、5秒間Windows CUDAカーネルを実行することはできませんWindowsデスクトップがその上に拡張されているので、単一のスレッドで実行している場合は、文字列のサイズに応じてこの制限に達している可能性があります。 – Jason

+0

私はLinux環境で作業しています。あなたの答えをありがとう – Jimmy

関連する問題