コードの現代化と最適化
スレッド化とベクトル化に OpenMP* プログラミング・モデルを使用してパフォーマンスを改善© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

Parallel + SIMD は前進への鍵
インテル® Xeon® プロセッサーとインテル® Xeon Phi™ 製品ファミリーは、両者とも並列性を高めていますインテル®
Xeon® プロ
セッサー 64ビット

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロ
セッサー
コード名

インテル®
Xeon® プロセッサー
コード名

Woodcrest

Nehalem

Westmere

Sandy Bridge EP

Ivy Bridge

Haswell

Skylakeインテル® Xeon
Phi™ x200 プロ
セッサー & コプロ
セッサー (コード
名:

EP

EP

EP

EP

EP

Server1

Knights Landing)インテル® Xeon
Phi™ x100 コプロ
セッサー (コード名:
Knights Corner)

コア

1

2

4

6

8

12

18

28

61

72

スレッド

2

2

8

12

16

24

36

56

244

288

SIMD 幅

128

128

128

128

256

256

256

512

512

512

さらに多いコア

さらに多くのスレッド

より広いベクトル

OpenMP* は parallel + SIMD を前進させる最も重要な機能の 1 つ* ark.intel.com で公開されている出荷済の製品仕様

1.出荷前もしくは計画中。

© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

2インテル® 開発ツールはコードの現代化を支援


最適化ツールとライブラリーの活用： チューニングを始めましょう !






ビルド：最適なコードを生成するため、インテル® コンパイラー (ホットスポットで) を使用します
ビルド：利用可能であれば、インテル® MKL、インテル® TBB そしてインテル® IPP などの最適化されているパフォーマ
ンス・ライブラリーを使用します
プロファイル: インテル® VTune™ Amplifier でホットスポットを特定します、インテル® Advisor でベクトル化とスレッド化の可能性を調査します

スカラー、シリアルの最適化：
コンパイラーとライブラリー の適切な精度、オプション、そして適切な機能を使用します

ベクトル化:
データレイアウトの最適化と共に コンパイラーとライブラリー の自動ベクトル化と SIMD 機能を使用します

並列化パート 1 - スレッド (共有メモリー) 並列:
インテル® Inspector、インテル® VTune™ Amplifier および インテル® コンパイラー を使用してスレッドのスケーリングを
プロファイル し、スレッドのコアへのアフィニティーを制御します

並列化パート 2 - マルチコアからメニーコアへ （分散メモリー並列）：
インテル® Trace Analyzer and Collector と インテル® MPI ライブラリー を使用して、アプリケーションをプロファイルし分
散メモリーにスケールさせます© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

3

内容
 サンプルカーネルの最適化
 プロセッサー・タイプ
 メモリーアクセス スレッド化
 同期 スレッド・アフィニティー
 明示的なベクトル化
 その他© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

4サンプルプログラム


部分的なサブイメージを大きなイメージから検索します 力作業ですべての位置をテスト
 絶対差の最小和を探す
 強度と色指数において

テストには、ランダムに背景を重ね合わせたランダムパターンを使用します
C と Fortran のソースを用意しました 両者における問題と最適化はほぼ同じです また、Windows* と Linux* バージョンも同様です (ここでは Windows* の結果を示します)

ここでは、インテル® アドバンスト・ベクトル・エクステンション 2 をサポートする、インテル® Xeon® プロセッサー E5-2699 v4、22 コア、2.20GHz を使用しています
入手方法と構成© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

5

