コンパイラーによる自動並列化
コンパイラーによる自動並列化を試します。先ほどと同じコマンドで、自動並列化のためのオプションである/Qparallelを追加してコンパイルします。
できたプログラムの引数に2000を渡し実行してみると、実行時間は18.2秒とほとんど変化がありません。
実行時間に変化がないのは、コンパイラーの並列化がうまく行われていないためです。というのも、デフォルトのオプションとして/Qpar-report1が指定されているので、コンパイラーが自動並列化を行うとコンパイル・メッセージとして並列化を行ったことが表示されるのですが、今回のコンパイルでは並列化のメッセージが出力されていないので並列化が行われてないことが分かります。
ここで、/Qpar-reportオプションの引数を変更して、なぜ並列化できないのかを調べることができます。図3に/Qpar-report2を指定したときに、コンパイラーが出力する並列化レポートのメッセージを示します。並列化レポートのメッセージの意味は次のようになっています。
- 「計算量が不足しています。」というのは、コンパイラーが並列化するのに十分な計算量がなく並列化の効果が少ないと判断したこと示しています。
- 「並列依存関係が存在します。」というのは、並列化することによってプログラムの実行結果が正しくなくなるとコンパイラーが判断した依存関係が存在することを示します。
tridiag.cc(21): (col. 3) remark: ループは並列化されませんでした: 並列依存関係が存在しています。. tridiag.cc(25): (col. 5) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(39): (col. 5) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(46): (col. 5) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(48): (col. 7) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(51): (col. 7) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(59): (col. 5) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(65): (col. 5) remark: ループは並列化されませんでした: 計算量が不足しています。. tridiag.cc(70): (col. 5) remark: ループは並列化されませんでした: 並列依存関係が存在しています。. tridiag.cc(71): (col. 7) remark: ループは並列化されませんでした: 並列依存関係が存在しています。.
ここでは、/Qpar-thresholdオプションを使って並列化スレッショルド(しきい値)の変更を行います。このオプションは引数として0から100までの数字を指定するもので、デフォルトは100です。この数字が低いほどコンパイラーはより少ないループ回数で並列化の効果があると判断します。0を指定すると、コンパイラーは並列化可能なループを常に並列化します。ここでは、オプションに/Qpar-threshold0を追加してコンパイルしてみます。作成されたプログラムに引数として2000を渡すと実行時間は15.4秒となり、並列化の効果を確認できました。ただ、このオプションを指定しても「並列依存関係が存在する」と判断されたループの並列化は行うことができません。
ここで指定したコンパイラーオプションを表2にまとめました。
| オプション | 意味 |
| /Qparallel | 自動並列化を有効にする。 |
| /Qpar-report[n] | 並列化レポートの出力レベルを指定する。 |
| /Qpar-threshold[n] | 並列化レベルを指定する。 |
