OpenCL 技術の詳现





こんにちは、芪愛なるhabrasociety。



OpenCLに関する以前の蚘事で、このテクノロゞヌの抂芁が䜜成され、ナヌザヌに提䟛できる可胜性ず珟時点でのステヌタスに぀いお説明したした。

ここで、テクノロゞヌをより詳现に怜蚎しおください。 OpenCLが異皮システムを衚し、デバむスずの察話の機䌚を提䟛し、プログラムを䜜成するアプロヌチを提䟛する異皮システムを理解しようずしたす。





OpenCLは、異機皮混合環境で実行できるアプリケヌションを䜜成するためのテクノロゞヌずしお考案されたした。 さらに、珟圚蚈画に含たれおいるデバむスや、ただ誰も発明しおいないデバむスでも快適な操䜜を提䟛するように蚭蚈されおいたす。 これらすべおのデバむスの䜜業を調敎するために、異皮システムには垞にOpenCL APIの他のすべおの手段ず盞互䜜甚する1぀の「メむン」デバむスがありたす。 このようなデバむスは「ホスト」ず呌ばれ、OpenCLの倖郚で定矩されたす。



したがっお、OpenCLは、OpenCLをサポヌトするデバむスのアむデアを提䟛する最も䞀般的な前提から始たりたす。このデバむスは蚈算に䜿甚されるこずになっおいるため、䞀般的な意味で特定の「プロセッサ」を備えおいたす。 コマンドを実行できるもの。 OpenCLは䞊列コンピュヌティング甚に蚭蚈されおいるため、このようなプロセッサは 、䞊列凊理の手段を備えおいる堎合がありたすたずえば、1぀のCPUの耇数のコア、Cellの耇数のSPEプロセッサ。 䞊列コンピュヌティングのパフォヌマンスを向䞊させるもう1぀の基本的な方法は、これらのプロセッサのいく぀かをデバむスにむンストヌルするこずですたずえば、マルチプロセッサPCマザヌボヌドなど。 そしお圓然、異機皮混合システムでは、そのようなOpenCLデバむスがいく぀か存圚する可胜性がありたす䞀般的には、アヌキテクチャが異なりたす。



コンピュヌティングリ゜ヌスに加えお、デバむスには䞀定量のメモリがありたす。 さらに、このメモリの芁件はありたせん。デバむス䞊にあるか、ホストRAMに割り圓おるこずもできたすたずえば、統合ビデオカヌドで行われたす。



実際にはすべお。 デバむスに぀いおこれ以䞊の仮定は行われたせん。



デバむスのこのような広い抂念により、OpenCL甚に開発されたプログラムに制限を課すこずはできたせん。 このテクノロゞヌにより、OpenCLをサポヌトする特定のデバむスの特定のアヌキテクチャ向けに高床に最適化されたアプリケヌション、およびすべおのタむプのデバむスで安定したパフォヌマンスを発揮するアプリケヌションを開発できたすこれらのデバむスの同等のパフォヌマンスを想定。



OpenCLは、プログラマがデバむスリ゜ヌスずやり取りするための䜎レベルAPIをプログラマに提䟛したす。 OpenCL APIは、デバむスで盎接サポヌトされるか、䞭間APIを介しお動䜜したすNVidiaの堎合OpenCLはデバむスでサポヌトされるCUDAドラむバヌAPIの䞊で実行されたす。特定の実装に䟝存し、暙準では蚘述されおいたせん。



䜎レベルの性質を維持しながら、OpenCLがこのような汎甚性を提䟛する方法を芋おみたしょう。



次に、OpenCL 1.0仕様の䞀郚を無料で翻蚳し、コメントず远加を行いたす。



OpenCLの䞻なアむデアを説明するために、4぀のモデルの階局を䜿甚したす。





プラットフォヌムモデル



OpenCLプラットフォヌムは、OpenCLをサポヌトするデバむスに接続されたホストで構成されおいたす。 各OpenCLデバむスは、1぀以䞊の凊理芁玠凊理芁玠、以降PEず呌びたすにさらに分割された蚈算ナニットで構成されたす。



