2016-07-26 8 views
1

OpenCL APIには「実行コンテキスト」の作成が含まれます。多くのAPI呼び出しでは、コンテキストとデバイスIDの両方が必要です。OpenCLコンテキストとは何ですか?なぜ彼らは理にかなっていますか?

しかし、これらはどのような用途ですか?一連のデバイスを使用してコンテキストを作成します。非常に人工的な構造ではありませんか?つまり、すべてのデバイスが共通のメモリ空間をあらかじめ定義されたコンテキストとして共有しているとしたら、それは意味をなさないと思います。しかし、そうでなければ、マルチデバイス関連のAPIはプラットフォームレベルで発生するのに対し、デバイス固有のOpenCL APIはコンテキストを完全に無視しないのはなぜですか?

あなたが「ああ、コンテキストにXがある、またはデバイスとプラットフォームにはない」と言えば、XやYがデバイスコンテキストやプラットフォームコンテキストにならない理由を説明してください。 clCreateContext reference page(OpenCLの1.2)リスト:

  • コマンド・キュー:デバイス固有。
  • メモリ:マルチデバイスでもかまいませんが、コンテキストへのデバイスの選択は任意であるため、正しい抽象化のようには見えません。
  • プログラムとカーネルオブジェクト:これはデバイス固有ではないのはなぜですか?
  • "コンテキストで指定された1つ以上のデバイスでカーネルを実行しています":デバイス特有のもの(またはプラットフォームの範囲)が間違っていないかどうかはわかりませんシンクロナイズより)。

PS-CUDAには「コンテキスト」もありますが、これらはスレッド固有でデバイス固有のもので、「同期時にはこのスレッドブロックを使用する必要がありますか?または「GPU作業のスケジューリング後にこのスレッドが収穫されるべきか」など)

+0

CUDAは、常に同様のコンテキストの概念を持っています。このレベルの制御は、ドライバーのAPI http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CTX.html#group__CUDA__CTX_1g65dc0bc84810e2103a40d8e2cfによって与えられます。ランタイムAPIは、ドライバAPIがアクセスできる単一のコンテキストを保持します。複数のコンテキストの使用は、cudaDeviceResetを実行せずに1つを破棄する能力です。 –

+0

@FlorentDUGUET:答えを編集しますが、それはデバイスごとのコンテキスト、つまり複数のコンテキスト<-> 1つのデバイスであり、複数ではありません<->複数のOpenCLのようです。また、これらのCUDAコンテキストはスレッド固有です。 – einpoklum

+0

まあ、OpenCLは標準です。私は、Geminiの設計者や他の実装者があるレベルの共有メモリを享受したいときに、会議中に議論されたいくつかの機能のための余裕を残していると思います。私の知る限り、これはCUDAでは実装されていませんが、OpenCLは他の人によって実装されています。これは議論/意見に変わります。 –

答えて

1

コンテキストにはパラメータとしてデバイスが必要なのはなぜですか?一部のプラットフォームには複数のデバイスがあるため(AMDにはCPUデバイスとGPUが搭載されているため)あなたがその機能を削除した場合、唯一のオプションは次のとおりです。

  • バッファごとのデバイスのみ: CLプログラムで複数のデバイスを使用する可能性がないことを意味しています。あるいはそれですが、それらの間に明示的なコピーが必要です。

    • 最初は大丈夫です。しかし、8 GPUシステムで明示的なコピーを試みてください。特定のGPUからバッファを先に消去しないと、呼び出しがOutOfMemoryを返してアプリケーションをクラッシュさせることもあります。あなたのアプリケーションが完璧にバランスされているか、特定のGPUがボトルネックしてメモリを飽和させる可能性が非常に高いです。 APIがあなたのためにすべてのコピーを扱えるようにする方がはるかに簡単です。意味 、シングルGPUアプリケーションでは、あなたがバッファをコピーする場所を指定する必要があります:
  • バッファは毎plaformです。 解決策は、明示的なコピーでもかまいません。以前と同じ問題。

はまた、コンテキストは、GLコンテキストと同じ抽象化を提供し、使用しているすべての「ソフト」のリソースを分離し、清潔で破壊されたときにそれらの内部ですべてを破壊します。

コンテキストオブジェクトを作成したアプリケーションが強制終了された場合、またはSEG_FAULTSの場合は、リソースまたはそのアプリケーションの割り当てを解除することは容易です。また


プログラムとカーネルオブジェクトは:なぜこれは、デバイス固有のではないでしょうか? (それとも - ?デバイスおよびユーザ固有)それらはプログラム内部の機能と特定のデバイスの特定のインスタンスであるため

カーネルは、すでにデバイス特異的です。

同じプログラムではなく、引数が異なる任意の量のカーネルがあるかもしれません。これは非常に便利であり、単一のカーネルオブジェクトを持ち、各呼び出しで引数を変更するのではなく、複数のカーネルインスタンスを使用する方が理にかなっています。

関連する問題