0

このような2つのcudaカーネル関数があります

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

関数 a が開始された後、関数 a が終了するまで待ってから関数 b を開始したいと考えています。だから私はこのように a と b の間に cudaThreadSynchronize() を挿入しました、

a<<<BLK_SIZE,THR_SIZE>>>(params,...);
err=cudaThreadSynchronize();
if( err != cudaSuccess)
    printf("cudaThreadSynchronize error: %s\n", cudaGetErrorString(err));
b<<<BLK_SIZE,THR_SIZE>>>(params,...);

ただし、cudaThreadSynchronize() はエラー コードを返します。the launch timed out and was terminated cuda error

どうすれば修正できますか?


簡単なコードの説明:

mmap(sequence file);
mmap(reference file);

cudaMemcpy(seq_cuda, sequence);
cudaMemcpy(ref_cuda,reference);

kernel<<<>>>(params); //find short sequence in reference
cudaThreadSynchronize();
kernel<<<>>>(params);

cudaMemcpy(result, result_cuda);
report result

カーネル関数には、比較の数を減らすためのパターン マッチング アルゴリズムの if-else を含む大きな for ループがあります。

4

1 に答える 1

1

この起動エラーは、最初のカーネルが起動されたとき、またはそれ以前に何か問題が発生したことを意味します。これを回避するには、すべての CUDA ランタイム呼び出しの出力でエラーをチェックしてみてください。また、cudaThreadSync を実行してから、すべてのカーネル呼び出しの後にエラー チェックを行います。これは、エラーが発生した最初の場所を見つけるのに役立ちます。

実際に起動に失敗した場合は、実行構成とカーネルのコードを調査して、エラーの原因を見つける必要があります。

最後に、cudaThreadSynchronize を追加したアクションがこのエラーを引き起こした可能性は非常に低いことに注意してください。これは、クエリの言い方が原因として cudaThreadSynchronize を指しているためです。この呼び出しが行ったことは、既存のエラーを以前にキャッチすることだけでした。

于 2012-03-28T07:09:34.710 に答える