インテル® アーキテクチャー向け
最適化メソッドのご紹介
エクセルソフト株式会社
黒澤 一平© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

インテル® VTune™ Amplifier XE の概要
 パフォーマンス・ボトルネック解析プロファイラー• プログラムの実行に時間がかかる処理、足かせとなる箇所を特定する

 動的サンプリングで統計データを表示• 実行中のターゲットに対し、システム割り込みを利用して各種データを収集する

 アプリケーション・レベルのパフォーマンス解析• Hotspots（CPU 使用率の高い処理）の検出が可能

 マイクロアーキテクチャー・ レベルのパフォーマンス解析• CPI 値、キャッシュミス、メモリー帯域幅、分岐予測ミス、ストールなどの解析が可能© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

2

インテル® VTune™ Amplifier XE のコマンドラインと GUI$ amplxe-cl -collect knc-hotspots -search-dir
all=/lib/firmware/mic -search-dir
all=/home/spec/benchspec -/home/spec/benchspec/run.sh

サーバーや、クラスターシステムなどの GUI 環境のないシステムでは、コマンドラインでリモート解析し、GUI 環境のあるシステムで結果を確認することができる© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

3

サンプリング手法
 ユーザーモード・サンプリングおよびトレース・コレクション（User-Mode Sampling and Tracing Collection）
または “タイムベース・サンプリング・コレクション”(TBS)MIC 非対応• プロセッサーに周期的に割り込みを入れて、その割り込み処理の中で、IP(インストラクション・ポインター) や各種スレッド情報などを収集するサンプリング手法。
• デフォルトでは、10ms に １ 回の割合で割り込みを入れてデータを収集する。
• その際のオーバーヘッドは約 5％。

 イベントベース・サンプリング・コレクション (EBS)（Hardware Event-based Sampling Collection）

MIC 対応• インテル® プロセッサーに搭載されるパフォーマンス・モニタリング・ユニット (PMU) のイベントカウンター・オーバーフローによる割り込みを利用したサンプリング手法。
• この割り込みの発生回数がサンプリング回数となる。
• 割り込み発生の頻度は、PMU のオーバーフロー値を決定する “Sample After Value”を調節することで制御できる。
• 1ms 単位で割り込みが発生した場合、それによるオーバーヘッドは約 2％ 程度。
• 本サンプリング機能を使用できるプロセッサーは、以下のように限定される。

サポート対象 CPU： インテル® Pentium® M プロセッサー、インテル® Core™ マイクロアーキテクチャー以降
インテル® Atom™ プロセッサー
サポート非対象 CPU：インテル® Pentium® 4 プロセッサー・ファミリー以前、インテル以外のプロセッサー• NMI Watchdog の設定は無効にする。

© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

4

プリセットされた解析タイプ

イベントベース・サンプリング（EBS）

タイムベース・サンプリング（TBS）
イベントベース・サンプリング（EBS）
解析タイプ (コマンドライン)<EBS>advanced-hotspots
snb-general-exploration
knc-hotspots
knc-general-explorationなど<TBS>
hotspots
concurrency
locksandwaits© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

5

結果内容 （GUI）
解析タイプ

ビューポイント(設定変更可能)

Bottom-up ペイン
Top-down Tree ペイン

コール・スタック・ペイン

タイムライン・ペイン© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

6

ソースコードの表示
 関数レベルからソースコード・レベルへドリルダウンして結果を表示

選択したソースコード・ラインに対応したアセンブリー・コードがハイライトされる

ソースレベルで収集データを表示

アセンブリー・レベルで収集データを表示(ブロック単位での表示)© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

7

結果内容 （コマンドライン）© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

8

新機能：インテル® HD グラフィックス対応© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

9

新機能： コーリー・スタック(呼び出し先情報)
表示の追加© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

10

新機能：OpenMP* フレームの表示© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

11

新機能: その他
・Java プロセスのハードウェア・イベントベース・サンプリングに対応・Windows 8* において、C# と JavaScript ベースの Windows* ストア
アプリケーションのハードウェア・イベントベース・サンプリングに対応JavaScript の解析結果© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

12

Performance Monitoring Unit (PMU)
プロセッサー、コプロセッサー

PMU

データ要求
モニターされたイベント• プロセッサー、コプロセッサーに実装されている
Performance Monitoring Unit (PMU) というバッファーに、モニターされたハードウェア・イベントが保存されている• インテル® VTune™ Amplifier XE は設定したタイミングでPMU からデータを取得する• 各コアから得た情報を統計することでイベントベース・サンプリング (EBS) の結果を表示する© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

13

