インテル® C++/Fortran コンパイラーのベクトル化レポートを基にソースに注釈を付ける Python* スクリプト

インテル® DPC++/C++ コンパイラーインテル® Fortran コンパイラー

この記事は、インテル® デベロッパー・ゾーンに掲載されている「VecAnalysis Python* Script for Annotating Intel C++ & Fortran Compilers Vectorization Reports」(http://software.intel.com/en-us/articles/vecanalysis-python-script-for-annotating-intelr-compiler-vectorization-report) の日本語参考訳です。


この記事では、インテル® C++/Fortran コンパイラー 13.1 (インテル® C++/Fortran/Visual Fortran Composer XE 2013 Update 2 以降) の -vec-report7 オプションにより生成したベクトル化レポートを基にソースに注釈を付ける Python* スクリプトを紹介します。ダウンロード可能な圧縮ファイルには、次のファイルが含まれています。

  • vecanalysis.py
  • vecmessages.py
  • README.vecanalysis

注意: Python* バージョン 2.6.5 以上が必要です。Python* の詳細およびダウンロード方法については、こちらを参照してください。

インテル® C++/Fortran コンパイラー 13.1 で追加された新しい -vec-report7 (Linux*) または /Qvec-report7 (Windows*) コンパイラー・オプションを指定すると、コンパイラーは、ベクトルコード品質メッセージと対応するメッセージ ID 、およびベクトル化されたループのデータ値を出力します。メッセージには、スピードアップの予想、メモリー・アクセス・パターン、ベクトル化されたループのベクトルスタイルの数などの情報が含まれます。-vec-report7 オプションにより出力されるメッセージの種類を次に示します。

  • loop was vectorized (with peel / with remainder)
  • unmasked aligned unit stride loads: 4
  • unmasked aligned unit stride stores: 2
  • saturating add/subtract: 3
  • estimated potential speedup: 6.270000

vecanalysis Python* スクリプトは、コンパイラーにより生成されたメッセージ ID を取得して、オリジナルのソースコードに -vec-report7 によるメッセージの注釈を付けた、.txt ファイルを生成します。これらの情報を参照することで、アセンブリー・コードを解析することなく、生成されたベクトルコードの品質に関する詳しい情報を得ることができます。

出力ファイルの命名規則は (ファイル名_拡張子_vr.txt) です。例えば、ソースファイル satSub.c に対応する出力ファイルは satSub_c_vr.txt です。 コンパイラーは Python* スクリプトを自動的に起動しません。ユーザーは、コンパイラーが生成した出力ファイルに Python* スクリプトを手動で適用する必要があります。

以下に Linux* 環境における英語版インテル® C++ コンパイラーの利用例を示します。このコマンド例では、vecanalysis Python* スクリプトは “vecanalysis” ディレクトリー以下にあります。

例: icc -c -vec-report7 satSub.c 2>&1 | ./vecanalysis/vecanalysis.py –list

詳細は、README.vecanalysis を参照してください。

$ python
Python 2.6.5 (r265:79063, Jul  5 2010, 11:46:13)
[GCC 4.5.0 20100604 [gcc-4_5-branch revision 160292]] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.

$ icc -c -vec-report7 satSub.c 2>&1 | ./vecanalysis/vecanalysis.py –list
satSub.c(9): (col. 3) remark: SIMD LOOP WAS VECTORIZED.
satSub.c(9): (col. 3) remark: VEC#00001WPWR 1.
satSub.c(9): (col. 3) remark: VEC#00052 1.
satSub.c(9): (col. 3) remark: VEC#00101UASL 4.
satSub.c(9): (col. 3) remark: VEC#00101UASS 2.
satSub.c(9): (col. 3) remark: VEC#00101UUSL 2.
satSub.c(9): (col. 3) remark: VEC#00101UUSS 1.
satSub.c(9): (col. 3) remark: VEC#00201 5.
satSub.c(9): (col. 3) remark: VEC#00202 0.310000.
satSub.c(9): (col. 3) remark: VEC#00203 6.270000.
satSub.c(9): (col. 3) remark: VEC#00204 15.
satSub.c(9): (col. 3) remark: VEC#00405 3.
Writing satSub_c_vr.txt … done
Statistics for all files

// satSub.c のベクトル化サマリー
Source Locations
Message                                                                 Count     %

// 最初の行は、飽和加算/減算が 3 つあったことを示しています。  
// 100% は、
メッセージがプログラムの 1 つの場所/ループを参照していることを示しています。
// (Count = 1) は、プログラムのループについてこのメッセージのインスタンスが 1 つあることを示しています。
saturating add/subtract: 3.                                            1 100.0%    
unmasked unaligned unit stride loads: 2.                     1 100.0%    
loop was vectorized (with peel/with remainder)            1 100.0%    
unmasked aligned unit stride stores: 2.                        1 100.0%

// プログラムのすべてのループ (この場合は 1 つのループ) がベクトル化されました。
// 例えば、10 個のループのうち 6 つのループがベクトル化された場合は 60% になります。

SIMD LOOP WAS VECTORIZED.                               1 100.0%    
unmasked aligned unit stride loads: 4.                         1 100.0%
scalar loop cost: 5.                                                       1 100.0%
lightweight vector operations: 15.                                 1 100.0%
vector loop cost: 0.310000.                                           1 100.0%
loop inside vectorized loop at nesting level: 1.              1 100.0%
unmasked unaligned unit stride stores: 1.                     1 100.0%
estimated potential speedup: 6.270000.                        1 100.0%
Total Source Locations:                                                 1

$ more satSub_c_vr.txt
VECRPT satSub.c
VECRPT                                                                    Source Locations
VECRPT Message                                                                 Count     %
VECRPT saturating add/subtract: 3.                                             1 100.0%
VECRPT unmasked unaligned unit stride loads: 2.                      1 100.0%
VECRPT loop was vectorized (with peel/with remainder)             1 100.0%
VECRPT unmasked aligned unit stride stores: 2.                         1 100.0%
VECRPT scalar loop cost: 5.                                                         1 100.0%
VECRPT unmasked aligned unit stride loads: 4.                           1 100.0%
VECRPT SIMD LOOP WAS VECTORIZED.                                 1 100.0%
VECRPT lightweight vector operations: 15.                                   1 100.0%
VECRPT vector loop cost: 0.310000.                                            1 100.0%
VECRPT loop inside vectorized loop at nesting level: 1.               1 100.0%
VECRPT unmasked unaligned unit stride stores: 1.                      1 100.0%
VECRPT estimated potential speedup: 6.270000.                         1 100.0%
VECRPT Total Source Locations:                                                               1

1: #define SAT_U8(x) ((x) < 0 ? 0 : (x))
2: void satsub(
3:   unsigned char *a,
4:   unsigned char *b,
5:   int n
6: ){
7:   int i;
8: #pragma simd
VECRPT (col. 3) SIMD LOOP WAS VECTORIZED.
VECRPT (col. 3) estimated potential speedup: 6.270000.
VECRPT (col. 3) lightweight vector operations: 15.
VECRPT (col. 3) loop inside vectorized loop at nesting level: 1.
VECRPT (col. 3) loop was vectorized (with peel/with remainder)
VECRPT (col. 3) saturating add/subtract: 3.
VECRPT (col. 3) scalar loop cost: 5.
VECRPT (col. 3) unmasked aligned unit stride loads: 4.
VECRPT (col. 3) unmasked aligned unit stride stores: 2.
VECRPT (col. 3) unmasked unaligned unit stride loads: 2.
VECRPT (col. 3) unmasked unaligned unit stride stores: 1.
VECRPT (col. 3) vector loop cost: 0.310000.
9:   for (i=0; i  10:     a[i] = SAT_U8(a[i] – b[i]);
11:   }
12: }
$

ダウンロード: vecanalysis.tgz (http://software.intel.com/sites/default/files/article/358849/vecanalysis.tgz)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました