ベクトル化レポート

ベクトル化レポートは、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) は、実行ファイルを生成しないでサンプルコードをコンパイルするようにコンパイラーに指示します。

Note icon

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 行目にベクトル化できないステートメントが含まれています。

ベクトル依存が存在するために、コンパイラーが "ループはベクトル化されませんでした" とレポートした場合、ループのベクトル依存解析を行う必要があります。ベクトル依存が存在しないことがわかっている場合、上記のメッセージは、コンパイラーがループ中のポインターまたは配列が依存していると仮定したことを示し、ポインターまたは配列がエイリアスされたことを暗に示します。メモリーの一義化テクニックを使用してこの問題を解決します。

主なベクトル依存は、FLOWANTI、および OUTPUT の 3 つです。

ベクトル化レポートは、さまざまな状況でベクトル依存を示します。以下のような状況で、非ユニットストライド、低いトリップカウント、複雑な添字式がベクトル依存としてレポートされることがあります。

非ユニットストライド

メモリーが非ユニットストライド方式でアクセスされたときに、ループがベクトル化できなかったことがレポートで示されることがあります。これは、ループで連続していないメモリーの場所がアクセスされていることを意味します。この場合、ループ交換で問題が解決できないか確認してください。解決できない場合、vector always 宣言子によってベクトル化するように指定します。この際、状況が改善されたかを確認してください。

非ユニットストライド条件に関する詳細は、「ランタイム・パフォーマンスの理解」を参照してください。

その他のオプションの使用方法

ベクトル化レポートは、実行ファイルが生成される最後のコンパイルフェーズで生成されます。したがって、レポートを生成する場合に使用できないオプションの組み合わせがあります。次のオプションの組み合わせを使用した場合、コンパイラーは警告を表示してレポートを生成しません。

次のコマンド例は、ベクトル化レポートを生成できます。

オペレーティング・システム

コマンド例

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

対応

以下の条件でベクトル化できるようにするには、既存のコードを変更する必要があります。

例えば、同一の出力を行う 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