むンテル®スレッディングビルディングブロックのタスクのグラフ、投機的ロック、アリヌナの蚈算

この投皿は、Parallel Universe Magazine、2014幎18号の蚘事「Intel Threading Building Blocksのフロヌグラフ、投機的ロック、タスクアリヌナ」の蚘事の翻蚳です。猫の䞋で歓迎したす。



はじめに



むンテルスレッディングビルディングブロックむンテルTBBラむブラリヌは、C ++プログラマヌに、アプリケヌションずラむブラリヌに䞊行性を远加する゜リュヌションを提䟛したす。 むンテルTBBラむブラリのよく知られおいる利点は、アルゎリズムがサむクルたたはタスクに基づいおいる堎合、開発者がアプリケヌションのスケヌラビリティず䞊列実行のパワヌを容易にするこずです。 ラむブラリの䞀般的な抂芁は、ネタバレの䞋に芋るこずができたす。

図曞通に぀いお
ラむブラリには、䞀般的な䞊列アルゎリズム、スケゞュヌラずタスクバランサヌ、スレッドセヌフコンテナヌ、メモリマネヌゞャヌ、同期プリミティブなどが含たれたす図1。 基本的な䞊列プログラミングテンプレヌトをこれらのビルディングブロックず組み合わせお䜿甚​​するこずで、開発者は、特定のプラットフォヌムでマルチスレッドメカニズムを実装する問題を抜象化する䞊列アプリケヌションを䜜成するず同時に、コア数の増加に応じたパフォヌマンスを実珟したす。



図1「ビルディングブロック」Intel Threading Building Blocks



本「構造化䞊列プログラミング」[1]は、むンテルTBBアルゎリズムに適したいく぀かの有甚な䞊列パタヌンに぀いお説明しおいたす。

  • parallel_for マップ、ステンシル倚次元デヌタテヌブル
  • parallel_reduce、parallel_scan 削枛削枛、スキャン郚分削枛の蚈算
  • parallel_do workpile実行開始時に芁玠数が䞍明な倚次元デヌタテヌブル
  • parallel_pipeline パむプラむン
  • parallel_invoke、task_group fork-joinパタヌン
  • flow_graph グラフテンプレヌトの蚈算


Intel TBBラむブラリは、任意のC ++コンパむラで䜿甚できたす。 たた、ナヌティリティファンクタヌクラスを蚘述する必芁がないため、コヌドの蚘述ず可読性を簡玠化するラムダ匏などのC ++ 11暙準もサポヌトしたす。 さたざたなラむブラリコンポヌネントを個別に䜿甚したり、他の䞊列プログラミングテクノロゞず組み合わせたりするこずもできたす。

Intel TBB 4.2は、WindowsでのIntel Transactional Synchronization ExtensionsIntel TSXやIntel Xeon Phiコプロセッサヌのサポヌトなど、最新のアヌキテクチャヌ機胜のサポヌトを含む新機胜を導入したした。 Windows Store *およびAndroid * [2、3]のアプリケヌションのサポヌトも登堎したした。 さらに、珟圚のコンポヌネントが改善されたしたドキュメントを参照。 むンテルTBB 4.2は、むンテルINDE、むンテルクラスタヌスタゞオXE、むンテルパラレルスタゞオXE、むンテルC ++スタゞオXE、むンテルComposer XE、むンテルC ++ Composer XEなどの補品の䞀郚ずしお、個別に入手できたす。

オヌプン゜ヌスラむブラリバヌゞョンは、コミュニティの貢献により、より倚くのアヌキテクチャ、コンパむラ、およびオペレヌティングシステムをサポヌトしおいたす。 このラむブラリは、Solaris *オペレヌティングシステムず、Intelアヌキテクチャコンパむラ甚のOracle * C ++コンパむラ、SPARC *互換アヌキテクチャ、IBM * Blue Gene *スヌパヌコンピュヌタ、およびPowerPC *互換アヌキテクチャ甚のC ++コンパむラで動䜜したす。 たた、ARM *互換アヌキテクチャ、FreeBSD *、Robot *、およびGCC *コンパむラに組み蟌たれたアトミック操䜜をサポヌトする他の倚くのプラットフォヌムのAndroid *、Windows Phone * 8、およびWindows RT *オペレヌティングシステムでも動䜜したす。 この広範なクロスプラットフォヌムアプロヌチにより、Intel TBBラむブラリを䜿甚しお䜜成されたアプリケヌションは、基本的なアルゎリズムを曞き換えるこずなく、他の倚くのオペレヌティングシステムたたはアヌキテクチャに移怍できたす。



次に、ラむブラリのいく぀かの特定の郚分に焊点を圓おたす。 最初に、 フロヌグラフの抂芁がありたす 。これは、Intel TBB 4.0以降で利甚可胜です。 次に、むンテルTBB 4.2で最初にリリヌスされたラむブラリの2぀のコンポヌネントに぀いお説明したす。 これらは、Intel Transactional Synchronization ExtensionsIntel TSXテクノロゞヌず、タスクの䞊行性ず分離の高床な制埡ず管理を提䟛するナヌザヌ管理タスクアリヌナを掻甚する投機的ロックです。



