ベクトル化レポートは、IA-32 アーキテクチャー・ベース・システムおよびインテル® 64 アーキテクチャー・ベース・システムで利用でき、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE3、SSE2、SSE) のベクトル化を活用できるループについての情報を提供します。
その他のベクトル化のオプションについては、「並列化の使用」を参照してください。
-vec-report (Linux* および Mac OS* X) または /Qvec-report (Windows*) オプションは、異なるレベルの情報を含むベクトル化レポートを生成するようにコンパイラーに指示します。値に 3 を指定して、詳細な診断レポートを生成します。
オペレーティング・システム |
コマンド |
---|---|
Linux および Mac OS X |
ifort -c -xSSSE3 -vec-report3 sample.f90 |
Windows |
ifort /c /QxSSSE3 /Qvec-report:3 sample.f90 |
-c (Linux および Mac OS X) または /c (Windows) は、実行ファイルを生成しないでサンプルコードをコンパイルするようにコンパイラーに指示します。
Linux および Mac OS X: オプションとフェーズの間のスペースはオプションです。
Windows: オプションとフェーズの間のコロンはオプションです。
次に、ベクトル化レポートによって生成される結果の例を示します。
結果の例 |
---|
sample.f90(27) : (col. 9) remark: ループはベクトル化されませんでした。: 内部ループではありません。 sample.f90(28) : (col. 11) remark: ループがベクトル化されました。 sample.f90(31) : (col. 9) remark: ループはベクトル化されませんでした。: 内部ループではありません。 sample.f90(32) : (col. 11) remark: ループがベクトル化されました。 sample.f90(37) : (col. 10) remark: ループはベクトル化されませんでした。: 内部ループではありません。 sample.f90(38) : (col. 12) remark: ループはベクトル化されませんでした。: 内部ループではありません。 sample.f90(40) : (col. 14) remark: ループはベクトル化されませんでした。: ベクトル化は可能ですが非効率です。 sample.f90(46) : (col. 10) remark: ループはベクトル化されませんでした。: 内部ループではありません。 sample.f90(47) : (col. 12) remark: ループはベクトル化されませんでした。: 48 行目にベクトル化できないステートメントが含まれています。 |
ベクトル依存が存在するために、コンパイラーが "ループはベクトル化されませんでした" とレポートした場合、ループのベクトル依存解析を行う必要があります。ベクトル依存が存在しないことがわかっている場合、上記のメッセージは、コンパイラーがループ中のポインターまたは配列が依存していると仮定したことを示し、ポインターまたは配列がエイリアスされたことを暗に示します。メモリーの一義化テクニックを使用してこの問題を解決します。
主なベクトル依存は、FLOW、ANTI、および OUTPUT の 3 つです。
ベクトル化レポートは、さまざまな状況でベクトル依存を示します。以下のような状況で、非ユニットストライド、低いトリップカウント、複雑な添字式がベクトル依存としてレポートされることがあります。
非ユニットストライド
メモリーが非ユニットストライド方式でアクセスされたときに、ループがベクトル化できなかったことがレポートで示されることがあります。これは、ループで連続していないメモリーの場所がアクセスされていることを意味します。この場合、ループ交換で問題が解決できないか確認してください。解決できない場合、vector always 宣言子によってベクトル化するように指定します。この際、状況が改善されたかを確認してください。
非ユニットストライド条件に関する詳細は、「ランタイム・パフォーマンスの理解」を参照してください。
ベクトル化レポートは、実行ファイルが生成される最後のコンパイルフェーズで生成されます。したがって、レポートを生成する場合に使用できないオプションの組み合わせがあります。次のオプションの組み合わせを使用した場合、コンパイラーは警告を表示してレポートを生成しません。
-c、-ipo または -x と -vec-report (Linux および Mac OS X)、/c、/Qipo または /Qx と /Qvec-report (Windows)
-c または -ax と -vec-report (Linux および Mac OS X)、/c または /Qax と /Qvec-report (Windows)
次のコマンド例は、ベクトル化レポートを生成できます。
オペレーティング・システム |
コマンド例 |
---|---|
Linux および Mac OS X: |
ifort -xSSSE3 -vec-report3 sample.f90 ifort -xSSSE3 -ipo -vec-report3 sample.f90 |
Windows |
ifort /QxSSSE3 /Qvec-report:3 sample.f90 ifort /QxSSSE3 /Qipo /Qvec-report:3 sample.f90 |
以下の条件でベクトル化できるようにするには、既存のコードを変更する必要があります。
ベクトル化レポートでプログラムに "XXX 行目にベクトル化できないステートメントが含まれています。" のように示された場合。
ベクトル化レポートで "ベクトル依存関係: FLOW の依存関係が '変数' 行 XXX と '変数' 行 XXX の間に証明されました。" または "ループはベクトル化されませんでした。: ベクトル依存関係が存在しています。" のように示された場合。通常、これらの条件は真のループ依存がベクトル化を停止していることを示します。この場合、ループのアルゴリズムを変更することを考えてみてください。
例えば、同一の出力を行う 2 つの同等なアルゴリズムを考えます。"foo" はフロー依存のためにベクトル化されませんが、"bar" はベクトル化されます。
例 |
---|
subroutine foo(y) implicit none integer :: i real :: y(10) do i=2,10 y (i) = y (i-1)+1 end do end subroutine foo subroutine bar(y) implicit none integer :: i real :: y(10) do i=2,10 y (i) = y (1)+i end do end subroutine bar |
サポートされていないループ構造はベクトル化できません。サポートされていないループ構造の例は、複雑な計算が必要なループ・インデックス変数です。構造を変更して、ループ制限への関数呼び出しおよびループ制限に対するその他の過度な計算を削除します。
例 |
---|
function func(n) implicit none integer :: func, n func = n*n-1 end function func subroutine unsupported_loop_structure(y,n) implicit none integer :: i,n, func real :: y(n) do i=0,func(n) y(i) = y(i) * 2.0 end do end subroutine unsupported_loop_structure |
非ユニット・ストライド・アクセスは、ベクトル化レポートで "ループはベクトル化されませんでした: ベクトル化は可能ですが非効率です" のように示されます。ユニットストライド方式でデータにアクセスするようにループを再構成 (例えば、ループ交換を適用) するか、または宣言子 を使用します。
ループの中で混在データ型を使用するとベクトル化できません。混在データ型の場合、ベクトル化レポートで "ループはベクトル化されませんでした: 条件が複雑すぎます" のように示されます。
次に、ループ内に混在データ型が使用されているためにベクトル化できないループの例を示します。例えば、withinborder は整数ですが、ループの他のすべてのデータ型は整数ではありません。withinborder のデータ型を変更することで、このループをベクトル化できます。
例 |
---|
subroutine howmany_close(x,y,n) implicit none integer :: i,n,withinborder real :: x(n), y(n), dist withinborder=0 do i=0,100 dist=sqrt(x(i)*x(i) + y(i)*y(i)) if (dist<5) withinborder= withinborder+1 end do end subroutine howmany_close |