• 検索結果がありません。

議題 プロセッサーの動向とコード モダナイゼーション インテル アドバンスト ベクトル エクステンション 512 ( インテル AVX-512) 命令と演算性能 ベクトル化を支援するインテル Advisor ループの性能を可視化するルーフライン表示 姫野ベンチマークを用いたインテル Xeon Phi

N/A
N/A
Protected

Academic year: 2021

シェア "議題 プロセッサーの動向とコード モダナイゼーション インテル アドバンスト ベクトル エクステンション 512 ( インテル AVX-512) 命令と演算性能 ベクトル化を支援するインテル Advisor ループの性能を可視化するルーフライン表示 姫野ベンチマークを用いたインテル Xeon Phi"

Copied!
68
0
0

読み込み中.... (全文を見る)

全文

(1)

最新のインテル® Parallel Studio XE を用い

迅速なベクトル化と並列化手法

インテル株式会社

技術本部ソフトウェア技術統括部

シニア・スタッフ・エンジニア

池井 満

(2)

議題

• プロセッサーの動向とコード・モダナイゼーション

• インテル® アドバンスト・ベクトル・エクステンション 512 (インテル®

AVX-512) 命令と演算性能

• ベクトル化を支援するインテル® Advisor

– ループの性能を可視化するルーフライン表示

• 姫野ベンチマークを用いたインテル® Xeon Phi™ プロセッサー上でのケー

スタディー

– 並列化とベクトル化の検討

– インテル® VTune™ Amplifier によるメモリー使用表示

– メモリー階層 (高速メモリー) の影響

– NUMA 構成 (クラスター) の影響

(3)

Hi-K メタルゲート

ストレインド・シリコン

3D トランジスター

65nm

45nm

32nm

22nm

14nm

10nm 7nm

90nm

高機能で複雑な新しい製品を、

電力、価格、大きさを制御しながら提供する

予測に沿った半導体の微細化

ムーアの法則に沿って

製造を続ける

(4)

インテル®

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

(5)

インテル®

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 個同時に計算できる

(6)

プログラミング方法の再検討

コード・モダナイゼーション

• 数コアのプロセッサーから始まって一貫したモデル、言語、ツールや手法で

メニーコアに対応することで、持続的な価値を生み出すことができる

• アプリケーションは利用できるすべての並列性を活用する

-

命令レベル: コアの特性を知り、考慮

-

データレベル: SIMD 命令を用いるようにベクトル化

-

スレッドレベル: OpenMP* などの標準ツールで並列化

-

クラスターレベル: MPI などの標準ツールで並列化

• 専門家がプロセッサーに最適化した標準ライブラリーや言語を利用する

• ヘテロジニティーまで考慮した最適化を検討する

(7)

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

コンパイラー

最適化コンパイラー

(8)

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

(9)

新機能: ルーフライン、高速な解析、ほか…

インテル® Advisor – ベクトル化の最適化

ルーフライン解析により効率良く最適化

 影響の大きい最適化されていないループを見つける

 キャッシュまたはベクトル化の最適化が必要か?

 演算負荷の高いアルゴリズムのほうが良いか?

高速なデータ収集

 モジュールでフィルター – 必要なもののみ計算

 詳細な解析を追跡 – すべてのサイトが実行されたら停止する

より多くのデータと推奨事項により的確な判断が可能

 インテル® MKL フレンドリー – コードが最適化されているか? 最適なバージョンが使用されてい

るか?

 トリップカウントと関数呼び出しカウント

 上位 5 つの推奨事項をサマリーに表示

 動的な命令ミックス – エキスパート機能により各命令の正確なカウントを表示

簡単に MPI を起動

 コマンドライン・ダイアログで MPI をサポート

(10)

インテル® 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)

(11)

論理レジスターファイルの拡張

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 ZMM15

K0

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

(12)

単一のベクトルレーンを使用しない!

ベクトル化およびスレッド化されていないソフトウェアは、パフォーマンスを得ら

れません

(13)

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)

(14)

一般的なループのベクトル化の問題

 ループの反復 (イテレーション) 間に依存性があってはならない

– 一部の依存ループはベクトル化が可能

 ループ内の変数は明確でなければならない

 多くの関数呼び出しはベクトル化できない

 条件分岐はベクトル化を妨げる

