.NET Frameworkでの並列処理を把握しておくと混乱が少なくて済みます。
◎ 並列・非同期処理のまとめ
■ .NETでの並列・非同期処理
・Thread
・ThreadPool
・EAP:イベントベースの非同期処理
・Rx: LINQ
・TPL:Task Parallel Library
・NET4.5/C#5.0 async/await (NET4.5だからVistaやXPで動作しない)
ストアアプリでの並列処理、非同期処理
・WRLコンポーネントのThread/ThreadPool
・PPL : Parallel Patterns Library
・C#5.0, async/await
・ウィンドウスレッド、Pthread
・OpenMP:
・C++ AMP : OpenCL相当
次世代ゲーム機はAMDなのでCPU/GPUをあわせて設計開発できるAMD技術に優位性があります。AMD APP SDKはOpenCL対応です。CUDAやC++AMPよりOpenCLが普及すると思います。
-------------------------------------------
◎ async/awaitとPPL
[背景]
WindowsRuntimeはタッチパネル前提のストアアプリ用の基盤なので50ms以上時間がかかる処理はすべて非同期で設計されています。async/await使うと同期処理と同じコストで非同期処理が実現できるため生産性が高いです。
■PPL(Parallel Patterns Library)
ストアアプリ用の並列C++テンプレートライブラリです。Intel TBB相当です。.NETのTPLとも似ています。
PPLドキュメントは質が良くないので、最初はTBBかTPLのドキュメントを見た方がよいです。ワークスティールやタスクツリー評価の説明がない、または順序が不適切という問題があります。
◆PPLの機能(1)データ並列と(2)タスク並列)
(1) 並列アルゴリズム(ループテンプレート)と並列コンテナ
・並列ループ(parallel_for)や並列ソート、pipeline、
・並列リダクション(parallel_reduce):配列の中身を2倍したり最小最大を見つける処理。
floatの丸め誤差で結果が異なる点に注意が必要です。
・並列コンテナ
並列処理に対応した並列コンテナクラスです。STLコンテナの並列対応版です。
(2)タスク処理
(1)の並列アルゴリズムで表現できない処理はプログラマーがタスク継承して処理を書きます。
・タスクはスレッドより粒度が細かい。
・タスクはスレッドに割り付けられる。
・タスクスケジューラーがスレッド管理する。
◆PPLの利点
・オーバーサブスクリプション無し。タスクスケジューラーはハードに問い合わせて最適なスレッド数を生成します。
・ロードバランサ:スレッドへの適切なタスクの割り当て。
・ワークスティール:スレッドのタスクキューが空になったとき別のスレッドからタスクを持ってくる機構です。
-------------------------------------------
◎その他
・OpenMPとPPLは同時使用可能。
・WindwosThreadとPPLも同時可能。
・Android上でIntelTBBは移植されている。
・並列デザインパターン
ソフトウェアの基本設計レベルで書き方がかわってくるので、
→並列プログラミングのデザインパターンを覚える必要あり。