OpenCLアプリケヌションは、プラットフォヌムのネむティブモデルに埓っおホスト䞊で実行されたす。 OpenCLアプリケヌションは、ホストからデバむスにコマンドを送信しお、PEで蚈算を実行したす。 蚈算ナニット内のPEは、SIMDブロックすべおのPEが珟圚の呜什の実行を完了するたで、1぀の呜什が同時に実行され、次の呜什の凊理は開始されたせんたたはSPMDブロック各PEに独自の呜什カりンタヌプログラムカりンタヌ 

぀たり、OpenCLはホストからの特定のコマンドを凊理したす。 したがっお、アプリケヌションはOpenCLず厳密に接続されおいたせん。぀たり、プログラムのパフォヌマンスを損なうこずなく、OpenCLの実装をい぀でも眮き換えるこずができたす。 OpenCLデバむスモデルに適合しないデバむスが䜜成された堎合でも、ホストコマンドをデバむスにずっおより䟿利な圢匏に倉換するOpenCL実装を䜜成できたす。


実行モデル



OpenCLプログラムの実行は、プログラムのホスト郚分ずOpenCLデバむスで実行されおいるカヌネルカヌネル。蚱可を埗お、私たちのほずんどが知っおいる英語の甚語を匕き続き䜿甚したすの2぀の郚分で構成されたす。 プログラムのホスト郚分は、カヌネルが実行されるコンテキストを決定し、その実行を制埡したす。



OpenCL実行モデルの䞻芁郚分では、カヌネルの実行に぀いお説明しおいたす。 カヌネルが実行のためにキュヌに入れられるず、むンデックススペヌスが定矩されたすNDRange、定矩は以䞋に瀺されたす。 カヌネルのコピヌむンスタンスは、このスペヌスの各むンデックスに察しお実行されたす。 特定のむンデックスに察しお実行されるカヌネルのコピヌは「ワヌクアむテム」ワヌクナニットず呌ばれ、むンデックススペヌス内のポむントによっお定矩されたす。぀たり、各「ナニット」にはグロヌバルIDが提䟛されたす。 各Work-Itemは同じコヌドを実行したすが、特定の実行パスブランチなどずそれが機胜するデヌタは異なる堎合がありたす。



䜜業項目はグルヌプ䜜業グルヌプに線成されたす。 グルヌプは、むンデックススペヌスにより倧きなパヌティションを提䟛したす。 各グルヌプには、個々の芁玠のアドレス指定に䜿甚されたのず同じ次元のグルヌプIDが割り圓おられたす。 各芁玠には、グルヌプ内で䞀意のロヌカルIDが割り圓おられたす。 したがっお、ワヌクアむテムは、グロヌバルIDずグルヌプIDずロヌカルIDの組み合わせの䞡方で察凊できたす。



グルヌプ内の䜜業項目は、1぀のコンピュヌティングナニットのPEで競合的に䞊行しお実行されたす。

ここには、統合されたデバむスモデルが明確に衚瀺されおいたす。耇数のPE-> CU、耇数のCU->デバむス、耇数のデバむス->異皮システム。


OpenCL 1.0のむンデックススペヌスはNDRangeず呌ばれ、1次元、2次元、3次元にするこずができたす。 NDRangeは、各方向の次元を瀺す長さNの敎数の配列です。

NDRangeディメンションの遞択は、特定のアルゎリズムの利䟿性によっお決定されたす。3次元モデルで䜜業する堎合は、3次元座暙でむンデックスを䜜成するのが䟿利です。画像たたは2次元グリッドで䜜業する堎合は、むンデックスの次元が2のずきに䟿利ですさらに、OpenCLの䞻な目暙はGPUです。 Nvidia GPUは、それぞれ最倧3぀のむンデックスサむズをネむティブでサポヌトするようになりたした。より倧きな次元を実装するには、CUDAドラむバヌAPIたたはOpenCL実装のトリックず耇雑さに頌らなければなりたせん。


OpenCL実行モデルの実行コンテキストずコマンドキュヌ。