– 比較的単純な IF 文はマスクによりベクトル化可能

 ループはカウント可能でなければならない

 ネストするループの外部ループはベクトル化できない

 混在データ型はベクトル化できない

(15)

インテル® Advisor

スレッド化とベクトル化によるアプリケーションのパフォーマンスを向上

コンパイラーは常にコードをベクトル化するとは限りません

 インテル® Advisor

を使用してループ伝搬依存をチェック

 ベクトル化を強制しても問題ないか?

C++: pragma simd、Fortran: SIMD ディレクティブ

ベクトル化が常に効率的とは限りません

 ストライド 1 はストライド 2 よりもキャッシュに効率的

インテル® Advisor

で解析

 データ配置の再構成を検討

SIMD Data Layout Templates

が有効

構造体配列はデータを直観的に構

成するには優れていますが、配列

構造体ほど効率的ではありません。

SIMD Data Layout Templates

(SDLT) を使用して、ベクトル化

に効率良いデータにマッピングし

ます

(16)

問題:

 インテル® AVX2 向けの再コンパイルでは、

わずかなゲイン

 どこをベクトル化するか?

 新しいアーキテクチャー向けに組込み関数を

使用すべきか?

 コンパイラー・レポートの内容が分からない?

高速なコードを迅速に開発: インテル® Advisor

ベクトル化の最適化

データ主導型のベクトル化:

最も効率良いベクトル化の候補は?

ベクトル化を妨げているものは? その原因?

ループはベクトル化に適しているか?

データの再構成でパフォーマンスを改善可能か?

単純に pragma simd を使用しても安全か?

「インテル® Advisor のベクトル化アドバイ

ザーは、開発者が本来行うべき作業に集中す

ることを可能にします。最適化に費やすこと

ができる時間が限られている場合、非常に有

効です。」

ハイエンド・コンピューティング・アイルランド・

センター

(17)

姫野ベンチマークでの試行

姫野ベンチマークは、理化学研究所情報基盤センターのセンター⻑であ

姫野龍太郎氏が非圧縮流体解析コードの性能評価のために考えたもので、

ポアソン方程式解法をヤコビの反復法で解く場合に主要なループの処理

速度を計るものです

非圧縮流体解析のポアソン方程式をヤコビの反復法で解く場合に使

用する主要なループの処理速度を測定 (19 点ステンシルコード)

単精度の MFLOPS を性能として比較する

C または Fortran77/90のソースコードで供給

クラスターシステム用に MPI を、またマルチプロセッサー用に

OpenMP* のものを準備

(18)

ステンシルの例 (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)

)

(19)

姫野ベンチマーク

(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)

(20)

逐次プログラム版のコンパイル

$ 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

(21)

逐次プログラム版の実行

$ ./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

(22)

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

(23)

性能解析ツールの実行

(インテル® 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

(24)

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

(25)
(26)

PLATINUM 81

xx

最も時間を要しているループが

ベクトル化されていない!!

(27)

ベクトル化のために 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)

(28)

インテル® 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

(29)

インテル® 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

(30)

インテル® 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 コンパイラー・オプ

ション

(31)
(32)

最も時間を要しているループが

インテル® AVX-512 でベクトル化され

(33)

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 レー

(34)

メモリーモード

キャッシュモード

ブート時に設定する 3 つのモー

16GB

MCDRAM

DDR

フラットモード

16GB

MCDRAM

DDR

ハイブリッド・モー

4 か 8GB

MCDRAM

DDR

8 か 12GB

MCDRAM

• SW 的には MCDRAM を意識しない

• 64 バイト・ラインのダイレクトマップ

• タグをライン中に持つ

• DDR のすべてのメモリー空間をカバー

• MCDRAM をメモリーとして使用

• SW で明示的に制御

• MCDRAM と DDR は同じメモリー空

物理的アドレス空間

物理的アドレス空間

(35)

Knights Landing

ブロック図

MCDRAM

DRAM

MCDRAM

MCDRAM

MCDRAM

DRAM

共用キャッシュ

1MB

コア

+

2 VPU

タイルの構

CH

A

コア

+

2 VPU

(36)

メモリー階層の確認

$ 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

(37)

メモリー階層の確認

$ 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

