3

考えられるすべての解決策を列挙し、最良のものを見つけることで解決できるように見える問題があります。そのために、最適なソリューションが見つかった場合にそれを列挙して保存するバックトラッキングアルゴリズムを考案しました。これまでのところ正常に動作します。

さて、このアルゴリズムをCUDAに移植したかったのです。したがって、私はいくつかの明確な基本的なケースを生成するプロシージャを作成しました。これらの基本的なケースは、GPUで並行して処理する必要があります。CUDAスレッドの1つが最適な解決策を見つけた場合、他のすべてのスレッドは、もちろん、作業を停止できます。

そこで、次のようなものが必要でした。最適なソリューションを見つけるスレッドは、プログラムの実行中のすべてのCUDAスレッドを停止し、計算を終了する必要があります。

簡単に検索したところ、スレッドは同じブロック内にある場合にのみ通信できることがわかりました。(したがって、他の人がスレッドをブロックするのを止めることは不可能だと思います。)

私が考えることができる唯一の方法はoptimum_found、すべてのカーネルの先頭でチェックされる専用のフラグを持っていることです。最適なソリューションが見つかった場合、このフラグはに設定される1ため、将来のすべてのスレッドは、それらが機能する必要がないことを認識します。ただし、もちろん、すでに実行されているスレッドは、反復ごとにチェックしない場合、このフラグに気づきません。

それで、残りのすべてのCUDAスレッドを停止する可能性はありますか?

4

3 に答える 3

5

専用フラグを設定する方法は、それがグローバルメモリ内のメモリロケーションである場合に機能すると思います。そうすれば、あなたが言ったように、各カーネル呼び出しの開始時にこれをチェックすることができます。

カーネル呼び出しは一般的に比較的短いはずです。したがって、それらのスレッドの1つによって最適なソリューションが見つかったとしても、バッチ内の他のスレッドを終了させて​​も、パフォーマンスにそれほど影響を与えることはありません。

そうは言っても、他のアクティブに実行されているスレッドを強制終了できるCUDA呼び出しはないと確信しています。

于 2010-09-17T18:20:52.493 に答える
1

イアンはここで正しい考えを持っていると思います。最適なパフォーマンスは、最小限のメモリ転送と分岐によってもたらされます。グローバルメモリへの書き込みとフラグのチェック(分岐)は、CUDAのベストプラクティスガイドに反し、スピードアップを低下させます。

于 2010-09-20T02:22:30.900 に答える
0

コールバックを見たいと思うかもしれません。メインCPUスレッドは、すべてのスレッドが正しい順序で実行されることを確認できます。CPUコールバックスレッド(読み取り:後処理)は、追加のオーバーヘッドを実行し、関連するapi関数を呼び出し、すべてのサブスレッドデータを破棄できます...この機能はcudaサンプルにあり、cuda機能2でコンパイルされます。これがお役に立てば幸いです。

于 2015-04-04T17:24:56.860 に答える