OpenCL APIには「実行コンテキスト」の作成が含まれます。多くのAPI呼び出しでは、コンテキストとデバイスIDの両方が必要です。OpenCLコンテキストとは何ですか?なぜ彼らは理にかなっていますか?
しかし、これらはどのような用途ですか?一連のデバイスを使用してコンテキストを作成します。非常に人工的な構造ではありませんか?つまり、すべてのデバイスが共通のメモリ空間をあらかじめ定義されたコンテキストとして共有しているとしたら、それは意味をなさないと思います。しかし、そうでなければ、マルチデバイス関連のAPIはプラットフォームレベルで発生するのに対し、デバイス固有のOpenCL APIはコンテキストを完全に無視しないのはなぜですか?
あなたが「ああ、コンテキストにXがある、またはデバイスとプラットフォームにはない」と言えば、XやYがデバイスコンテキストやプラットフォームコンテキストにならない理由を説明してください。 clCreateContext reference page(OpenCLの1.2)リスト:
- コマンド・キュー:デバイス固有。
- メモリ:マルチデバイスでもかまいませんが、コンテキストへのデバイスの選択は任意であるため、正しい抽象化のようには見えません。
- プログラムとカーネルオブジェクト:これはデバイス固有ではないのはなぜですか?
- "コンテキストで指定された1つ以上のデバイスでカーネルを実行しています":デバイス特有のもの(またはプラットフォームの範囲)が間違っていないかどうかはわかりませんシンクロナイズより)。
PS-CUDAには「コンテキスト」もありますが、これらはスレッド固有でデバイス固有のもので、「同期時にはこのスレッドブロックを使用する必要がありますか?または「GPU作業のスケジューリング後にこのスレッドが収穫されるべきか」など)
CUDAは、常に同様のコンテキストの概念を持っています。このレベルの制御は、ドライバーのAPI http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CTX.html#group__CUDA__CTX_1g65dc0bc84810e2103a40d8e2cfによって与えられます。ランタイムAPIは、ドライバAPIがアクセスできる単一のコンテキストを保持します。複数のコンテキストの使用は、cudaDeviceResetを実行せずに1つを破棄する能力です。 –
@FlorentDUGUET:答えを編集しますが、それはデバイスごとのコンテキスト、つまり複数のコンテキスト<-> 1つのデバイスであり、複数ではありません<->複数のOpenCLのようです。また、これらのCUDAコンテキストはスレッド固有です。 – einpoklum
まあ、OpenCLは標準です。私は、Geminiの設計者や他の実装者があるレベルの共有メモリを享受したいときに、会議中に議論されたいくつかの機能のための余裕を残していると思います。私の知る限り、これはCUDAでは実装されていませんが、OpenCLは他の人によって実装されています。これは議論/意見に変わります。 –