インテル® VTune™ Amplifier XE のコマンドライン※MPI アプリケーションの解析はコマンドラインのみ対応
amplxe-cl -collect <Analysis Type> -- <program><Analysis Type>lightweight-hotspots、hotspots、concurrency、locksandwaits、core2-general-exploration、nehalem-general-exploration、snb-general-explorationなど

コマンド例:
amplxe-cl -collect snb-general-exploration -- ./sample.exe
MPI アプリケーションの場合は 1 ノードに 1 起動するように設定
mpiexec -host host001 -n 1 amplxe-cl -collect <Analysis Type> -r<name> -- <program>: -host host001 -n 15 <program>: -host
host 002 -n 1 amplxe-cl -collect <Analysis Type> -r <name> -<program>: -host host002 -n 15 …

© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

14

CPI Rate (Clockticks per Instructions Retired Rate)CPI Rate = Clockticks / Instructions Retired= CPU_CLK_UNHALTED.THREAD / INST_RETIRED.ANY
ハードウェアが効果的に活用できているかを確認することができます。インテル®
Core™ i7 プロセッサーやインテル® Xeon® プロセッサーの場合には 0.25 が最良値であり、この値のセルが赤くなる場合には最適化によりパフォーマンスを考える必要があります。
CPI Rate の最良値が 0.25 である理由
1. 命令セットはマイクロオペレーションと呼ばれる微細な命令に分割され、21実行ユニット

2. コア内では、実行可能なマイクロオペレーションから先に順次実行されます。

3. インテル® Core™ i7 プロセッサーでは、1 コア内で最大 4 つのマイクロオペレーションを同時に完了させることができます。
3

1 CPU サイクルで 4 つのマイクロオペレーションを完了させた場合、CPI Rate は1/4＝0.25 となります。
CPI Rate により、ハードウェアの性能を正しく発揮することができたか確認することができます。

© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

15

CPI を確認

この関数は CPI=6.389 であるため、さらなる性能の向上が期待できる© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

16

インテル® Xeon Phi™ コプロセッサーの CPI
インテル® Xeon Phi™ コプロセッサーのスレッドあたりの CPI= CPU_CLK_UNHALTED / INSTRUCTIONS_EXECUTED
1 命令あたりのサイクル数、CPI を確認することで効率性を評価することができる

CPI は小さいほど効率性が高いことを意味する
最小理論値はアーキテクチャーによって異なる
・インテル® Xeon® プロセッサーは CPI=0.25 が最良であったが、・インテル® Xeon Phi™ コプロセッサーは CPI=2 が最良
インテル® Xeon Phi™ コプロセッサーでは、CPI=4 以上は非効率
イベント

意味

CPU_CLK_UNHALTED

実行されたコアのサイクル数

INSTRUCTIONS_EXECUTED

スレッドによって実行された命令の数© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

インテル® VTune™ Amplifier XE を使用した
パフォーマンス分析の一般的な手順
1. Hotspots（CPU 時間を要している関数）を特定
2. イベントベース・サンプリングを行い Hotspots の効率性を評価する

3. Hotspots が非効率的と判断できる場合、パフォーマンスに影響を及ぼすハードウェア・イベントを確認し、問題を修正する
4. すべての重要な Hotspots が評価されるまで 1～3 を繰り返す© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

18

プロセッサーのパイプライン・パイプラインと呼ばれる多段階の小さな処理ステージに分けられて実行される・複数の処理を隙間なく送り込むことによって、効率化されている
時間の経過

1

処理 A
処理 B

234512345123451234

処理 C
処理 Dn-1nn-1nn-1

5nn-1n※ しかし、分岐予測ミスが生じるとこの中身をすべて入れ替えなければならないため、パイプラインが深いほど大きな遅延が発生する
12

TC Nxt IP

34

TC Fetch

56

Drive Alloc

789101112Rename

QueSchSch

Sch14151617181920

Disp Disp

RFRF

ExFlgsBr Ck

Drive13

最もパイプラインが深い Intel NetBurst® マイクロアーキテクチャー© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

19© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

20

インテル® VTune™ Amplifier XE による分岐予測ミスの分析

BR_INST_RETIRED.MISPRED / BR_INST_RETIRED.ANY
最良値は 0© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

21

分岐予測ミスの回避
for (j = 0; j < size; j++ )if ( blend = 255 ){for ( j = 0; j < size; j++ )if ( blend == 255 )dest[j] = src_1[j];dest[j] = src_1[j];else if ( blend == 0 )else if ( blend == 0 )for ( j = 0; j < size; j++ )dest[j] = src_2[j];dest[j]= src_2[j];elseelse

dest[j] = ( src_1[j] * blend + src_2[j] *for ( j = 0; j < size; j++ )(255-blend) ) / 256;}

dest[j] = ( src_1[j] * blend + src_2[j] *(255-blend) ) / 256;

