インテル® ソフトウェア開発製品
によるソースコードの近代化

エクセルソフト株式会社
黒澤 一平

ソースコードの近代化 インテル® Xeon Phi™ プロセッサーや、将来のインテル®
Xeon® プロセッサー上での実行に向けた準備と適用

インテル® ソフトウェア製品
名称概要

インテル® Composer XE for Fortran and C++

Fortran, C/C++ 言語に対応した最適化コンパイラー

インテル® VTune™ Amplifier XECPU 内部の、処理の効率性やさまざまな情報を取得

インテル® Advisor

ベクトル化、マルチスレッド化の解析を行い、最適化アドバイスを提供

インテル® Trace Analyzer & Collector

MPI アプリケーションの動作状況やボトルネックを解析

インテル® Performance Snapshot

アプリケーション全体の性能をシンプルに解析

インテル® VTune™ Amplifier XE

インテル® Xeon Phi™ プロセッサー(開発コード名: Knights Landing) 対応
2

最新ツールを使用する利点
 より高度な最適化を行えるようになります。
 初心者でも上級者に近い最適化を行えるようになります。
 時間を大幅に短縮することができます。
 ツールからアドバイスを得ることができます。
 数年先まで有効なコードを作ることができるようになります。

3ソフトウェア開発者が考慮するべき並列性

ベクトル化
コアの命令セットを利用

スレッド並列化
複数コアを利用

MPI 並列化
複数マシンを利用• 1 コアごとの性能向上• 複数のデータ要素を同時に処理 (SIMD)• 1 プロセッサーの性能向上• 複数タスクの同時実行• 複数のマシンを使用• 複数プロセスの同時実行
4

ベクトル化とマルチスレッド化、最適化の効果
マルチスレッド化 + ベクトル化はより良い効果が得られる
1 秒あたりの 2 項オプション SP(値が大きいほうが良い)

ベクトル化とスレッド化

179 倍

2007

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

X5472(開発コード名Harpertown)

2009

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

X5570(開発コード名Nehalem)

2010

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

X5680(開発コード名Westmere)

2012

2013

2014

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

E5-2600 v2

E5-2600 v3

Sandy Bridge)

Ivy Bridge)

Haswell)