SAD カーネル (C)struct image_data {P_TYPE *intens;// intensity (x, y)
P_TYPE *color;// color (x, y)
A_TYPE xmax; // x のイメージサイズ (ピクセル数)
A_TYPE ymax; // y のイメージサイズ (ピクセル数)};
int match(struct image_data & image, struct
image_data& feature, S_TYPE & sabdmini, S_TYPE &sabdminc){
A_TYPE x, y, u, v, result;
S_TYPE sabdmin, sabdi, sabdc;
sabdminc = sabdmini = sabdmin =(S_TYPE) 2000000000;// イメージの可能な位置をループで処理
for(x = 0; x < (image.xmaxfeature.xmax+1); x++) {for (y = 0; y < (image.ymaxfeature.ymax+1); y++) {sabdi = 0;
sabdc = 0;// 特徴画素を処理するループ
for(u = 0; u < feature.xmax; u++) {// 強度と色指数に対する絶対差の和を計算
for(v = 0; v < feature.ymax; v++) {A_TYPE uv = u + v*feature.xmax;
A_TYPE xy = x+u + (y+v)*image.xmax;
sabdi = sabdi + abs(int(feature.intens[uv] image.intens[xy]));// 空の特徴画素を除き、飽和したイメージ画素を除去
if(feature.intens[uv] > IMIN) {if(image.intens[xy] < IMAX)
sabdc = sabdc + abs(int(feature.color[uv] image.color[xy]));else
sabdc = sabdc + CMAX;}} // v ループの終わり} // u ループの終わり// 最小値の検出と記録
if (sabdi + sabdc < sabdmin) {result = x + y*image.xmax;
sabdmin = sabdi + sabdc;
sabdmini = sabdi;
sabdminc = sabdc;}}} // y ループの終わり} // x ループの終わり
return result;}© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

6ベースライン$ icl -std=c++14 /O2 set_seed.cpp init.cpp driver.cpp match.cpp /Qopt-report3 /Qansi-alias /Fesample1
LOOP BEGIN at match.cpp(37,5)<Distributed chunk1>
リマーク #153４４: loop はベクトル化されませんでした: ベクトル依存関係がベクトル化を妨げています。
analyze 1 images
SUCCESS image 0 match at (x,y) 387709 ref 387709 sabd=32350.000000 7064.000000
time per image 8.442236

sample1“最小公約数” 命令セットはデフォルト (インテル® SSE2) になります しかし、ここで使用するインテル® Xeon® プロセッサー E5 v3 (コード名: “Haswell”) は、インテル® AVX2 をサポート$ icl -std=c++14 /O2 /Qxcore-avx2 set_seed.cpp init.cpp driver.cpp match.cpp /Qopt-report3 /Qansi-alias /Fesample2
LOOP BEGIN at match.cpp(37,5)<Distributed chunk1>
リマーク #15301: PARTIAL LOOP がベクトル化されました。
analyze 1 images
SUCCESS image 0 match at (x,y) 91526 ref 91526 sabd=31112.000000 6578.000000
time per image 8.379698

sample2

ループがベクトル化された部分と、自動ベクトル化ではベクトル化できない部分に分割されたため、“Partial (部分的な)” ベクトル化が適用されています© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

7メモリーアクセス“ストライドロード” は、メモリーへのアクセス効率が悪いことを意味します
for(u = 0; u < feature.xmax; u++) {…
for(v = 0; v < feature.ymax; v++) {A_TYPE uv = u + v*feature.xmax;
A_TYPE xy = x+u + (y+v)*image.xmax;
sabdi = sabdi + abs(int(feature.intens[uv] - image.intens[xy])); // 行 37



u で連続したメモリーアクセスを行うため、u と v ループを入れ替えます$ icl -std=c++14 /O2 /Qxcore-avx2 set_seed.cpp init.cpp driver.cpp match1.cpp /Qopt-report3 /Qansi-alias /Fesample3

sample３

LOOP BEGIN at match1.cpp(34,5)
リマーク #15344: ループはベクトル化されませんでした: ベクトルの依存関係がベクトル化を妨げています…
リマーク #15346: ベクトル依存関係: FLOW の依存関係が sabdc (44:8) と sabdc (42:8) の間に仮定されました。
analyze 1 images
SUCCESS image 0 match at (x,y) 305101 ref 305101 sabd=32316.000000 6711.000000
time per image 6.470717© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

8

ループ分散コンパイラーは改善された内部ループが、安全にベクトル化できることを判断できません これは、複数の if 文でリダクションが行われているためです
そして、ループ分散の有効性を判断できませんでした ”distribute point” プラグマを使用して、リダクションを 2 つの異なるループに分割することを指示できますsabdi = sabdi + abs(feature.intens[uv] - image.intens[xy]);// チャンク 1 の終わり
#pragma distribute point
if(feature.intens[uv] > IMIN) {// チャンク 2 の始まり
if(image.intens[xy] < IMAX)
sabdc = sabdc + abs(int(feature.color[uv] - image.color[xy]));// 行 42

最初のチャンク、sabdi = sabdi + … は単純なリダクションであり、ユニットストライドでベクトル化可能です$ icl -std=c++14 /O2 /Qxcore-avx2 set_seed.cpp init.cpp driver.cpp match1a.cpp /Qopt-report3 /Qansi-alias /Fesample4
LOOP BEGIN at match1a.cpp(34,5)
sample4<Distributed chunk1>
リマーク #15301: PARTIAL ループがベクトル化されました。
リマーク#15450: マスクなしの非アライメント ユニット・ストライド・ロード: 2
analyze 1 images
SUCCESS image 0 match at (x,y) 526873 ref 526873 sabd=31868.000000 7081.000000
time per image 5.106297© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

9

スレッド化OpenMP* プラグマを使用して簡単にスレッド化を実装できます 最も上位レベル (最外のループ) でスレッド化するのが最も効果的です// イメージの可能な位置をループで処理#pragma omp parallel for private(sabdi,sabdc, x, y, u, v) // 行 26
for(x = 0; x < (image.xmax-feature.xmax+1); x++) {for (y = 0; y < (image.ymax-feature.ymax+1); y++) {…
何が起こるか見てみましょう ....
$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cp driver.cpp match2.cpp /Qopt-report3 /Qansi-alias /Fesample5
match2.cpp(26:1-26:1):OMP:_Z5matchR10image_dataS0_RfS1_: OpenMP 定義ループが並列化されました。
sample5…
analyze 1 images
FAILED image 0 match at (x,y) 435900 ref 340101 sabd=285190.000000 36914.000000
time per image 0.208410© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

10

スレッドのエラーを検出
インテル® Inspector XE を実行: inspxe-cl -collect=ti3 -- ./a.out
Warning: One or more threads in the application accessed the stack of another thread.
(アプリケーション中の複数のスレッドがほかのスレッドのスタックをアクセスしています)
4 Data race problem(s) detected (4 つのデータ競合問題が検出されました)

GUI で確認します:© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

11

スレッド化の問題を解決
OpenMP* の critical 句を使用して保護 一度に 1スレッドにのみを実行することができます この部分は低速ですが、それ以外の領域は並列に実行されます// 最小値の検出と記録#pragma omp critical{if (sabdi + sabdc < sabdmin) {result = x +y*image.xmax;
sabdmin = sabdi + sabdc;
sabdmini = sabdi;
sabdminc = sabdc;}}$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cpp driver.cpp match2a.cpp/Qansi-alias /Qopt-report3 /Fesample6
match2a.cpp(51:1-51:1):OMP:_Z5matchR10image_dataS0_RfS1_: CRITICAL の OpenMP マルチスレッド・コードが正常に生成されました。
match2a.cpp(26:1-26:1):OMP:_Z5matchR10image_dataS0_RfS1_: OpenMP 定義ループが並列化されました。
…
sample6analyze 10 images
SUCCESS image 0 match at (x,y) 87916 ref 87916 sabd=31800.000000 6563.000000 …
time per image 0.489201

Critical 句 (クリティカル・セクション) がパフォーマンスに影響 しかし、スレッド化されていないバージョンよりも高速© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

12インテル® VTune™ Amplifier XE

13

さらに効率良く:ループを分散 (分割)
critical 句 (クリティカル・セクション) にはそれほど多くの処理は含まれていません シリアル実行よりは高速 スレッド間の同期を排除しますsample7$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cpp
driver.cpp match3.cpp /Qqopt-report3 /Qansi-alias /Fesample7
match3.cpp(29:1-29:1): OMP:_Z5matchR10image_dataS0_RfS1_:
OpenMP 定義ループが並列化されました。
analyze 10 images
SUCCESS image 0 match at (x,y) 648425 ref 648425 …
...
time per image 0.217948



critical 句 (クリティカル・セクション) よりも高速// イメージの可能な位置をループで処理#pragma omp parallel for private(sabdi,sabdc, x, y, u, v)
for(x = 0; x < (image.xmax-feature.xmax+1); x++) {for (y = 0; y < (image.ymax-feature.ymax+1); y++) {…
for(v = 0; v < feature.ymax; v++) {for(u = 0; u < feature.xmax; u++) {sabdi = sabdi + …
…
sabdc = sabdc + …
}}
A_TYPE xy = x + y*(image.xmax-feature.xmax+1);
sabdi_xy[xy] = sabdi;
sabdc_xy[xy] = sabdc;}}// 最小値の検出と記録
for(x = 0; x < (image.xmax-feature.xmax+1); x++) {for (y = 0; y < (image.ymax-feature.ymax+1); y++) {int xy = x + y*(image.xmax-feature.xmax+1);
if (sabdi_xy[xy] + sabdc_xy[xy] < sabdmin) {sabdmin = sabdi_xy[xy] + sabdc_xy[xy];result = x + y*image.xmax;…
}}}© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

14

スレッド・アフィニティー
デフォルトで、OS はスレッドを 1 つのコアから他のコアへ移動できます 可変なワークロードとスレッド数には向いていますが、対称的なワークロードには向いていません 実行時間の変動につながります。例えば: .26, .20, .22, .24, .25
スレッドをコアにバインドすることで改善できます
例えば: export OMP_PROC_BIND=close または KMP_AFFINITY=compact

同じバイナリーを実行:
time per image .19
time per image .19
time per image .19
time per image .23
 より高速で一貫性があります© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

15

「ベクトル化レポート」に戻る

sample8

icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp match3.cpp /Qopt-report2 /c/Qansi-alias /Qqopt-report-phase=loop,vec
LOOP BEGIN at match3.cpp(30,2)
リマーク #15542: ループはベクトル化できませんでした:内部ループはベクトル化されています。
LOOP BEGIN at match3.cpp(31,3)
リマーク #15542: ループはベクトル化できませんでした: 内部ループはベクトル化されています。
LOOP BEGIN at match3.cpp(36,4)
リマーク #15542: ループはベクトル化できませんでした: 内部ループはベクトル化されています。
…
LOOP BEGIN at match3.cpp(38,5)<Distributed chunk1>
リマーク #15301: PARTIAL ループがベクトル化されました。
LOOP END…
LOOP BEGIN at match3.cpp(38,5)<Distributed chunk2>
リマーク #15344: ループはベクトル化されませんでした: ベクトルの依存関係がベクトル化を妨げています最初の依存関係を以下に示します。
さらに詳しい情報を取得するため、レベル 5 のレポートを生成します。
リマーク #15346: ベクトル依存関係: FLOW の依存関係が sabdc (48:8) と sabdc (46:8) の間に仮定されました。
LOOP END…
LOOP END
LOOP END
LOOP END© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

16

ベクトル化を再考察
コンパイラーは、赤字のコードが複数の慣用句を結合しているためベクトル化できませんでした

チャンク2:



for(u = 0; u < feature.xmax; u++) {A_TYPE uv = u + v*feature.xmax;
A_TYPE xy = x+u + (y+v)*image.xmax;
sabdi = sabdi + abs(int(feature.intens[uv] - image.intens[xy]));// 空の特徴画素を除き、飽和したイメージ画素を除去
if(feature.intens[uv] > IMIN) {if(image.intens[xy] < IMAX)
sabdc = sabdc + abs(int(feature.color[uv] image.color[xy]));else
sabdc = sabdc + CMAX;}}

2 つのリダクション、2 つの条件と “else” 節
個別に識別できますが、すべて同時にはできません (sabdc を依存性として識別) プログラマーの支援が必要 ...
© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

17

明示的なベクトル化
OpenMP* SIMD ディレクティブを使用して、コンパイラーにベクトル化の方法を指示:#pragma omp simd reduction(+:sabdi,sabdc)
 コンパイラーに sabdi、sabdc をリダクション変数として扱い、ベクトル化することを指示$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cpp driver.cpp match4.cpp /Qopt-report2/Qansi-alias /Fesample9

sample9…

LOOP BEGIN at match4.cpp(39,5)
リマーク #15301: OpenMP SIMD LOOP がベクトル化されました。
LOOP END…

SUCCESS image 0 match at (x,y) 78922 ref 78922 sabd=31657.000000 6084.000000...

time per image 0.196078



ループはもはや分割されず、ループ全体がベクトル化されます
SIMD は非常に強力ですが、正当性の保証はプログラマーが行う必要があります

REDUCTION、PRIVATE などの節で示される変数以外に依存関係はありません© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

18

さらに細かな最適化
最外の x と y ループをインターチェンジすることで、データの局所性を最善できます:$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cpp driver.cpp match5.cpp /Qopt-report3

sample10/Qansi-alias /Fesample10
SUCCESS image 0 match at (x,y) 376316 ref 376316 sabd=31593.000000 6598.000000
time per image 0.090124

ベクトル化レポートに次の行が含まれます:
remark #15487: 型変換: 2
 これは、すべてのリダクション変数が浮動小数点型であり、else 節では整数型であることを知るヒントとなります sabdi と sabdc を整数として宣言 (S_TYPE を変更しますが、オーバーフローしないことを確認) !
 unsiged int を int にすることで最適化に貢献 (P_TYPE, A_TYPE - image_data5.h を参照)
sample11 符号なし整数のオーバーフローを考慮しなければいけません; 符号付き整数は必要ありません$ icl -std=c++14 /O2 /Qxcore-avx2 /Qopenmp set_seed.cpp init.cpp driver.cpp match5a.cpp /Qopt-report3/Qansi-alias /Fesample11
SUCCESS image 0 match at (x,y) 867713 ref 867713 sabd=31004.000000 6241.000000...
time per image 0.078904
 最適化の効果により、型変換の警告はなくなりました。
© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

19

まとめ

最適化

ソース

イメージごとの時間 (秒) デフォルトの最適化と比較して、系統的な最適化は劇的な
スピードアップをもたらします(このシステムとカーネルでは、100 倍以上)

-O2 のベースライン

Match

8.44

-xcore-avx2

Match

8.37

ユニットストライド

Match1

6.47

部分的なベクトル化

Match1a5.10

 最適化なしの -O0 比較すると、300 倍以上

OpenMP + criticalmatch2a0.48

distributematch30.21

 試みた価値があります !

スレッド・アフィニティー match3

0.22

SIMD ベクトル化

match40.19

外部ループを入れ換え

match5

0.09

型変換なし

match5a0.07

性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や
MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンス
を総合的に評価することをお勧めします。

© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

20

パフォーマンスに優れたコード
無料の 30 日間のインテル® Parallel
Studio XE 評価版をダウンロード:
makebettercode.com/parallelstudioxe-eval ›© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

21

関連情報
OpenMP* に関する情報

コードモダン化のリンク

OpenMP* による SIMD を利用するベクトル・プ
ログラミング

http://jp.xlsoft.com/documents/intel/catalog/I
ntel_ParallelUniverse_Issue22_JPN.pdf



OpenMP* の現在と将来
https://jp.xlsoft.com/documents/intel/magazi
ne/Intel_ParallelUniverse_Issue27_JPN.pdf

インテル® Xeon Phi™ プロセッサー向けにコードを現代化

https://jp.xlsoft.com/documents/intel/magazi
ne/Intel_ParallelUniverse_Issue26_JPN.pdf



モダンコード開発者コミュニティー
http://www.isus.jp/modern-code/インテル® コードモダン化プログラム
https://software.intel.com/codemodernization-enablementインテル® Parallel Computing Centers
https://software.intel.com/ipcc
技術ウェビナーシリーズ
https://software.intel.com/events/developm
ent-tools-webinars
インテル® Parallel Universe マガジン (日本語訳)
http://www.isus.jp/products/psxe/issue/© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

22サンプルコードの入手方法
インテル® Developer Zone の以下の URL をアクセスしてください:https://software.intel.com/enus/videos/accelerate-applicationperformance-with-openmp-andsimd-parallelism
画面中ほどにある 「Resources」 をクリックすると、*tgz (Linux* 用) と *.zip(Windows* 用) のサンプルコードを
ダウンロードできます© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

サンプルコードの構成
image_data.h
image_data5.hdriver.cpp
init.cpp
set_seed.cpp
match.cpp
match1.cpp
match1a.cpp
match2.cpp
match2a.cpp
match3.cpp
match4.cpp
match5.cpp

イメージデータのデータ構造定義
sample11 用イメージデータ構造定義
main ルーチン
初期化関数
データ初期化用の乱数データ生成
sample1、sample2 用のソース
sample3 用のソース
sample4 用のソース
sample5 用のソース
sample6 用のソース
sample7、sample8 用のソース
sample9 用のソース
sample10、sample11用のソース© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

page5 へ戻る

役立つ記事
自動ベクトル化が失敗した場合の対処:
https://www.isus.jp/products/c-compilers/what-to-do-when-auto-vectorization-fails/
ベクトル化によるパフォーマンスの向上:
https://www.isus.jp/products/c-compilers/improve-performance-with-vectorization/
コンパイラー最適化入門： 第1回 SIMD 命令とプロセッサーの関係:
https://www.isus.jp/products/c-compilers/compiler_part1/
インテルのベクトル化ツール:
https://www.isus.jp/intel-vectorization-tools/
ケーススタディー: インテル® アドバンスト・ベクトル・エクステンションを使用したブラック-ショールズの計算:
https://www.isus.jp/financial/case-study-computing-black-scholes-with-avx/
インテルの最新の並列化ツールによる明示的なベクトル化:
https://www.isus.jp/products/psxe/vectorization-gets-explicit/
明示的なベクトル・プログラミング – 最も一般的な手法:
https://www.isus.jp/products/psxe/explicit-vector-programming-bkm/
ループのベクトル化によるプログラムの最適化:
https://www.isus.jp/products/c-compilers/program-optimization-through-loop-vectorization/© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

最適化

ソース

イメージごとの時間 (秒) デフォルトの最適化と比較して、系統的な最適化は劇的な
スピードアップをもたらします(このシステムとカーネルでは、30 倍以上)-O2 のベースライン

Match

7.64

-xcore-avx2

Match

6.83

ユニットストライド

Match1

7.74

部分的なベクトル化

Match1a5.37

 最適化なしの -O0 比較すると、80 倍以上OpenMP + criticalmatch2a

1.17

distributematch3

1.13

 試みた価値があります !

スレッド・アフィニティー match3

1.08

SIMD ベクトル化

match40.36

外部ループを入れ換え

match5

0.34

型変換なし

match5a0.25Core i7 4790K 4.00GHz の結果

性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や
MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンス
を総合的に評価することをお勧めします。

© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

26

インテル® マイクロアーキテクチャー Skylake Server
速報 !
•
•
•
•
•
•
•
•

Skylake Server✝ マイクロアーキテクチャー・ベースの新しいコアは、Kaby Lake✝ マイクロアーキテクチャーを基に改善を行っています
インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) のサポート
ソケットあたりのコア数の増加 (最大 28 対最大 22)
Skylake✝ マイクロアーキテクチャーではソケットあたり 6 本のメモリーチャンネル(Broadwell✝ マイクロアーキテクチャーは 4 チャンネル)より大きな L2 キャッシュと小さな非インクルーシブな L3 キャッシュインテル® Optane™ をサポート
インテル® Omni-Path アーキテクチャー (Intel® OPA)
サブ NUMA クラスタリング (SNC) をサポート© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

Skylake Server✝ マイクロアーキテクチャーの CPU
コア・パイプライン© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

Skylake Server✝ マイクロアーキテクチャーにおけるキャッシュ© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

サブ NUMA クラスタリング
サブ NUMA クラスタリング (SNC) は、ラスト・レベル・キャッシュ (LLC) からメモリーへの平均レ
イテンシーを改善するモードです。これは、以前の世代のインテル® Xeon® プロセッサー E5 ファ
ミリーにおけるクラスター・オン・ダイ (COD) の実装を置き換えるものです

•
•
•
•

単一のウルトラ・パス・インターコネクト (UPI) キャッシュ・
エージェントが必要です
リモートクラスターへのメモリー・アクセス・レイテンシー
は小さく、UPI フローは必要ありません
LLC でラインが複製されることはないため、LLC の容量をより効率良く利用できます
リモートクラスターのアドレスがローカルクラスターの
LCC にキャッシュされることがないため、クラスター・オ
ン・ダイ (COD) 方式に比べレイテンシーが大きくなることがあります© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

プログラミングへの影響
推奨事項: アプリケーションの共有およびプライベート・データのサイズを、小さな非イン
クルーシブ L3 キャッシュと大きな L2 キャッシュに合わせて再度バランスを取ります
推奨事項: L2 キャッシュがアプリケーションの帯域幅要件を満たすことができるのであれば、Skylake Server✝ マイクロアーキテクチャーでは L2 へのブロック化を検討します
推奨事項: データを共有しない場合、アプリケーションは コアあたりのキャッシュ容量を
L3 キャッシュだけでなくL2 と L3 キャッシュサイズの合計であると見なすべきです© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

著作権と商標についておよび最適化に関する注意事項
本資料に掲載されている情報は現状のまま提供され、いかなる保証もいたしません。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するためのものではありません。製品に付属の売買契約書『Intel's Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品性に関する保証、第三者の特許権、著作権、その他、知的財産権の侵害への保証を含む) をするものではありません。
性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や
MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。
© 2017 Intel Corporation.All rights reserved.Intel、インテル、Xeon、Xeon Phi、Intel ロゴは、アメリカ
合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

最適化に関する注意事項
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミン
グ SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイ
クロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。
改訂 #20110804© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。 コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

32

© 2017 Intel Corporation.All rights reserved.Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
最適化に関する注意事項

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