ループ内で評価不要な分岐をループの外に出して分岐予測ミスの発生をふせぐ© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

22

インテル® Xeon® プロセッサーとインテル® Xeon Phi™
コプロセッサーのキャッシュ構造の違い
インテル® Xeon® プロセッサー

インテル® Xeon Phi™ コプロセッサー

実行unit

実行unit実行unit

実行unit

実行unit

実行unit

実行unit

実行unit

L1

L1

L1L1

L1

L1

L1

L1

L2

L2

L2L2L2L2L2L2

L3

GDDR5DDR3© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

23

キャッシュによる高速化
コアA

コアB

実行unit A

実行unit B

L1

A

L2

A

B
B

1. コアA がデータ A を要求
2. コアA の L2 キャッシュにコピーされていたデータ A が使用される

L1

L2

a. コアB がデータ B を要求
b. コアA が作り出したデータ B は
コアA の L2 キャッシュから使用される

L3

A
DDR3

より近くから (時間のかからないキャッシュから) データを取り寄せるようにして、読み込み待ちの遅延を少なくしている© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

24

実行ユニットへのデータ転送に要する時間と容量100~

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

DDR3124
L143~60
他の
26~31
L2L3L2インテル® Xeon Phi™
コプロセッサー

L132KB

32KB

L2256KB

512KB

L32MB/
コア

なし

～4TB

～16GB

DDR3
GDDR5

実行ユニットSandyBridge† アーキテクチャーの転送時間 (単位は CPU サイクル)

キャッシュ、メモリーの容量†開発コード名© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

25

インテル® VTune™ Amplifier XE によるデータ転送によるパフォーマンス問題の分析

キャッシュミスが多発する箇所を特定© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

26

キャッシュラインの分割• キャッシュラインは 64 バイト• データ要素がキャッシュ境界をまたがないようにする• キャッシュ境界をまたぐと、そのデータ要素にアクセスするためには、1 回ではなく 2 回のアクセスが必要になるため、パフォーマンスが低下する

キャッシュライン

キャッシュライン

Index 0Index 0前半

Index 0後半

Index 1キャッシュライン分割の状態

Index 15

Index 16キャッシュラインをまたがない状態© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

27

アライメント
アライメントされているとより高速に処理することができる。
キャッシュラインの分割と同様に、高速演算のためには16,32,64 バイト境界をまたがない配列の確保が有効。
インテル® AVX 向けには 32 バイト、インテル® MIC アーキテクチャー
向けには 64 バイト (512bit) でアライメント(C/C++)__declspec(align(64)) float A[100][1024];※ __ はアンダーバー2つ(Fortran)
real*4 A(1024,100)!DEC$ATTRIBUTES ALIGN: 64:: A© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

28

キャッシュの利用効率
コードの書き方で変わるキャッシュの利用効率
for (j=0; j<N; j++)for (i=0; i<N; i++)A[j][i] += B[j][i] * C[j][i]ijfor (i=0; i<N; i++)for (j=0; j<N; j++)A[j][i] += B[j][i] * C[j][i]© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

29

アクセスの効率性

非効率なアクセス
for (j=0; j<N; j++)A[j][i]A[0][1]
A[0][2]：
A[0][1021]
A[0][1022]
A[0][1023]
A[1][0]A[1][1]：A[1][1021]
A[1][1022]
A[1][1023]
A[2][0]A[2][1]：© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

効率が良いアクセスfor (i=0; i<N; i++)A[j][i]30

