3

CUDA カーネルを無期限に実行する必要があるアプリケーションに取り組んでいます。リストにstgを書き込み、gpuがそのリストを読み取ってリセットするCPUスレッドが1つあります(少なくとも開始時)。カーネル内で書くと

while(true)
{
//kernel code
}

システムがハングアップします。GPU がまだ処理中であることはわかっていますが、もちろん何も起こりません。また、リストでのリセットが発生するかどうかはわかりません。

計算に使用される GPU は表示には使用されないため、ウォッチドッグの問題はありません。

OS は Ubuntu 11.10 と cuda toolkit 4.1 です。無限カーネルを正常に作成するには、ヘルプ/例/リンクを使用できます。

4

2 に答える 2

2

CUDA プログラミング言語と CUDA アーキテクチャは現在、無限カーネルをサポートしていません。ロジャーの提案を検討することをお勧めします。

これを追求したい場合は、次のデバッグ コードをカーネルに追加することをお勧めします。

  1. N クロックごとに固定メモリ内の変数をインクリメントします (SM ごとに異なる場所が必要な場合があります)。
  2. CPU が更新できるメモリ位置を定期的に読み取り、カーネルに終了を指示します。

これはソフトウェア ウォッチドッグです。

(1) と (2) を実行する頻度を制御するには、clock() または clock64() を使用できます。

cuda-gdb を使用して問題をデバッグできます。

この言語では無限ループはサポートされていません。コンパイラがコードを削除している可能性があります。PTX と SASS を確認することをお勧めします。コンパイラが悪いコードを生成している場合は、有効な終了条件があるとコンパイラに思わせることで偽造できます。

于 2012-05-06T01:51:28.083 に答える