インテル®コンパイラー OpenMP*入門
デュアルコア・マルチコア対応アプリケーション開発@
<< 5 >>
3 . 計算粒度と負荷分散
並列処理とは、逐次処理では順番に処理されていた一連の処理を複数の CPU で同時に処理することでもあります
が、この並列処理を考える上で大事なことがあります。これは並列処理の効率にも関わることですが、同時に複数
の処理を行う場合、各処理における並列計算の「粒度」が非常に重要になります。「粒度」とは、一般には並列計算
における処理レベルを指しますが、実際には分類基準があるわけではありません。1 つの並列タスク内の仕事量と考
えることもできます。プログラム中の計算ループで並列化するような場合を「細粒度」(粒度が細かい)と呼び、関数
やサブルーチン呼び出しなどを含むプロシージャー間での並列処理を「疎粒度」(粒度が粗い)などと呼んでいます。
一般に、並列計算機上でプログラムを効率良く実行するためには計算の粒度を適切に設定することが必要になり
ます。粒度が小さ過ぎると実際の計算よりもスレッドの切り替えや通信のオーバーヘッドが大きく、効率が良くないと
いうことになる場合もあります。粒度が粗すぎると、負荷の不均衡のためにパフォーマンスが低下する可能性もありま
す。並列タスクの適切な粒度を決定して(通常は粗い粒度の方が良いと言われています)、負荷の不均衡と通信オー
バーヘッドを回避し、最適なパフォーマンスを得ることが必要です。
この並列処理の粒度について模式的に示します。ここでは前処理の後、処理タスク 1、2、3を順次実行すること
として「粒度」について考えます。処理タスク 1、2、3をそれぞれ並列化して同時に処理するような細粒度のケースで
は、各処理を複数のプロセッサーで処理することになりますが、各処理の開始と終了時にスレッドの生成、終了、同
期処理などを行う必要があります。これがスレッド切り替えのオーバーヘッドになります。一方、疎粒度な単位で処
理タスク 1、2、3をそれぞれ同時に複数のプロセッサーで処理するようなケースでは、スレッドの生成、終了、同期
処理などを最小化できます。ただ、このような疎粒度での並列化は、細粒度での並列性を見つけるよりも、より深い
洞察とプログラムの検討が必要になります。
計算粒度を模式的に示した図:領域を例えばスレッド数に分割し、それぞれの領域を個々のスレッドが計算するような場合は疎粒度での領
域分割となります。一方、領域を細かく分割し、各スレッドが複数の領域を順次処理するような場合は細粒度での領域分割となります。
疎粒度での領域分割
細粒度での領域分割