ホストはカヌネルの実行コンテキストを決定したす。 コンテキストには次のリ゜ヌスが含たれたす。



コンテキストは、OpenCL APIの関数を䜿甚しお䜜成および管理されたす。 ホストは、デバむス䞊のカヌネルの実行を制埡するコマンドキュヌず呌ばれるデヌタ構造を䜜成したす。 ホストはコマンドをキュヌに送信したす。その埌、コマンドはスケゞュヌラによっお蚭定され、目的のコンテキストのデバむスで実行されたす。



コマンドには次のタむプがありたす。





コマンドキュヌは、デバむスで実行するコマンドをスケゞュヌルしたす。 ホストずデバむス間で非同期に実行されたす。 コマンドは、次の2぀の方法で盞互に実行できたす。



耇数のコマンドキュヌを単䞀のコンテキストに関連付けるこずができたす。 これらのキュヌは、それらの間で競合し、それらの間の明瀺的な同期手段なしで独立しお実行されたす。

コマンドキュヌを䜿甚するず、OpenCLを䜿甚する際の汎甚性ず柔軟性が倧幅に向䞊したす。 最新のGPUには独自のスケゞュヌラがあり、実行するものず、い぀、どのコンピュヌティングナニットで実行するかを決定したす。 キュヌを䜿甚しおも、独自のコマンドキュヌを持぀スケゞュヌラの䜜業を劚げるこずはありたせん。


実行モデルカヌネルカテゎリ。



OpenCLカヌネルには2぀のカテゎリがありたす。



メモリモデル



カヌネルが実行するワヌクアむテムは、4皮類のメモリを䜿甚できたす。



仕様では4皮類のメモリが定矩されおいたすが、ハヌドりェアでのメモリの実装に関する芁件はありたせん。 4぀のタむプのメモリはすべおグロヌバルメモリに配眮でき、タむプレベルの分離はドラむバヌレベルで実行できたす。逆の堎合は、デバむスアヌキテクチャによっお決定されるメモリタむプの厳密な分離がありたす。


たさにこれらのタむプのメモリの存圚は非垞に論理的です。プロセッサコアには独自のキャッシュがあり、プロセッサには共通のキャッシュがあり、デバむス党䜓には䞀定量のメモリがありたす。


゜フトりェアモデル。 プログラミングモデル



OpenCL実行モデルは、デヌタ䞊列凊理ずタスク䞊列凊理の2぀の゜フトりェアモデルをサポヌトしおいたす;ハむブリッドモデルもサポヌトされおいたす。 OpenCLの蚭蚈を定矩する䞻なモデルは、デヌタの䞊列凊理です。



デヌタ䞊列性を備えた゜フトりェアモデル。



このモデルは、メモリオブゞェクトの倚くの芁玠に適甚される䞀連の呜什ずしお蚈算を定矩したす。 OpenCLランタむムモデルに関連付けられたむンデックススペヌスは、ワヌクアむテムずワヌクアむテム間のデヌタの分散方法を定矩したす。 デヌタ䞊列凊理の厳密なモデルでは、Work-Itemずメモリオブゞェクト内の芁玠ずの間に厳密な1察1の察応があり、カヌネルはこれを䜿甚しお䞊列に䜜業できたす。 OpenCLは、厳密な1察1のマッチングが䞍芁な、より柔軟なデヌタ同時実行モデルを実装しおいたす。



OpenCLは、デヌタの䞊行性の階局モデルを提䟛したす。 階局分割を定矩するには2぀の方法がありたす。 明瀺的なモデルでは、プログラマヌは、䞊列に実行する必芁のある芁玠の総数ず、これらの芁玠をグルヌプに分配する方法を決定したす。 暗黙的なモデルでは、プログラマヌは䞊列に実行する必芁のある芁玠の総数のみを決定し、ワヌクグルヌプぞの分割は自動的に実行されたす。



ゞョブの䞊列性を備えた゜フトりェアモデル。



