シングルスレッドでのプログラミングと違って,並列処理でのプログラミングでは,''並列度'',''計算粒度'',''同期処理''等に留意する必要があります.
並列度
マルチスレッドプログラミングにおいて,その性能はプログラムの並列実行と逐次実行の比率によって決まります.この並列実行の性能向上(SpeedUP)は''アムダールの法則''と呼ばれています.
- アムダールの法則
並列化効率 = 1/'''p'''+'''N'''(1-'''p''')
SpeedUp = 並列化効率×'''N''' = 1/{(1-'''p''')+'''p'''/'''N'''}
'''N''' = プロセッサ数
並列化率('''p''') = 元の計算時間に対する並列処理可能部分の時間の割合
式から分かるように,SpeedUPは非並列実行部分の比率に依存することになります.
計算粒度
"粒度"とは,並列計算における処理レベルや並列タスクの仕事量などと定義されることが一般的です.プログラム中のループで並列化するような場合を"細粒度"と呼び,関数やサブルーチン呼び出しなどを含むプロシージャ間での並列処理を"粗粒度"と呼びます.粒度が小さすぎると実際の計算よりもスレッドの切り替えや通信のオーバーヘッド,スレッド間での同期処理の負荷が大きく効率が悪くなる場合もあります.逆に粒度が大きすぎると負荷の不均衡のためにパフォーマンスが低下する可能性があります.
同期処理
並列処理では複数のスレッドで同時に処理を行うため,スレッド間での同期処理が必要になります.OpenMPではその規格の定義に従って全てのワークシェアリングの終了時に同期処理を行っています.このため,プログラム中に不要な同期処理が加えられる可能性があります.また,クリティカルセクションのような並列実行領域内での排他制御もスレッド数が多くなると性能に大きな影響を与えることになります.
参考文献:C MAGAZINE 3月号 (2006年)