第19回に説明したベクトル(SIMD)演算器や、本ブログの主題であるマルチコア、最近話題になることが多いチップレットなど、世の中には様々な並列実行ハードウェアがあります。それぞれが異なる部品というものではなく、下図の例のように、チップレットには複数のマルチコアプロセッサが搭載され、各コアにはSIMD演算器が搭載されている、といったように、同時にさまざまな並列実行ハードウェアが利用可能です。これらをどのように使い分けるのでしょうか。
これを考えるためには、第7回で説明した(並列化)オーバーヘッドの考え方が重要です。オーバーヘッドは性能向上の阻害要因ではありますが、オーバーヘッドがあっても有効に並列化できるような計算量をもつ計算の塊(ここでは実行単位とよびます)が複数あるとき、効果的に並列化ができ、高速化できます(第7回参照)。ここで各実行単位の計算量を粒度とよびます。つまりオーバーヘッドを考慮し、適切な粒度をもつ実行単位にプログラムを分割することが重要となります。
そのためにオーバーヘッドを調べる必要があります。このとき、上の例では、CPU内のSIMD演算、チップ内のマルチコア(マルチCPU)、チップレット内のチップ並列といった階層がありますが、多くのハードウェアプラットフォームにおいて同様の階層があり、オーバーヘッドはそのような階層ごとに調べる必要があります。上の例では、SIMD演算器はハードウェアによる強力な並列化支援があるためオーバーヘッドが小さく、ソフトウェアからは、計算以外に必要な時間がSIMDレジスタにデータを転送する数サイクルのみにみえます。ただし、小さいオーバーヘッドでCPU内に搭載するためには面積に制約があり、いくらでも並列化が可能であるわけでもありません。次にオーバーヘッドが小さい並列実行ハードウェアがマルチコア内の複数CPUです。これも並列数はチップ面積の制約を受けます。もっともオーバーヘッドが大きい並列実行ハードウェアはチップレット上の複数マルチコアチップです。
ハードウェア階層においてオーバーヘッドに差があるため、並列化を考える際の粒度に分類ができ、並列化にも階層ができます。粒度が最も細かい並列性であるターゲットアセンブラ命令レベルの並列性(SIMD演算を含む)を命令レベル並列または細粒度並列といいます。そして、より粗い粒度を持ち、マルチコアでの並列化が有効になるレベルをスレッドレベル並列または中粒度並列、さらに粗い粒度を持ち、チップ間での並列化が有効になるレベルを粗粒度並列といいます。これをもとに並列化に階層ができます。大規模データに対して同一の計算をするループ構造がプログラム中にあるとき、まず、ループを粗粒度に分割してマルチコアチップに割り当て、各粗粒度の処理(粗粒度タスクともよばれる)を中粒度の処理(中粒度タスク)に分割してスレッド化し、コアに割り当てた上、各中粒度タスクの中でSIMD演算を使っていくことになります。このようにハードウェアアーキテクチャに応じて並列実行単位の階層ができますが、これを並列階層とよぶこともあります。例えば、どのループでも並列化が可能な3重ループがあるとき、最外ループをチップに、その中のループをコアに、最内ループをベクトル(SIMD)化するような階層が考えられます。
では、実際にどのくらいの規模の計算ならば複数のマルチコアチップを使う意味がでてくるのでしょうか? 正しく答えようとすると、それは計算に依存する上に、ターゲットプラットフォームのオーバーヘッドに依存します、ということになるのですが、それでは何もわかりません。そのため、次回、仮に数値をあてはめシミュレーションした結果を報告します。
コメントをお書きください