このモデルでは、むンデックススペヌスに関係なく、カヌネルの各コピヌが実行されたす。 論理的には、これは、1぀の芁玠で構成されるグルヌプを持぀コンピュヌティングナニットCUでカヌネルを実行するこずず同じです。 このモデルでは、ナヌザヌは次の方法で䞊行性を衚珟したす。





2぀のプログラミングモデルの存圚も普遍性ぞのオマヌゞュです。 最新のGPUずセルには、最初のモデルが適しおいたす。 ただし、このようなモデルのフレヌムワヌク内ですべおのアルゎリズムを効果的に実装できるわけではなく、最初のモデルを䜿甚するのにアヌキテクチャが䞍䟿なデバむスが出珟する可胜性もありたす。 この堎合、2番目のモデルを䜿甚するず、別のアヌキテクチャに固有のアプリケヌションを䜜成できたす。


OpenCLプラットフォヌムの構成



OpenCLプラットフォヌムを䜿甚するず、アプリケヌションはホストず1぀以䞊のOpenCLデバむスを1぀の異皮䞊列コンピュヌタヌシステムずしお䜿甚できたす。 プラットフォヌムは、次のコンポヌネントで構成されおいたす。



どのように機胜したすか



次の蚘事では、䟋ずしおNvidia Computing SDKで配垃されおいるアプリケヌションの1぀を䜿甚しおOpenCLアプリケヌションを䜜成するプロセスを詳しく芋おいきたす。 Nvidiaが掚奚事項ずしお提䟛しおいるOpenCLのアプリケヌション最適化の䟋を次に瀺したす。



ここで、このようなアプリケヌションを䜜成するプロセスの構成手順を抂略的に説明したす。

  1. デバむス䞊でプログラムを実行するためのコンテキストを䜜成したす。
  2. 必芁なデバむスを遞択したすフロップの数が最も倚いデバむスをすぐに遞択できたす。
  3. 遞択したデバむスを、䜜成したコンテキストで初期化したす。
  4. デバむスIDずコンテキストに基づいおコマンドキュヌを䜜成したす。
  5. ゜ヌスコヌドずコンテキストに基づいおプログラムを䜜成し、

    バむナリファむルずコンテキストに基づいおいたす。
  6. プログラムビルドを収集したす。
  7. カヌネルを䜜成したす。
  8. 入力および出力デヌタ甚のメモリオブゞェクトを䜜成したす。
  9. ホスト䞊のデヌタずずもにメモリ領域からデバむスのメモリにデヌタを曞き蟌むコマンドをキュヌに入れたす。
  10. 䜜成したカヌネルの実行コマンドをキュヌに入れたす。
  11. コマンドをキュヌに入れお、デバむスからデヌタを読み取りたす。
  12. 䜜業の完了を埅っおいたす。


プログラムのアセンブリは実行時に実行され、ほずんどJITコンパむルされるこずに泚意しおください。 暙準では、遞択されたコンテキストを考慮しおプログラムをアセンブルできるように、これが行われおいるず説明されおいたす。 たた、OpenCL実装の各プロバむダヌは、デバむスのコンパむラヌを最適化できたす。 ただし、プログラムはバむナリコヌドから䜜成するこずもできたす。 たたは、最初の起動時に䞀床䜜成しおから再利甚するず、この機胜も暙準で説明されたす。 それにもかかわらず、コンパむラはOpenCLプラットフォヌムに統合されおいたすが、良くも悪くもそうです。


おわりに



その結果、OpenCLモデルは非垞に普遍的であるこずが刀明したしたが、䜎レベルのたたであるため、特定のアヌキテクチャ向けにアプリケヌションを最適化できたす。 たた、あるタむプのOpenCLデバむスから別のタむプに移動するずきにクロスプラットフォヌムを提䟛したす。 OpenCL実装のプロバむダヌは、あらゆる方法でデバむスずOpenCL APIずの察話を最適化する機胜を備えおおり、デバむスのリ゜ヌス割り圓おの効率を高めようずしおいたす。 さらに、正しく蚘述されたOpenCLアプリケヌションは、デバむスの䞖代を超えお匕き続き有効です。



参照








All Articles