最新のインテル® Parallel Studio XE を用い
た
迅速なベクトル化と並列化手法
インテル株式会社
技術本部ソフトウェア技術統括部
シニア・スタッフ・エンジニア
池井 満
議題
• プロセッサーの動向とコード・モダナイゼーション
• インテル® アドバンスト・ベクトル・エクステンション 512 (インテル®
AVX-512) 命令と演算性能
• ベクトル化を支援するインテル® Advisor
– ループの性能を可視化するルーフライン表示
• 姫野ベンチマークを用いたインテル® Xeon Phi™ プロセッサー上でのケー
ス
スタディー
– 並列化とベクトル化の検討
– インテル® VTune™ Amplifier によるメモリー使用表示
– メモリー階層 (高速メモリー) の影響
– NUMA 構成 (クラスター) の影響
Hi-K メタルゲート
ストレインド・シリコン
3D トランジスター
65nm
45nm
32nm
22nm
14nm
10nm 7nm
90nm
高機能で複雑な新しい製品を、
電力、価格、大きさを制御しながら提供する
予測に沿った半導体の微細化
ムーアの法則に沿って
製造を続ける
インテル®
Xeon®
プロセッサー
64-bit
インテル®
Xeon®
プロセッサー
5100
シリーズ
インテル®
Xeon®
プロセッサー
5600
シリーズ
インテル®
Xeon®
プロセッサー
E5-2600
(Sandy
Bridge
✝)
インテル®
Xeon®
プロセッサー
E5-2600 v2
(Ivy Bridge
✝)
インテル®
Xeon®
プロセッサー
E5-2600 v3
(Haswell
✝)
インテル®
Xeon®
Platinum
81xx
プロセッサー
(Skylake
✝)
インテル®
Xeon Phi™
コプロセッサー
Knights
Landing
✝
コア数
1
2
6
8
12
18
28
61
72
スレッド数
2
2
12
16
24
36
56
244
288
SIMD 幅
128
128
128
256
256
256
512
512
512
インテル®
SSE2
インテル®
SSSE3
インテル®
SSE4.2
インテル®
AVX
インテル®
AVX
インテル®
AVX2
FMA
インテル®
AVX-512
IMCI
インテル®
AVX-512
より多いコア数. より幅広いベクトル. コプロセッ
サー
性能を活かすにはすべての並列性を利用することが必要
Images do not reflect actual die sizes
3+
Tflops
インテル®
Xeon®
プロセッサー
64-bit
インテル®
Xeon®
プロセッサー
5100
シリーズ
インテル®
Xeon®
プロセッサー
5600
シリーズ
インテル®
Xeon®
プロセッサー
E5-2600
(Sandy
Bridge
✝)
インテル®
Xeon®
プロセッサー
E5-2600 v2
(Ivy Bridge
✝)
インテル®
Xeon®
プロセッサー
E5-2600 v3
(Haswell
✝)
インテル®
Xeon®
Platinum
81xx
プロセッサー
(Skylake
✝)
インテル®
Xeon Phi™
コプロセッサー
Knights
Landing
✝
コア数
1
2
6
8
12
18
28
61
72
スレッド数
2
2
12
16
24
36
56
244
288
SIMD 幅
128
128
128
256
256
256
512
512
512
インテル®
SSE2
インテル®
SSSE3
インテル®
SSE4.2
インテル®
AVX
インテル®
AVX
インテル®
AVX2
FMA
インテル®
AVX-512
IMCI
インテル®
AVX-512
より多いコア数. より幅広いベクトル. コプロセッ
サー
性能を活かすにはすべての並列性を利用することが必要
Images do not reflect actual die sizes
3+
Tflops
単精度数 16 個の FMA 演算
を 2 個同時に計算できる
プログラミング方法の再検討
コード・モダナイゼーション
• 数コアのプロセッサーから始まって一貫したモデル、言語、ツールや手法で
メニーコアに対応することで、持続的な価値を生み出すことができる
• アプリケーションは利用できるすべての並列性を活用する
-
命令レベル: コアの特性を知り、考慮
-
データレベル: SIMD 命令を用いるようにベクトル化
-
スレッドレベル: OpenMP* などの標準ツールで並列化
-
クラスターレベル: MPI などの標準ツールで並列化
• 専門家がプロセッサーに最適化した標準ライブラリーや言語を利用する
• ヘテロジニティーまで考慮した最適化を検討する
Cluster Edition
Professional Edition
Composer Edition
インテル® Parallel Studio XE
高速なコードを素早く開発
コードを強力に支援
-
isus.jp/intel-parallel-studio-xe/
スケール
クラスターツール
インテル® Trace Analyzer &
Collector
MPI チューニングと解析
インテル® MPI ライブラリー
メッセージ・パッシング・
インターフェイス・ライブラリー
インテル® Cluster Checker
クラスター診断エキスパート・システム
インテル® VTune™
Amplifier
パフォーマンス・プロファイラー
解析
解析ツール
インテル® Advisor
ベクトル化の最適化と
スレッドのプロトライプ生成
インテル® Inspector
メモリー/スレッドのデバッ
ガー
オペレーティング・システム: Windows*、Linux*、macOS*
1
インテル® アーキテクチャー・ベースのプラットフォーム
ビルド
コンパイラーとライブラリー
インテル® C/C++
コンパイラー
最適化コンパイラー
インテル® Distribution for Python*
ハイパフォーマンスなスクリプト
インテル® MKL
3
高速なマス・カーネル・
ライブラリー
インテル® IPP
4
画像、信号、データ処理
インテル® TBB
2
C++ スレッド・ライブラ
リー
インテル® DAAL
5
データ解析、
マシンラーニング・ライブラリー
インテル® Fortran
コンパイラー
最適化コンパイラー
Cluster Edition
Professional Edition
Composer Edition
インテル® Parallel Studio XE
高速なコードを素早く開発
スケール
クラスターツール
インテル® Trace Analyzer &
Collector
MPI チューニングと解析
インテル® MPI ライブラリー
メッセージ・パッシング・
インターフェイス・ライブラリー
インテル® Cluster Checker
クラスター診断エキスパート・システム
インテル® VTune™
Amplifier
パフォーマンス・プロファイラー
解析
解析ツール
インテル® Advisor
ベクトル化の最適化と
スレッドのプロトライプ生成
インテル® Inspector
メモリー/スレッドのデバッ
ガー
オペレーティング・システム: Windows*、Linux*、macOS*
1
インテル® アーキテクチャー・ベースのプラットフォーム
ビルド
コンパイラーとライブラリー
インテル® C/C++
コンパイラー
最適化コンパイラー
インテル® Distribution for Python*
ハイパフォーマンスなスクリプト
インテル® MKL
3
高速なマス・カーネル・
ライブラリー
インテル® IPP
4
画像、信号、データ処理
インテル® TBB
2
C++ スレッド・ライブラ
リー
インテル® DAAL
5
データ解析、
マシンラーニング・ライブラリー
インテル® Fortran
コンパイラー
最適化コンパイラー
SIMD 命令を活用するため
の強力なツール
インテル® Advisor
新機能: ルーフライン、高速な解析、ほか…
インテル® Advisor – ベクトル化の最適化
ルーフライン解析により効率良く最適化
影響の大きい最適化されていないループを見つける
キャッシュまたはベクトル化の最適化が必要か?
演算負荷の高いアルゴリズムのほうが良いか?
高速なデータ収集
モジュールでフィルター – 必要なもののみ計算
詳細な解析を追跡 – すべてのサイトが実行されたら停止する
より多くのデータと推奨事項により的確な判断が可能
インテル® MKL フレンドリー – コードが最適化されているか? 最適なバージョンが使用されてい
るか?
トリップカウントと関数呼び出しカウント
上位 5 つの推奨事項をサマリーに表示
動的な命令ミックス – エキスパート機能により各命令の正確なカウントを表示
簡単に MPI を起動
コマンドライン・ダイアログで MPI をサポート
インテル® Xeon® プロセッサーとインテル® Xeon Phi™
プロセッサー向け命令セット・アーキテクチャー (ISA)
KNL
✝インテル®
Xeon Phi™
SSE*
AVX
AVX2
SKL
✝インテル®
Xeon®
SSE*
AVX
AVX2
SNB
✝SSE*
AVX
HSW
✝SSE*
AVX
AVX2
NHM
✝SSE*
AVX512F
AVX512F
AVX512CD
AVX512CD
AVX512ER AVX512PF Pftchwt1 AVX512DQ AVX512BW AVX512VL大きいコア
低レイテンシーに注力/マルチスレッド・シングルスレッド
エンタープライズ、HPC 向け SIMD サポート
ベスト・パフォーマンスで一般的なワークロードの
パフォーマンスを最適化
小さいコア
スループットに注力/多くのスレッド (メニーコア)
HPC 向け SIMD サポート
パフォーマンス/ワットにおいて業界のリーダーシップ
SKL: インテル® Xeon® スケーラブル・プロセッサー (開発コード名
Skylake)
論理レジスターファイルの拡張
EAX
RAX
RBX
RCX
RDX
RBP
RSI
RDI
RSP
R8
R9
R10
R11
R12
R13
R14
R15
EBX
ECX
EDX
EBP
ESI
EDI
ESP
MM0/ST0
MM1/ST1
MM2/ST2
MM3/ST3
MM4/ST4
MM5/ST5
MM6/ST6
MM7/ST7
EFLAGS
RIP
XMM0 ZMM0 XMM1 ZMM1 XMM2 ZMM2 XMM3 ZMM3 XMM4 ZMM4 XMM5 ZMM5 XMM6 ZMM6 XMM7 ZMM7 XMM8 ZMM8 XMM9 ZMM9 XMM10 ZMM10 XMM11 ZMM11 XMM12 ZMM12 XMM13 ZMM13 XMM14 ZMM14 XMM15 ZMM15K0
K1
K2
K3
K4
K5
K6
K7
インテル® SSE (128)/インテル® AVX (256)/
インテル® AVX (512)
レジスター
MASK レジス
ター(64)
汎用レジスター (32/64)
インテル® MMX® テクノロジーお
よび
浮動小数点レジスター (64)
プログラムカウンター (32/64)
インテル® SSE: インテル® ストリーミング SIMD 拡張命令
ZMM16 ZMM17 ZMM18 ZMM19 ZMM20 ZMM21 ZMM22 ZMM23 ZMM24 ZMM25 ZMM26 ZMM27 ZMM28 ZMM9 ZMM30 ZMM31単一のベクトルレーンを使用しない!
ベクトル化およびスレッド化されていないソフトウェアは、パフォーマンスを得ら
れません
SIMD (Single Instruction Multiple Data) 命令
for(i = 0; i <= MAX; i++)
c[i] = a[i] + b[i];
+
a[i]
b[i]
c[i]
+
a[i]
b[i]
c[i]
+
a[i]
a[i+1] a[i+2] a[i+3] a[i+4] a[i+5] a[i+6] a[i+7]
b[i]
b[i+1] b[i+2] b[i+3] b[i+4] b[i+5] b[i+6] b[i+7]
c[i]
c[i+1] c[i+2] c[i+3] c[i+4] c[i+5] c[i+6] c[i+7]
+
a[i]
a[i+1] a[i+2] a[i+3] a[i+4] a[i+5] a[i+6] a[i+7]
b[i]
b[i+1] b[i+2] b[i+3] b[i+4] b[i+5] b[i+6] b[i+7]
c[i]
c[i+1] c[i+2] c[i+3] c[i+4] c[i+5] c[i+6] c[i+7]
for(i = 0; i <= MAX; i+8)
一般的なループのベクトル化の問題
ループの反復 (イテレーション) 間に依存性があってはならない
– 一部の依存ループはベクトル化が可能
ループ内の変数は明確でなければならない
多くの関数呼び出しはベクトル化できない
条件分岐はベクトル化を妨げる
– 比較的単純な IF 文はマスクによりベクトル化可能
ループはカウント可能でなければならない
ネストするループの外部ループはベクトル化できない
混在データ型はベクトル化できない
インテル® Advisor
スレッド化とベクトル化によるアプリケーションのパフォーマンスを向上
コンパイラーは常にコードをベクトル化するとは限りません
インテル® Advisor
を使用してループ伝搬依存をチェック
ベクトル化を強制しても問題ないか?
C++: pragma simd、Fortran: SIMD ディレクティブ
ベクトル化が常に効率的とは限りません
ストライド 1 はストライド 2 よりもキャッシュに効率的
インテル® Advisor
で解析
データ配置の再構成を検討
SIMD Data Layout Templates
が有効
構造体配列はデータを直観的に構
成するには優れていますが、配列
構造体ほど効率的ではありません。
SIMD Data Layout Templates
(SDLT) を使用して、ベクトル化
に効率良いデータにマッピングし
ます
問題:
インテル® AVX2 向けの再コンパイルでは、
わずかなゲイン
どこをベクトル化するか?
新しいアーキテクチャー向けに組込み関数を
使用すべきか?
コンパイラー・レポートの内容が分からない?
高速なコードを迅速に開発: インテル® Advisor
ベクトル化の最適化
データ主導型のベクトル化:
最も効率良いベクトル化の候補は?
ベクトル化を妨げているものは? その原因?
ループはベクトル化に適しているか?
データの再構成でパフォーマンスを改善可能か?
単純に pragma simd を使用しても安全か?
「インテル® Advisor のベクトル化アドバイ
ザーは、開発者が本来行うべき作業に集中す
ることを可能にします。最適化に費やすこと
ができる時間が限られている場合、非常に有
効です。」
ハイエンド・コンピューティング・アイルランド・
センター
姫野ベンチマークでの試行
姫野ベンチマークは、理化学研究所情報基盤センターのセンター⻑であ
る
姫野龍太郎氏が非圧縮流体解析コードの性能評価のために考えたもので、
ポアソン方程式解法をヤコビの反復法で解く場合に主要なループの処理
速度を計るものです
•
非圧縮流体解析のポアソン方程式をヤコビの反復法で解く場合に使
用する主要なループの処理速度を測定 (19 点ステンシルコード)
•
単精度の MFLOPS を性能として比較する
•
C または Fortran77/90のソースコードで供給
•
クラスターシステム用に MPI を、またマルチプロセッサー用に
OpenMP* のものを準備
ステンシルの例 (6 点)
i
j
k
A_new(I,J,K)
= F(
A(I-1,J,K)
,
A(I+1,J,K)
A(I,J-1,K)
,
,
A(I,J+1,K)
,
A(I,J,K+1)
,
A(I,J,K-1)
)
姫野ベンチマーク
(http://accc.riken.jp/supercom/himenobmt/download/mpi-vpp)
279
#pragma omp parallel
shared(a,p,b,c,bnd,wrk1,wrk2,nn,imax,jmax,kmax,omega,gosa)
private(i,j,k,s0,ss,gosa1,n)
280 {
281 for(n=0 ; n<nn ; n++){
282 #pragma omp barrier
283 #pragma omp master
284 {
285 gosa = 0.0;
286 }
287 gosa1= 0.0;
288
#pragma omp for nowait
289 for(i=1 ; i<imax; i++)
290 for(j=1 ; j<jmax ; j++)
291 for(k=1 ; k<kmax ; k++){
292 s0= MR(a,0,i,j,k)*MR(p,0,i+1,j, k)
293 + MR(a,1,i,j,k)*MR(p,0,i, j+1,k)
294 + MR(a,2,i,j,k)*MR(p,0,i, j, k+1)
295 + MR(b,0,i,j,k)
296 *( MR(p,0,i+1,j+1,k) - MR(p,0,i+1,j-1,k)
298 - MR(p,0,i-1,j+1,k) + MR(p,0,i-1,j-1,k) )
299 + MR(b,1,i,j,k)
300 *( MR(p,0,i,j+1,k+1) - MR(p,0,i,j-1,k+1)
逐次プログラム版のコンパイル
$ icc -g -O2 ../himenoBMTxpa.c -o hime.ser
../himenoBMTxpa.c(279): 警告 #3180: 識別できない OpenMP プラグマです。
#pragma omp parallel
shared(a,p,b,c,bnd,wrk1,wrk2,nn,imax,jmax,kmax,omega,gosa)
private(i,j,k,s0,ss,gosa1,n)
^
../himenoBMTxpa.c(282): 警告 #3180: 識別できない OpenMP プラグマです。
#pragma omp barrier
…
逐次プログラム版の実行
$ ./hime.ser Xl
Grid-size = Xl
mimax = 512 mjmax = 512 mkmax = 1024
imax = 511 jmax = 511 kmax =1023
Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 601.735307 time(s): 45.059454 6.103516e-05
…
cpu : 44.971282 sec.
Loop executed for 3 times
Gosa : 6.103516e-05
MFLOPS measured : 602.915087
OpenMP* 版のコンパイルと実行
$ icc -g -O3
-qopenmp -qopt-streaming-stores always ./himenoBMTxpa.c
-o hime.par
$ ./hime.par Xl
mimax = 512 mjmax = 512 mkmax = 1024
imax = 511 jmax = 511 kmax =1023
Start rehearsal measurement process.
Measure the performance in 3 times.
MFLOPS: 6028.912509 time(s): 4.497306 4.365373e-04
…
cpu : 58.707601 sec.
Loop executed for 40 times
Gosa : 4.255282e-04
MFLOPS measured : 6157.945238
性能解析ツールの実行
(インテル® VTune™ Amplifier とインテル® Advisor)
$ amplxe-gui
もしくは
$ amplxe-cl -collect hotspots -app-working-dir himeno/openmp
-- himeno/openmp/hime.par Xl
$ advixe-gui
もしくは
$
advixe-cl -collect survey -no-support-multi-isa-binaries
-interval=10 -data-limit=100 -resume-after=0 -project-dir
micperf/himeno -- micperf/himeno/openmp/hime.par Xl
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
最も時間を要しているループが
ベクトル化されていない!!
ベクトル化のために pragma を追加
279 #pragma omp parallel shared(a,p,b,c,bnd,wrk1,wrk2,nn,imax,jmax,kmax,omega,gosa)
private(i,j,k,s0,ss,
gosa1,n)
280 {
281 for(n=0 ; n<nn ; n++){
282 #pragma omp barrier
283 #pragma omp master
284 {
285 gosa = 0.0;
286 }
287 gosa1= 0.0;
288 #pragma omp for nowait
289 for(i=1 ; i<imax; i++)
290 for(j=1 ; j<jmax ; j++)
291
#pragma omp simd reduction(+:gosa1)
292 for(k=1 ; k<kmax ; k++){
293 s0= MR(a,0,i,j,k)*MR(p,0,i+1,j, k)
294 + MR(a,1,i,j,k)*MR(p,0,i, j+1,k)
295 + MR(a,2,i,j,k)*MR(p,0,i, j, k+1)
296 + MR(b,0,i,j,k)
297 *( MR(p,0,i+1,j+1,k) - MR(p,0,i+1,j-1,k)
インテル® AVX-512 版のコンパイルと実行
$ icc -g -O2 -qopenmp
-xMIC-AVX512 -qopt-streaming-stores always
himeno2.c -o hime2.avx
$ ./hime2.avx Xl
…
Wait for a while
cpu : 53.044081 sec.
Loop executed for 138 times
Gosa : 4.136810e-04
MFLOPS measured : 23513.231616
インテル® Xeon® プロセッサーとインテル® Xeon Phi™
プロセッサー向け命令セット・アーキテクチャー (ISA)
KNL
✝インテル®
Xeon Phi™
プロセッサー
SSE*
AVX
AVX2
SKL
✝インテル®
Xeon®
スケーラブル・
SSE*
AVX
AVX2
SNB
✝SSE*
AVX
HSW
✝SSE*
AVX
AVX2
NHM
✝SSE*
AVX512F
AVX512F
AVX512CD
AVX512CD
AVX512ER AVX512PF Pftchwt1 AVX512DQ AVX512BW AVX512VL大きいコア
低レイテンシーに注力/マルチスレッド・シングルスレッド
エンタープライズ、HPC 向け SIMD サポート
ベスト・パフォーマンスで一般的なワークロードの
パフォーマンスを最適化
小さいコア
スループットに注力/多くのスレッド (メニーコア)
HPC 向け SIMD サポート
パフォーマンス/ワットにおいて業界のリーダーシップ
SKL: インテル® Xeon® スケーラブル・プロセッサー (開発コード名
Skylake)
KNL: インテル® Xeon Phi ™ プロセッサー (開発コード名 Knights Landing)
HSW: 開発コード名 Haswell
インテル® Xeon® スケーラブル・プロセッサー対応
コンパイラー・オプション一覧
オプション
説明
-xCORE-AVX512
xCORE-AVX2 からのスムーズな移行
(エンタープライズ向け)
-xCORE-AVX512 –qopt-zmm-usage=high
512 ビット命令のメリットが大きいアプリケーション
(HPC 向け)
-xCOMMON-AVX512
512ビット 命令のメリットが大きくインテル® Xeon Phi™
プロセッサー (KNL
✝
) とバイナリー互換が必要なアプリケー
ション
-xCORE-AVX2
クライアント・アプリケーション、インテル® Xeon® プロ
セッサー E5 v4 ファミリー (Broadwell
✝
) と互換性またはイ
ンテル® Xeon Phi™ プロセッサー (KNL
✝
) と互換性が必要
な場合
[OpenMP* 4.5] #pragma omp simd simdlen() simdlen を追加し SIMD チャンクごと必要な反復数を指
定
#pragma omp declare simd simdlen(16)
インテル® C/C++ コンパイラー 18.0 コンパイラー・オプ
ション
最も時間を要しているループが
インテル® AVX-512 でベクトル化され
た
Knights Landing
✝
本当のブレークスルーに向けての統合的な取り組み
…
…
.
.
.
.
.
.
内蔵インテル® Omni-Path ファブリッ
ク
60 以上のコア
プロセッサー・パッケージ
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
計算
インテル® Xeon® プロセッサーとバイナリー互換
3+ TF
LOPS
1
,
3X ST
2
(単一スレッド)
KNC
✝の性能比
2D メッシュ
Out-of-Order
コア
パッケージ内メモリー
5x 以上
STREAM vs. DDR4
3
最大
16GB
(>450GB/S)
システムメモリー
最大
384GB DDR4
(6 ch > 90GB/S, 2400 T/S)
インテル® Omni-Path
ファブリック
(オプション)
最初の
統合化した
インテル® プロセッ
サー
I/O
最大
36 PCIe* 3.0 レー
ン
メモリーモード
キャッシュモード
ブート時に設定する 3 つのモー
ド
16GB
MCDRAM
DDR
フラットモード
16GB
MCDRAM
DDR
ハイブリッド・モー
ド
4 か 8GB
MCDRAM
DDR
8 か 12GB
MCDRAM
• SW 的には MCDRAM を意識しない
• 64 バイト・ラインのダイレクトマップ
• タグをライン中に持つ
• DDR のすべてのメモリー空間をカバー
• MCDRAM をメモリーとして使用
• SW で明示的に制御
• MCDRAM と DDR は同じメモリー空
間
物理的アドレス空間
物理的アドレス空間
Knights Landing
✝
ブロック図
MCDRAM
DRAM
MCDRAM
MCDRAM
MCDRAM
DRAM
共用キャッシュ
1MB
コア
+
2 VPU
タイルの構
成
CH
A
コア
+
2 VPU
メモリー階層の確認
$ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
…
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
258 259 260 261 262 263 264 265 266 267 268 269 270 271
node 0 size: 98200 MB
node 0 free: 92941 MB
node 1 cpus:
node 1 size: 16384 MB
node 1 free: 15897 MB
node distances:
node
0 1
0: 10 31
1: 31 10
メモリー階層の確認
$ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
…
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
258 259 260 261 262 263 264 265 266 267 268 269 270 271
node 0 size: 98200 MB
node 0 free: 92941 MB
node 1 cpus:
node 1 size: 16384 MB
node 1 free: 15897 MB
node distances:
node
0 1
0: 10 31
1: 31 10
DDR メモリーがノード 0
16GB の MCDRAM はノード 1
インテル® AVX-512 版のコンパイルと実行
$ icc -g -O2 -qopenmp
-xMIC-AVX512 -qopt-streaming-stores always
himeno2.c -o hime2.avx
$ ./hime2.avx Xl
…
Wait for a while
cpu : 53.044081 sec.
Loop executed for 138 times
Gosa : 4.136810e-04
MFLOPS measured : 23513.231616
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
ルーフライン・モデルとは?
どれくらい高速化できるか理解しているか?
バークレーの研究者により提唱された
パフォーマンスは、計算式/実装およびコード生成/ハードウェアにより制限され
ます
2 つのハードウェア要件
ピーク FLOPS
ピーク帯域幅
アプリケーションのパフォーマンスは、ハードウェアの仕様により制限されま
す
GFLOPS=
∗
算術密度 (Flop/バイト)
理論値は仕様によって算出可能
例) 2 ソケットのインテル® Xeon® プロセッサー E5-2697 v2
ピーク FLOP = 2 x 2.7 x 12 x 8 x 2 = 1036.8 GFLOPS
より現実的な値は Linpack を実行して求めることができます
=~ 930 GFLOPS (2 ソケットのインテル® Xeon® プロセッサー E5-2697 v2)
プラットフォームのピーク FLOPS
1 秒あたりの浮動小数点演算数
ソケット数
コア周波数
コア数
SIMD レジスター中の
単精度要素の数
1 つのポートを加算に、もう 1 つを乗算に
GFLOPS=
∗
理論値は仕様によって算出可能
例) 2 ソケットのインテル® Xeon® プロセッサー E5-2697 v2
ピーク BW = 2 x 1.866 x 8 x 4 = 119GB/秒
より現実的な値は Stream を実行して求めることができます
=~ 100 Gflop/秒 (2 ソケットのインテル® Xeon® プロセッサー E5-2697 v2)
プラットフォームのピーク帯域幅
1 秒あたりの転送バイト数
ソケット数
メモリー周波数チャネルあたりの
バイト数
メモリーチャネル数
GLOPS =
∗
ルーフラインを描く
限界を定義
AI [Flop/バイト]
8.7
2 ソケットのインテル® Xeon® プロセッ
サー E5-2697 v2
ピーク Flops = 1036 GFLOPS
ピーク BW = 119GB/秒
GFLOPS =
∗
GFLOPS
1036
ルーフラインを描く
限界を定義
GFLOPS
1036
2 ソケットのインテル® Xeon® プロセッ
サー E5-2697 v2
ピーク Flops = 1036 GFLOPS
ピーク BW = 119GB/秒
GFLOPS =
∗
119
インテル® Advisor のルーフライン: 実際の値
#FLOP
バイナリー・
インストルメンテーション
CPU のカウンターは不使
秒
ユーザ・モード・
サンプリング
ルートアクセスは不
要
バイト
バイナリー・インストルメンテー
ション
オペランドの大きさを加算 (キャッ
ルーフ
マイクロベンチマーク
現状のコンフィグの
実際のピーク値
AI = Flop/バイト
Performance = Flops/seconds
ルーフラインの実行プロファイル:
Y座標
: FLOPS = #FLOP (マスクを考慮) /
#Seconds
メモリー階層の確認
$ numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
…
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
258 259 260 261 262 263 264 265 266 267 268 269 270 271
node 0 size: 98200 MB
node 0 free: 92941 MB
node 1 cpus:
node 1 size: 16384 MB
node 1 free: 15897 MB
node distances:
node
0 1
0: 10 31
1: 31 10
DDR メモリーがノード 0
16GBの MCDRAM はノード 1
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
PLATINUM 81
xx
高速メモリーでの実行
$
numactl -m 1 ./hime2.avx Xl
…
mimax = 512 mjmax = 512 mkmax = 1024
imax = 511 jmax = 511 kmax =1023
Start rehearsal measurement process.
Measure the performance in 3 times.
…
cpu : 37.734588 sec.
Loop executed for 354 times
Gosa : 3.960919e-04
MFLOPS measured :
84787.887420
高速メモリーでの実行
$
numactl -m 1 ./hime2.avx Xl
…
mimax = 512 mjmax = 512 mkmax = 1024
imax = 511 jmax = 511 kmax =1023
Start rehearsal measurement process.
Measure the performance in 3 times.
…
cpu : 37.734588 sec.
Loop executed for 354 times
Gosa : 3.960919e-04
MFLOPS measured :
84787.887420
Skylake
1
上での実行
$ icc -g -O2 -qopenmp
-xCORE-AVX512 -qopt-streaming-stores always
-qopt-streaming-cache-evict=0 himeno2.c -o himeno2
…
$ ./himeno2 Xl
mimax = 512 mjmax = 512 mkmax = 1024
imax = 511 jmax = 511 kmax =1023
Start rehearsal measurement process.
Measure the performance in 3 times.
…
cpu : 26.680347 sec.
Loop executed for 185 times
Gosa : 4.090138e-04
MFLOPS measured :
62668.661618
Score based on Pentium III 600MHz using Fortran 77: 756.502434
1