メモリーとキャッシュサイズ
for(i=tidx; i<msize; i=i+numt) {for(k=0; k<msize; k++) {for(j=0; j<msize; j++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];メモリー上の c[ ][ ] 領域0コアのキャッシュ・・・・・・・・

キャッシュにはすべてのデータが入らない© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

使用されるメモリーの状況
for(i=tidx; i<msize; i=i+numt) {for(k=0; k<msize; k++) {for(j=0; j<msize; j++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];最内のループでは、以下のようにメモリーが使用されている
jikijk※メモリー上に展開される配列を簡略的に表した図
このような記述であれば、いずれキャッシュ容量を使い切ってしまう© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

32

キャッシュに着目した最適化
キャッシュ中の小さなブロックのデータにも影響するようにネストを再配置する
for(i=tidx; i<msize; i=i+numt) {for(k=0; k<msize; k++) {for(j=0; j<msize; j++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];ブロッキングfor (i0 = ibeg; i0 < ibound; i0 +=mblock) {for (k0 = 0; k0 < msize; k0 += mblock) {for (j0 =0; j0 < msize; j0 += mblock) {for (i = i0; i < i0 + mblock; i++) {for (k = k0; k < k0 + mblock; k++) {for (j = j0; j < j0 + mblock; j++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

33

ブロッキングにより書き換えを防ぐ
for (i0 = ibeg; i0 < ibound; i0 +=mblock) {for (k0 = 0; k0 < msize; k0 += mblock) {for (j0 =0; j0 < msize; j0 += mblock) {for (i = i0; i < i0 + mblock; i++) {for (k = k0; k < k0 + mblock; k++) {for (j = j0; j < j0 + mblock; j++) {c[i][j] = c[i][j] + a[i][k] * b[k][j];for ループの繰り返し回数をmsize から mblock に変更し、アクセス範囲を限定する

データタイプ × mblock 分
ただし、キャッシュラインをまたがないjikijk

キャッシュ上のデータを書き換えないようして (ブロッキング)
メモリーの読み込みとキャッシュ入れ替えによる遅延の発生を防ぐ。

© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

34

他のブロッキング例
for(i=0;i<MAXI;i++)for(j=0;j<MAXJ;j++)A[j][i] = A[j][i] + B[i][j];for(ii=0;ii<MAXI/BLOCKI;ii++)for(jj=0;jj<MAXJ/BLOCKJ;jj++)
for(i=(ii*BLOCKI);i<((ii+i)*BLOCKI);i++)for(j=(jj*BLOCKJ);j<((jj+j)*BLOCKJ);j++)A[j][i] = A[j][i] + B[i][j];ib00b01b02b03

b10

b11b12b13…

…

… b0N-1… b1N-1
…
…

i…

…

…

bN-10

…

aN-1N-1

B

…

aN-10

aiN-1

j…

a31

…

a30…

a21…

a20

… a0N-1… a1N-1
…
…

…

a11…

a10…

a01…

ja00

…

A

=キャッシュライン・ サイズ

bN-1N-1

読み込んだ A のキャッシュラインのデータが消えないように使用する© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

35

キャッシュに関するパフォーマンス問題の修正
Hotspots で使用されるデータについて以下の修正を検討する
・データ・アライメント

・キャッシュ・ブロッキング・連想性 (set associativity) による L1 の 4KB のアクセス間隔またはデータサイズ、L2 の 64KB のアクセス間隔などは遅延を招くため、パディングバイトを追加する
パディングバイトの追加
1 キャッシュライン分 (64byte) の余分なデータ要素を追加することで、キャッシュが頻繁に上書きされることによる遅延を回避することができる© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

36

さまざまなボトルネックの原因を特定
キャッシュに関係するボトルネック
実行ユニット実行ユニットに近いほど、データを保存できる容量が小さいた
め、データ転送が間に合わない

L1D
L2

DDR3

分岐予測ミスによるボトルネック
条件分岐などの予測ミスが生じると、プロセッサーのパイプラインに準備された命令を廃棄することになり、処理遅延が発生する。
多発する分岐予測ミスがある箇所の分岐方法や処理方法を変更して、パフォーマンスを改善させる。

x16 PCIe演算に必要なデータがどこまで来ているかを確認し、コードを修正することによってパフォーマンスを改善させる

メモリーバンド幅に関するボトルネック
転送速度を確認し、規定を下回ればコードを修正する
その他、さまざまなボトルネックに対応© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

37

何に注目して最適化すべきか
Micro-ops
Issued?

Micro-ops: マイクロオペレーション
Retire: 実行が完了

No

Yes

Allocation
Stall?

NoCore Front End
Bound

マイクロオペレーションの供給不足 (フロントエンドに 1サイクルあたり 4 以下のマイクロオペレーションしか供給されない)

Micro-op ever
Retire?

Yes

NoCore Back End
Bound

Bad
Speculation

メモリーアクセス、実行、ディスパッチ、割り当てがボトルネック

分岐予測ミスを復旧する必要があり、遅延になっている

Yes
Retiring

リタイアの成功 – アルゴリ
ズム的な経路の長さがサイクルを消費している

 解析タイプ “General Exploration” でのサンプリング結果を “General Exploration” ビューポイントで表示した場合の項目© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

38

最適化に関する注意事項
インテル® コンパイラーは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング
SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。インテル® マイクロアーキテクチャーに非固有の特定の最適化は、インテル製マイクロプロセッサー向けに予約されています。この注意事項の適用対象である特定の命令セットの詳細は、該当する製品のユーザー・リファレンス・ガイドを参照してください。
改訂 #20110804

Intel ロゴ、Intel Inside ロゴ、Intel Atom、Intel Atom Inside、Intel Core、Core Inside、Intel NetBurst、Intel Xeon Phi、Pentium、Xeon、Xeon Inside、VTune は、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。

© 2013 Intel Corporation. 無断での引用、転載を禁じます。*その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

39