製品ファミリー(開発コード名

製品ファミリー(開発コード名

スレッド化
ベクトル化
シリアル

製品ファミリー(開発コード名

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

5AVX-512
AVX-512AVX2

SSE
XMM0-15
16- bytes

0

YMM0-15
32 bytes

15

ZMM0-3164 bytes
31

VectorRegisters

IA32(32bit)

Intel64(64bit)

SSE(1999)

8 x 128bit

16 x 128bit

AVX and AVX-2(2011 / 2013)

8 x 256bit

16 x 256bit

AVX-512(2014 – KNL)

8 x 512bit

32 x 512bit
7AVX-512

KNL と将来のインテル® Xeon® プロセッサーとの違い

 KNL と将来のインテル®
Xeon® プロセッサーは多くの互換命令を有しています。
ターゲット-xmic-avx512

KNL のみ-xcore-avx512

将来の XEON のみ-xcommon-avx512

KNL および将来のXEON

-mmic

KNC 用

AVX-512VL
AVX-512PR

AVX512BW

AVX-512ER

AVX512DQ

AVX512CD

AVX-512CD

AVX-512F

AVX-512F

AVX2

AVX2*

AVX2

AVX

AVX

AVXAVX

SSE*

SSE*

SSE*

SSE*

SSE*

NHM

SNB

HSW

Future Xeon
Phi (KNL)

Future Xeon

Common Instruction Set

コンパイラオプション

MPX,SHA, …

8

KNL に向けた準備作業

対応ツール

実施内容

コンパイル/リンクインテル® コンパイラー

ベクトル化

インテル® コンパイラー
インテル® Advisor

マルチスレッド化

インテル® コンパイラー
インテル® Advisor

インテル® Xeon® プロセッサーの場合と同じようにコンパイル、実装、解析することができます。

ベクトル/マルチ
スレッド性能解析

インテル® Advisor
インテル® VTune Amplifier XE

MPI 性能解析

インテル® Trace Analyzer &Collector

ただし、512ビットのベクトル化と、高並列性を目指す必要があります。

インテル® ソフトウェア開発製品は初心者でも上級者に近い最適化を行えるような様々な補助機能を提供します。
9OpenMP* アドバイス機能
 インテル® VTune™ Amplifier XE の OpenMP* 解析機能を使用することで、OpenMP* を用いたマルチスレッド化のパフォーマンス問題と、改善点を確認することができ、修正した場合のパフォーマンスの向上度合いが表示されます。

6

OpenMP* のパフォーマンス問題
 仕事の不均一性、 ロックなどによるスピン時間と、OpenMP* スレッドの生成、スケジューリング、リダクション、アトミック演算、などのオーバーヘッド時間の問題を特定することができます。

7

インテル® Distribution for Python* または Go と性能解析ツール
 パフォーマンスが問題なく発揮されているか、インテル® VTune™ Amplifier XEで素早く確認することができます。
処理が Python* または Go コード側で行われているのか、C ライブラリーやインテル® MKL に置換されているのかをすぐ確認することができ、Hotspots を即座に発見することができます。

 インテル® Distribution for Python* は通常の Python* コードと使用して内部でインテル® MKL などを呼び出して処理するため、より短時間で演算を行うことができるようになっています。
8インテル® VTune™ Amplifier XE によるPython* コードの性能解析
 Python* または Go アプリケーションのパフォーマンス問題を確認することができます。
また、Cython やインテル® MKL のネイティブ・ライブラリーと、Python* または Go の混在も同様に解析することができます。

9インテル® DAALDAAL : (Data Analytics Acceleration Library) インテル・プロセッサー上で動作する
ビッグデータ解析処理を最適化するためのライブラリー
主な問題をカバー

大量のデータを取り扱う
問題分析や意思決定の高速化

知識発見
データマイニング
マシンラーニング
予測分析
AI
パターン認識、ニューロ・コンピューティング14

ビッグデータ (数百テラ～ペタ規模のデータ)
 一般的に市販されている管理ツールや、データベースでは解析、保管が困難なデータ集合体
ビッグデータの特徴
 データサイズが膨大 データの種類が多い
 データが頻繁に更新される

データ例：
単純なテキスト、画像、動画、音楽、センサーから送られてくるデータ、利用者の趣味趣向、金融15

インテル® DAAL
 データ分析で行われる全てのステージをカバー可能
データソース
ビジネス
科学
工学
Web/SNS

それぞれのステージに対して最適化されたアルゴリズムを提供

16

インテル® DAAL の特徴
 メジャーな解析プラットフォームの解析処理からインテル® DAAL のアルゴリズムを接続して使用解析処理の開発にかかる時間を短縮

17

® DAAL

対応プロセッサー- インテル® Atom™ プロセッサー- インテル® Core™ プロセッサー- インテル® Xeon® プロセッサー、- インテル® Xeon Phi™ プロセッサー
DAAL の内部実装は IPP と MKL が提供する関数

18

インテル® DAAL 対応言語
 Java、Python, C++ 言語に対応

Java などのマネージドコード環境でも、ネイティブコードの性能が得られます

インテル® DAAL

19

インテル® MKL に追加された機能
ディープ・ニューラル・ネットワーク (DNN)

人間の脳細胞を模倣した構成を持つ機械学習システム
幾つかの層に分けられ、それぞれで異なる処理を実装
従来のニューラル・ネットワークでは判断基準を教える必要がある
例：パンダの画像を認識 → 人間がパンダの特徴を教える
DNN ではコンピューター自身が判断基準を学習することができる
例：パンダの画像を認識 → マシン自身がパンダの特徴を学習
活用例：
日本語翻訳→より「日本語らしい」文章を作成
検索エンジン→より検索意図に近い情報を表示

出典： NTT DATA (本格化する「人工頭脳」のビジネス活用)(http://www.nttdata.com/jp/ja/insights/trend_keyword/2013110701.html)

20

DNN の実装に使用される一般的なフレームワーク
 Caffe：
ディープラーニング向け
フレームワーク
 画像認識に関するコミュニティーが活発

Caffe 上で インテル® MKL の数学関数を利用することが可能

出典：http://caffe.berkeleyvision.org/

21

インテル® MKL (DNN) の性能
 ２つの処理を高速化 ベクトル化と並列化により、学習スピードの最適化
 特徴の分類スピードの最適化
AVX 2 以上の命令セットを有するプロセッサーをサポート(Haswell 以降)

22インテル® DAAL とインテル® MKL の違い
インテル® DAAL：
データ分析に即使用できる様々なアルゴリズムを提供
インテル® MKL：
ニューラル・ネットワークの実装を支援する関数群を提供

23

ディスクアクセスに関する解析を行う
SSD や HDD への読み書きに関する解析を行う Disk Input and Output
Analysis が追加されています。この機能を使用することで、読み込み遅延、書き込み遅延の発生を検出し、どのプロセス/モジュール/スレッドが発生原因であるかを素早く特定することができます。
SSD デバイスが複数ある場合や、ドライブが複数ある場合、それらを区別して表示させることができるようになっています。

10

HPC 向けの新しい解析タイプ
 HPC Performance Characterization Analysis は、 HPC 分野で有用な情報である GFLOPs や、関数/ループごとの CPU 使用率や CPU 使用効率、メモリー/キャッシュに関する情報、1 サイクルあたりの FLOPs、ベクトル化状況を確認することができます。

11

詳細な解析をする前のスナップショット
Step 1 –スナップショットStep 2 – 詳細な解析

Application
MPIStorage

Intel® VTune™
AmplifierIntel® Advisor

Application &Storage Profiling& Analysis

Vectorization
Optimization& Thread Prototyping

Intel® Trace
Analyzer &Collector
MPI Profiling& Analysis
26

よりシンプルに全体のパフォーマンスを確認
インテル® Performance Snapshot はアプリケーション全体のパフォーマンスを簡単に表示することができます。
そもそも本格的な解析が必要かを、事前に素早く確認することができます。

インテル® Performance Snapshot
コードの近代化に関する情報を表示

MPI Performance Snapshot
パフォーマンスのスケールを表示
12

インテル® AVX512 向けの最適化
 インテル® Xeon Phi™ プロセッサー (開発コード名: Knights Landing) を始めに、今後多くのインテル® AVX512 命令セットをサポートするプロセッサーがリリースされていきます。
 今日、コードの近代化を行うことでインテル® AVX512 命令セットや多くのコアが搭載されたプロセッサー向けの、将来にも有効な最適化を行うことができます。
必要な作業はベクトル化 + マルチスレッド化

13高速なコードを素早く開発: インテル® Advisor
最新プロセッサーで性能を出すためにはベクトル化とマルチスレッド化が必須
 さらに、将来のプロセッサーではより差が顕著にベクトル化でおきる問題:

マルチスレッド化でおきる問題:

 インテル® AVX2 を使用したのに速くならない  マルチスレッド化したけれど速くならない そもそもどこをベクトル化すれば良い?
 スレッド数を増やしたら性能劣化する 最新プロセッサー用の組込み関数を
 マルチスレッド化に時間がかかってしまう使用する必要がある?
 コンパイラーのベクトル化レポートのどこを見れば良い?

これらの問題、疑問をインテル® Advisor が解決します14正しいベクトル化のためには正しい情報をトリップ
カウントを表示

ベクトル化されたループをフィルター

ホットループを表示

ベクトル化の問題を表示

ベクトル化を妨げる原因を特定

ベクトル命令の世代を表示

ベクトル化後の効率を表示

高速なコードを素早く開発
15ベクトル化したコードの効率性をインテル® Advisor で評価

16

ベクトル化の効率性に関する情報を一度に表示17ループのベクトル化
1. ベクトル化可能だがベクトル化できていないループ少しの修正でベクトル化できる可能性があります。

2. ベクトル化されているがあまり性能が上がらない性能を容易に向上できる可能性があります。

3. ベクトル化されているがデータレイアウトの影響で性能がでない
高速なデータ参照方法を使用します。

4. ベクトル化されていて、正しく性能を発揮するほかの個所の最適化に進みます。
18

ベクトル化できていないループの例
 ループの依存関係の存在
 エイリアスによる依存関係の可能性なのか、実際に依存関係があるか確認します。

メモリーの場所

a10
111213141516 }for(i=0; i<NUM; i++){a[i] = i%10;}
for(j=1; j<NUM; j++){a[j] = a[j-1] + x;

b1 void addvec(int num, float*c, float *a, float *b)
2 {3int i;4for(i=0; i<num; i++){5c[i] = a[i] + b[i];
6}
7 }

19

インテル® Advisor によるアドバイス機能

エイリアスによる依存関係の可能性がベクトル化を妨げている場合、インテル® Advisor は修正案を提供します。
ここでは #pragma simd や #pragma ivdep の使用を提案されました。
20

メモリー・アクセス・パターン解析
対象ループのチェックボックスにチェックを入れ、[Check Memory Access Patterns] を使用して、メモリー・アクセス・パターンを解析します。

21

データレイアウトが問題でベクトル化の性能が発揮できない例
この例では 84% が非ユニットストライドと検出されたため、構造体をStructure of Array に変更することを検討

22

ベクトル化個所が性能を発揮しているか、インテル® Advisor を用いて確認

 インテル® AVX でベクトル化され、効率が高く、短時間で処理できるループになりました。
 数値的、視覚的に、最適化の効果を確認することで作業効率を高めることができます。
23

まとめ
 より高度な最適化を短時間で行うことができます。

 初心者も上級者もツールを使う大きなメリットがあります。
 数年先まで有効なコードを作ることができるようになります。

24

法務上の注意書きと最適化に関する注意事項
本資料の情報は、現状のまま提供され、本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスも許諾するものではありません。製品に付属の売買契約書『Intel's Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品性に関する保証、第三者の特許権、著作権、その他、知的財産権の侵害への保証を含む) をするものではありません。

性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。
© 2016 Intel Corporation. 無断での引用、転載を禁じます。Intel、インテル、Intel ロゴ、Xeon、Intel Xeon Phi、VTune は、アメリカ合衆国
および / またはその他の国における Intel Corporation の商標です。*その他の社名、製品名などは、一般に各社の商標または登録商標です。
最適化に関する注意事項
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡
張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテク
チャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。
注意事項の改訂 #20110804
25

補足資料: 2 項オプション SP のシステム構成
最適化に関する注意事項
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リ
ファレンス・ガイドを参照してください。
注意事項の改訂 #20110804

インテル社内での測定値。

システム構成/® Xeon®
5472® Xeon®
X5570® Xeon®
X5680® Xeon®

E5-2690® Xeon®
E5-2697v2
Haswell

L1

L1

L2

H/W

L3

HTC

32GB

800MHz

UMA

Y

N

N

8MB

48GB

1333MHz NUMA

Y

Y

Y

256K

12MB

48MB 1333MHz NUMA

Y

Y

Y

OS
Fedora*20
Fedora*20
Fedora*
20

32K

256K

20MB

64GB

1600MHz NUMA

Y

Y

Y

Fedora*20

3.11.10301.fc20

32K

32K256K

30MB

64GB

1867MHz NUMA

Y

Y

Y

32K

32K

256K

35MB

64GB

2133MHz NUMAYYYFedora*20
Fedora*20

3.11.10301.fc20
3.13.5202.fc20

3GHz

4232K

32K

12MB

2.90GHz

4232K

32K

256K

3.33GHz

6232K

32K

2.90GHz

8232K

2.70GHz1222.20GHz

142

3.11.10301.fc20
3.11.10301.fc20
3.11.10301.fc20

icc 14.0.1
icc 14.0.1

icc 14.0.1
icc 14.0.1

icc 14.0.1
icc 14.0.1

26