(38)

インテル® 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

(39)

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

(40)

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

(41)

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

(42)

ルーフライン・モデルとは?

どれくらい高速化できるか理解しているか?

バークレーの研究者により提唱された

パフォーマンスは、計算式/実装およびコード生成/ハードウェアにより制限され

ます

2 つのハードウェア要件

 ピーク FLOPS

 ピーク帯域幅

アプリケーションのパフォーマンスは、ハードウェアの仕様により制限されま

GFLOPS=

算術密度 (Flop/バイト)

(43)

理論値は仕様によって算出可能

例) 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=

(44)

理論値は仕様によって算出可能

例) 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 =

(45)

ルーフラインを描く

限界を定義

AI [Flop/バイト]

8.7

2 ソケットのインテル® Xeon® プロセッ

サー E5-2697 v2

ピーク Flops = 1036 GFLOPS

ピーク BW = 119GB/秒

GFLOPS =

GFLOPS

1036

(46)

ルーフラインを描く

限界を定義

GFLOPS

1036

2 ソケットのインテル® Xeon® プロセッ

サー E5-2697 v2

ピーク Flops = 1036 GFLOPS

ピーク BW = 119GB/秒

GFLOPS =

119

(47)

インテル® Advisor のルーフライン: 実際の値

#FLOP

バイナリー・

インストルメンテーション

CPU のカウンターは不使

ユーザ・モード・

サンプリング

ルートアクセスは不

バイト

バイナリー・インストルメンテー

ション

オペランドの大きさを加算 (キャッ

ルーフ

マイクロベンチマーク

現状のコンフィグの

実際のピーク値

AI = Flop/バイト

Performance = Flops/seconds

ルーフラインの実行プロファイル:

Y座標

: FLOPS = #FLOP (マスクを考慮) /

#Seconds

(48)
(49)

メモリー階層の確認

$ 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

(50)

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

PLATINUM 81

xx

(51)

高速メモリーでの実行

$

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

(52)

高速メモリーでの実行

$

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

(53)
(54)
(55)

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

開発コード名

(56)
(57)
(58)
(59)

Sub NUMA クラスター

MCDRAM

MCDRAM

MCDRAM

MCDRAM

3. SNC-4: 4 ソケットのマシン (コア数は 4 分の 1) として見える

$

numactl -H

available: 8 nodes (0-7)

node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 64 65....

node 0 size: 24452 MB

node 0 free: 22976 MB

node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 80 ...

node 1 size: 24576 MB

node 1 free: 23698 MB

node 2 cpus: 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 96 ...

node 2 size: 24576 MB

node 2 free: 23843 MB

node 3 cpus: 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 112 ...

node 4 cpus:

node 4 size: 4096 MB

node 4 free: 3982 MB

node 5 cpus:

node 7 cpus:

node 7 size: 4096 MB

node 7 free: 3982 MB

(60)

MPI 版の姫野プログラムをハイブリッドに

370 integer,intent(in) :: nn

371 real(4),intent(inout) :: gosa

372 integer :: i,j,k,loop,ierr

373 real(4) :: s0,ss,wgosa

374 !

375 do loop=1,nn

376 gosa=0.0

377 wgosa=0.0

378 !$OMP PARALLEL DO SHARED (kmax,jmax,imax,nn,a,p,b,c,bnd,wrk1,wrk2) &

379 !$OMP PRIVATE (k,i,j,s0,ss) REDUCTION (+:wgosa)

380 do k=2,kmax-1

381 do j=2,jmax-1

382 do i=2,imax-1

383 s0=a(I,J,K,1)*p(I+1,J,K) &

384 +a(I,J,K,2)*p(I,J+1,K) &

385 +a(I,J,K,3)*p(I,J,K+1) &

386 +b(I,J,K,1)*(p(I+1,J+1,K)-p(I+1,J-1,K) &

387 -p(I-1,J+1,K)+p(I-1,J-1,K)) &

388 +b(I,J,K,2)*(p(I,J+1,K+1)-p(I,J-1,K+1) &

389 -p(I,J+1,K-1)+p(I,J-1,K-1)) &

(61)

ハイブリッド版のコンパイルと実行

$ mpiifort -g -O3 -xMIC_AVX512 -qopenmp -qopt-streaming-stores

always

himeno4.f90 -o himeno4.avx

$ export OMP_NUM_THREADS=2

$

numactl -m 4,5,6,7 mpiexec.hydra -n 64 ./himeno4.avx

The loop will be excuted in 1008 times.

This will take about one minute.

Wait for a while.

Loop executed for 1008 times

Gosa : 3.6641795E-04

MFLOPS: 155347.575570096 time(s): 58.6443572044373

Score based on Pentium III 600MHz : 1875.273

(62)
(63)

高速メモリーをプログラムから使用する方法 (F90)

module pres

implicit none

real(4),dimension(:,:,:),allocatable :: p

!DEC$ ATTRIBUTES FASTMEM :: p

end module pres

!

module mtrx

implicit none

real(4),dimension(:,:,:,:),allocatable :: a,b,c

!DEC$ ATTRIBUTES FASTMEM :: a,b,c

end module mtrx

!

(64)

高速メモリーをプログラムから使用する方法 (C)

#include <hbwmalloc.h>

Mat->m= NULL;

Mat->m= (float*)

hbw_malloc(mnums * mrows * mcols * mdeps * sizeof(float));

return(Mat->m != NULL) ? 1:0;

}