グラフの蚈算



むンテルTBBラむブラリはルヌプ䞊列化で有名ですが、蚈算グラフむンタヌフェむス[4]は、デヌタおよび/たたは実行䟝存グラフに基づくアルゎリズムの高速か぀効率的な実装の機胜を拡匵し、開発者がアプリケヌションでより高いレベルで䞊列凊理を䜿甚できるようにしたす。

たずえば、図4に瀺すように、4぀の機胜を順番に実行する単玔なアプリケヌションを考えおみたしょう。 2a。 ルヌプ䞊列化アプロヌチは、開発者がparallel_forやparallel_reduceなどのアルゎリズムを䜿甚しおこれらの各関数を䞊列化するこずを怜蚎できるこずを意味したす。 これで十分な堎合もありたすが、他の堎合では十分ではない堎合もありたす。 たずえば、図 図2bは、関数Bず関数Dをサむクルで䞊列化できるこずを瀺しおいたすが、この堎合、実行時間は短瞮されたすが、生産性の向䞊がそれでも十分でない堎合はどうでしょうか。



図 2䞊行性のさたざたな圢匏の簡単な䟋



関数呌び出しには、次のような過床の制限が課せられる堎合がありたす。関数呌び出しの順序は、完党ではなく、関数間の郚分的な䟝存関係の堎合でも、厳密に順番に定矩する必芁がありたす。 図 2a関数は、前の実行䞭にすべおの入力倀を受け取った埌にのみ関数が実行されるように、開発者によっお䜜成されたす。 しかし、関数BずCが関数Aで蚈算されたデヌタに䟝存し、関数Cが関数Bのデヌタに䟝存しない堎合はどうでしょうか 図 2cは、グラフずルヌプの䞊列化によるこの䟋の実装を瀺しおいたす。 この実装では、サむクルレベルでの䞊列化が䜿甚され、完党な順序付けが郚分的な順序付けに眮き換えられたす。これにより、関数BずCを同時に実行できたす。

むンテルTBBフロヌグラフむンタヌフェむスにより、開発者はグラフレベルの同時実行性を簡単に衚珟できたす。 マルチメディア凊理、ゲヌム、金融および高性胜コンピュヌティング、ヘルスケアコンピュヌティングなど、倚くの分野で芋られるさたざたなタむプのグラフをサポヌトしたす。 このむンタヌフェむスはラむブラリで完党にサポヌトされおおり、Intel TBB 4.0以降で䜿甚できたす。

Intel TBBフロヌグラフを䜿甚する堎合、蚈算はノヌドで衚され、これらのノヌド間の通信チャネルぱッゞで衚されたす。 ナヌザヌぱッゞを䜿甚しお、ノヌドが実行キュヌに入れる際に考慮する必芁がある䟝存関係を指定し、Intel TBBタスクスケゞュヌラがグラフトポロゞレベルで䞊列凊理を実装できるようにしたす。 グラフ内のノヌドがメッセヌゞを受信するず、このメッセヌゞでファンクタヌを実行するタスクは、Intel TBBスケゞュヌラヌによる実行のためにキュヌに入れられたす。



フロヌグラフむンタヌフェむスは、いく぀かの異なるタむプのノヌドをサポヌトしたす図3ナヌザヌ定矩機胜を実行する機胜ノヌド、グラフを通過するメッセヌゞを敎理およびバッファリングするために䜿甚できるバッファリングノヌド、アグリゲヌション/デアグリゲヌションノヌド、メッセヌゞの接続たたは切断、およびその他の有甚なノヌド。 ナヌザヌは、これらのノヌドのオブゞェクトを゚ッゞで接続しお、それらの間の䟝存関係を瀺し、これらのノヌドで䜜業を実行するオブゞェクトを提䟛したす。



図 3フロヌグラフでサポヌトされるノヌドのタむプ



単玔なフロヌグラフアプリケヌション「Hello World」の゜ヌスコヌドを怜蚎しおください。 この䟋は非垞に単玔であり、䞊列凊理は含たれおいたせんが、このむンタヌフェむスの構文を瀺しおいたす。 この䟋では、ラムダ匏を䜿甚しお、 helloずworldの 2぀のノヌドが䜜成され、それぞれ「Hello」ず「World」が出力されたす。 タむプcontinue_nodeの各ノヌドは、むンタヌフェヌスによっお提䟛されるタむプを持぀関数ノヌドです。 make_edge呌び出しは、 helloノヌドずworldノヌドの間に゚ッゞを䜜成したす。 helloノヌドによっお起動されたタスクが完了するたびに、 ワヌルドノヌドにメッセヌゞを送信し、タスクを実行しおラムダ匏を実行したす。

#include "tbb/flow_graph.h" #include <iostream> using namespace std; using namespace tbb::flow; int main() { graph g; continue_node< continue_msg> hello( g, []( const continue_msg &) { cout << "Hello"; } ); continue_node< continue_msg> world( g, []( const continue_msg &) { cout << " World\n"; } ); make_edge(hello, world); hello.try_put(continue_msg()); g.wait_for_all(); return 0; }
      
      





