2012-03-28 14 views
0

関数Aが開始した後、私はこのどのようにクーダカーネル機能の間で同期する?

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

のような2つのCUDAカーネルの機能を持って、私が終了するまで待ってから、関数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 

とカーネル関数では、比較の回数を減らすためのアルゴリズムをパターンマッチングのためのいくつかの場合には、他を含むループのための大きながあります。

+0

NvidiaのCUDAフォーラム(例:[起動がタイムアウトして終了しました](http://forums.nvidia.com/index.php?showtopic=189042))では、人々は長すぎるカーネルを指していますあなたのビデオディスプレイにも使用されているGPUで動くようにします。解決方法は、カーネルを短くするか、別のGPU(例えば、統合グラフィックス)を使用してディスプレイを駆動することです。 –

+0

あなたはどのオペレーティングシステムを使用していますか? – talonmies

+0

私はubuntuを使っています10.04 – enc

答えて

1

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

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

最後に、cudaThreadSynchronizeでの追加操作によってこのエラーが発生する可能性はほとんどありません。これは、あなたがクエリーポイントをcudaThreadSynchronizeに指定した方法が原因であるためです。この呼び出しはすべて、あなたの既存のエラーを早期にキャッチすることでした。

+0

aを呼び出す前にすべてのカーネル呼び出しをチェックしましたが、エラーはありませんでした。 "機能停止中に起動がタイムアウトして終了しました"エラーが発生する可能性がありますか? – enc

+0

Enc:はい、カーネルに何か問題があるはずです。実行コンフィギュレーションか、カーネル内部で何をしているか。 –

+0

Ashwinに感謝します。この状況についての推測はありますか?どちらがこの問題の原因かわかりません。私が認識していることの1つは、小さなデータ(〜10 MB)を使用するとうまくいくが、大きなデータ(数百MBが、グラフィックカードのメモリに収まる)を使用すると動作しないということです。 – enc

関連する問題