void

clearMat(Matrix* Mat)

{

if(Mat->m)

hbw_free(Mat->m);

Mat->m= NULL;

Mat->mnums= 0;

(65)

コード・モダナイゼーションのまとめ

項目

利用するツールなど

考察

1. スレッド化

OpenMP*

OpenMP* を使用してコア数 × 4 のスレッドを

活用

2. ベクトル化

SIMD pragma

インテル® AVX-512 により 512b の VPU を活用

3. ブロック化

(MPI による分割)

4. キャッシュ

クラスターモード

フラットかキャッシュか? AllToAll、Quadrant、

SNC4?

5. ファブリック

MPI

インテル® Omni−Path アーキテクチャーなどの

高速ファブリックを利用

6. データレイアウ

メモリー階層

Numactl や FASTMEM、HBMMALLOC を利用

(66)

結論

• プロセッサーのコア数と SIMD 幅が広がり、並列化 = コード・モダナイゼー

ションは必須

• インテル® AVX-512 命令でベクトル化の重要性が大きく

– インテル® Advisor により、重要なループを効果的にベクトル化

• キャッシュやパッケージメモリーなどのメモリーの階層構造の演算性能への

影響も大きく

– インテル® VTune™ Amplifier でメモリー性能を可視化

– インテル® Advisor のルーフライン表示によりループ性能を可視化

• より高性能で複雑になる IA アーキテクチャー上でもインテル® Parallel

Studio XE で迅速なプログラムの最適化を実現

(67)

本資料の情報は、現状のまま提供され、本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いか

なる知的財産権のライセンスも許諾するものではありません。製品に付属の売買契約書『Intel's Terms and Conditions of Sale』に規定さ

れている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定

目的への適合性、商品性に関する保証、第三者の特許権、著作権、その他、知的財産権の侵害への保証を含む) をするものではありません。

性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることが

あります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、

機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場

合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。

© 2017 Intel Corporation. 無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Intel Inside、Intel Inside ロゴ、Intel Core、

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

法務上の注意書きと最適化に関する注意事項

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化

を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル®

ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の

利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提

としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。

この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804

(68)

参照

関連したドキュメント

名の下に、アプリオリとアポステリオリの対を分析性と綜合性の対に解消しようとする論理実証主義の  

ベクトル計算と解析幾何 移動,移動の加法 移動と実数との乗法 ベクトル空間の概念 平面における基底と座標系

今回発売する新製品は、大人気ハンティングアクションゲーム「モンスターハンター フロンティア

地盤の破壊の進行性を無視することによる解析結果の誤差は、すべり面の総回転角度が大きいほ

耐震性及び津波対策 作業性を確保するうえで必要な耐震機能を有するとともに,津波の遡上高さを

据付確認 ※1 装置の据付位置を確認する。 実施計画のとおりである こと。. 性能 性能校正

音節の外側に解放されることがない】)。ところがこ

自ら将来の課題を探究し,その課題に対して 幅広い視野から柔軟かつ総合的に判断を下す 能力 (課題探究能力)