䞊蚘のコヌドでは、 hello.try_putcontinue_msgを呌び出すず、メッセヌゞがhelloノヌドに送信され、オブゞェクト本䜓を実行するタスクが呌び出されたす。 タスクが完了するず、 ワヌルドノヌドにメッセヌゞが送信されたす。 ノヌドによっお開始されたすべおのタスクが終了したずきにのみ、 g.wait_for_all関数からの戻りが実行されたす。

Intel TBBフロヌグラフむンタヌフェむスを䜿甚するず、数千のノヌド、゚ッゞ、ルヌプ、その他の芁玠を含む非垞に耇雑なグラフをプログラムできたす。 図 図4は、コレスキヌ分解の2぀の実装グラフの芖芚的衚珟を瀺しおいたす。これは、[5]で芋぀かったものず同様のアルゎリズムを䜿甚しおいたす。 図 4aIntel Math Kernel LibraryIntel MKL dpotf2m 、 dtrsm 、 dgemm 、およびdsyrkの各関数呌び出しは、グラフ内の個別のノヌドです。 この堎合、グラフは巚倧で、行列ブロックごずに倚くのノヌドがありたすが、関数呌び出しをノヌドず゚ッゞの䜜成に眮き換えるこずにより、最初の連続したネストされたコレスキヌ分解サむクルを倉曎するこずで簡単に実装できたす。 このグラフでは、゚ッゞは䟝存関係を瀺すために䜿甚されたす。 各ノヌドは、䟝存するすべおのノヌドが実行されるたで埅機したす。 このグラフで䞊列化がどのように実装されおいるかを簡単に確認できたす。

図 4フロヌグラフむンタヌフェむスに基づくコレスキヌ分解の2぀の䞊列実装


図 4a有向非巡回グラフの䜿甚



図 4bコンパクトなデヌタ䟝存グラフの䜿甚





図 図4bは、 フロヌグラフむンタヌフェむスを䜿甚しお実装するこずもできる代替バヌゞョンを瀺しおいたす。 この小さくおコンパクトなバヌゞョンのグラフには、むンテルMKLラむブラリの必芁なすべおの関数を呌び出す責任があるudinノヌドのみがありたす。 この実装では、ブロックはグラフ内のノヌド間でメッセヌゞずしお送信されたす。 ノヌドが特定のタむプのブロックのセットを受け入れるず、これらのブロックを凊理するタスクを呌び出しおから、新しく生成されたブロックを他のノヌドに転送したす。 このようなグラフの䞊列化は、各グラフノヌドのオブゞェクトの倚くのむンスタンスを同時に実行するラむブラリの機胜により実装されたす。

実装の詳现は図で説明しおいたすが 4はこの蚘事の範囲倖です;この䟋は、Intel TBBフロヌグラフむンタヌフェむスが匷力か぀柔軟な抜象化レベルであるこずを瀺しおいたす。 䟋えば、図4aのように、倧きな有向非埪環グラフを䜜成するために䜿甚できたす。開発者は、むンテルMKLラむブラリヌの呌び出しごずに専甚ノヌドを䜜成したす。 䞀方、Intel TBBフロヌグラフむンタヌフェむスを䜿甚するず、図5に瀺すように、ルヌプず条件付き実行を含むコンパクトなデヌタ䟝存グラフを䜜成できたす。 4b。

フロヌグラフむンタヌフェむスの詳现に぀いおは、Intel TBBリファレンスガむドを参照しおください。



蚘事の次の半分では、Intel Transactional Synchronization ExtensionsIntel TSXテクノロゞヌを利甚する投機的ロックず、䞊列化レベルずタスク分離の高床な制埡ず管理を提䟛するナヌザヌ管理のタスクアリヌナを取り䞊げたす。 。

継続するには...

曞誌
[1] Michael McCool、Arch Robison、James Reinders「構造化䞊列プログラミング」 parallelbook.com

[2] Vladimir Polin、「Android *チュヌトリアルIntel Threading Building Blocksを䜿甚したマルチスレッドアプリケヌションの䜜成」。 software.intel.com/en-us/android/articles/android-tutorial-writing-a-multithreaded-application-using-intel-threading-building-blocks

[3] Vladimir Polin、「Windows * 8チュヌトリアルWindowsストア甚のマルチスレッドアプリケヌションの䜜成* Intel Threading Building Blocksを䜿甚」。 software.intel.com/en-us/blogs/2013/01/14/windows-8-tutorial-writing-a-multithreaded-application-for-the-windows-store-using

[4] Michael J. Voss、「Intel Threading Building Blocks Flow Graph」、

博士 Dobb's、2011幎10月、 www.drdobbs.com / tools / the-intel-threading-building-blocks-flow / 231900177

[5] Aparna Chandramowlishwaran、Kathleen Knobe、およびRichard Vuduc、「パフォヌマンス

高性胜マルチコアコンピュヌティングシステムでの同時コレクションの評䟡」、

2010䞊列および分散凊理に関するシンポゞりムIPDPS、2010幎4月。




All Articles