OpenCL で一部のデータを長時間処理する必要があり、時間制限 (ドライバーが自動的に再起動する) のために、さまざまなパラメーターを使用してカーネルを何度も起動します。毎回約 50 Mb の同じデータを処理する必要があるため、一度だけコピーしたいと考えています。OpenCL に関する多くの記事やチュートリアルを読んだことがありますが、実行間でデータを保持する方法についてはわかりません。
重要な場合は、OpenCLTemplate という OpenCL の C# バインディングを使用します。
グローバル メモリ バッファーに保存したデータはすべて、GPU 上に保持されます。特別なことをする必要はありません。
いくつかの問題があります。
1) GPU に 50MB のデータを取得する方法 2) Windows では、長時間の計算を実行すると GPU ドライバーが頻繁にリセットされます 3) ~50MB の永続化メカニズム
考えられる答え 1a) 50M の OpenCL メモリ バッファを作成する 1b) データを GPU にエンキュー (書き込む) 1c) このバッファにカーネル引数を設定する 1d) GPU のグローバル メモリ内のカーネル引数としてデータにアクセスする
2) OpenCL ドライバー (グラフィックス) ドライバーがリセットされると、アプリケーションは終了します。システムがアプリケーションを強制終了する前にアプリケーションを強制終了し、アプリケーションを再起動するスクリプトを作成できます。スクリプトは、アプリを強制終了する前に中間結果を読み戻す必要があります。そうでなければ、あなたは決してコントロールすることはできません。Windows で Nvida Tesla GPU を使用して実行するか、Linux で実行する場合のみ、O/S がディスプレイが機能していないと考えてドライバーをリセットすることを回避できます。
3) MMAPed ファイルを使用して、50MB のデータと中間結果を永続化します。MMAPed ファイル アドレスを使用して、アプリケーションの OpenCL バッファを作成できます。
最後に、アプローチについて質問します。ドライバーのリセットの問題などにより、Windows と Linux で実行されます。PostgreSQL データベースと、すべての GPU カーネル実行が ACID であることを保証する独自の PgOpenCL を使用しても、Windows でドライバーのタイムアウトを解決する効果的な解決策を見つけることができませんでした。
すべてのカーネル実行に対して読み取り専用バッファーを保持し、結果を別のバッファーに入れることができないのはなぜですか?
読み取り元と同じバッファーに書き込む必要があると考える理由は何ですか?
私がオンラインで読んで理解したように、同時に実行できるカーネルは 1 つだけです。これは、1 つのパラメーター セットで開始できることを意味します。完了したら、新しいパラメーター セットを開始し、その実行中に 50mb を読み取ることができます。
ドライバーが再起動した場合 - これはエラー/例外が原因である可能性がありますか?