第12回 アクセラレータ

高性能コンピューティング論2
高性能コンピューティング論2
第12回 アクセラレータ
高性能コンピューティング学講座
三輪 忍
[email protected]
1
高性能コンピューティング論2
本日の講義内容
• アクセラレータの概要
• GPU
• SSE/AVX
• Xeon Phi
2
高性能コンピューティング論2
アクセラレータの概要
3
高性能コンピューティング論2
4
(ハードウェア)アクセラレータ
• コンピュータの処理能力を高めるために追加される HW
• 通常の処理系(CPU など)で行うはずの処理を代わりに実行
• 通常の処理系とは異なるアーキテクチャを採用することで高速に処理
• 専用と汎用がある
• 専用: 特定の処理を高速化
• 例) グラフィックス,H264, ニューラルネットなど
• 汎用: 任意の処理を高速化(ただし,不得手な処理もある)
• 例) SIMD演算器, GPGPU, Xeon Phi など
高性能コンピューティング論2
スカラ vs ベクトル
• スカラ演算
• スカラ・データに対する演算
• CPU が得意
• ベクトル演算
• ベクトル・データに対する演算
• マルチメディア処理(音声処理,画像処理など)に多く現れる
• 通常の CPU だと効率が悪い
• アクセラレータで効率良く実行
5
高性能コンピューティング論2
6
ベクトル演算の具体例(1/2)
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5]
a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]
3x3 の
平均値フィルタ
を適用
b[0][0] b[0][1] b[0][2] b[0][3] b[0][4] b[0][5]
b[1][0] b[1][1] b[1][2] b[1][3] b[1][4] b[1][5]
b[2][0] b[2][1] b[2][2] b[2][3] b[2][4] b[2][5]
b[3][0] b[3][1] b[3][2] b[3][3] b[3][4] b[3][5]
• 例: 画像フィルタ
for ( i = 1 ; i < N – 1 ; ++i ) {
for ( j = 1 ; j < N – 1 ; ++j ) {
b [ i ][ j ] = a [ i – 1 ][ j – 1 ] + a [ i – 1 ][ j ];
b [ i ][ j ] += a [ i – 1 ][ j + 1 ];
b [ i ][ j ] += a [ i ][ j – 1 ];
b [ i ][ j ] += a [ i ][ j ];
b [ i ][ j ] += a [ i ][ j + 1 ];
b [ i ][ j ] += a [ i + 1 ][ j – 1 ];
b [ i ][ j ] += a [ i + 1 ][ j ];
b [ i ][ j ] += a [ i + 1 ][ j + 1 ] );
b [ i ][ j ] /= 9.0;
}
}
[ 平均値フィルタのコード例(スカラ版) ]
高性能コンピューティング論2
7
ベクトル演算の具体例(2/2)
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5]
a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]
3x3 の
平均値フィルタ
を適用
b[0][0] b[0][1] b[0][2] b[0][3] b[0][4] b[0][5]
b[1][0] b[1][1] b[1][2] b[1][3] b[1][4] b[1][5]
b[2][0] b[2][1] b[2][2] b[2][3] b[2][4] b[2][5]
b[3][0] b[3][1] b[3][2] b[3][3] b[3][4] b[3][5]
float n = 9.0;
__m128 vn = _mm_load1_ps (&n);
for ( i = 1 ; i < N – 1 ; ++i ) {
for ( j = 1 ; j < N – 1 ; j+=4 ) {
__m128 vx = _mm_loadu_ps (&a [ i – 1 ][ j – 1 ]);
__m128 vy = _mm_loadu_ps (&a [ i – 1 ][ j ]);
__m128 vz = _mm_loadu_ps (&a [ i – 1 ][ j + 1 ]);
__m128 vb = _mm_add_ps(vx, vy);
vb = _mm_add_ps(vb, vz);
vx = _mm_loadu_ps (&a [ i ][ j – 1 ]);
vy = _mm_loadu_ps (&a [ i ][ j ]);
vz = _mm_loadu_ps (&a [ i ][ j + 1 ]);
vb = _mm_add_ps(vb, vx);
vb = _mm_add_ps(vb, vy);
vb = _mm_add_ps(vb, vz);
vx = _mm_loadu_ps (&a [ i + 1 ][ j – 1 ]);
vy = _mm_loadu_ps (&a [ i + 1 ][ j ]);
vz = _mm_loadu_ps (&a [ i + 1 ][ j + 1 ]);
vb = _mm_add_ps(vb, vx);
vb = _mm_add_ps(vb, vy);
vb = _mm_add_ps(vb, vz);
vb = _mm_div_ps(vb, vn);
_mm_storeu_ps(&b [ i ][ j ], vb);
}
}
[ 平均値フィルタのコード例(ベクトル版) ]
4つのデータ
に対して同じ
演算を実行
高性能コンピューティング論2
8
通常のCPUが非効率な理由
• 1つの命令が1つの処理
• 例) a [ i – 1 ][ j – 1 ] をロード
b [ i ][ j ] = a [ i – 1 ][ j – 1] + a [ i – 1 ][ j ] を実行
• 制御部分に無駄が多い
• 命令毎にフェッチ,デコード,
スケジューリング等が行われる
• これらのコスト(時間/エネルギー)
は命令数に比例
• 1命令で n データを処理すれば
上記のコストは約 1/n
for ( i = 1 ; i < N – 1 ; ++i ) {
for ( j = 1 ; j < N – 1 ; ++j ) {
b [ i ][ j ] = a [ i – 1 ][ j – 1 ] + a [ i – 1 ][ j ];
b [ i ][ j ] += a [ i – 1 ][ j + 1 ];
b [ i ][ j ] += a [ i ][ j – 1 ];
b [ i ][ j ] += a [ i ][ j ];
b [ i ][ j ] += a [ i ][ j + 1 ];
b [ i ][ j ] += a [ i + 1 ][ j – 1 ];
b [ i ][ j ] += a [ i + 1 ][ j ];
b [ i ][ j ] += a [ i + 1 ][ j + 1 ] );
b [ i ][ j ] /= 9.0;
}
}
[ 平均値フィルタのコード例(スカラ版) ]
高性能コンピューティング論2
9
SIMD
1. SIMD:Single Instruction stream / Multiple Data stream
•
SIMD プロセッサ
•
SIMD 命令セット
2. 利点:ピーク性能
3. 問題点:プログラマビリティ
※ 五島正裕,「アドバンストコンピュータアーキテクチャ」,講義資料「アクセラレータの将来」より
高性能コンピューティング論2
10
SIMD プロセッサ
• 単一の制御部からの指令により,複数の演算器が同時に同じ
処理を行う
Control Unit
Instruction
Broadcast
PE – 0
PE – 1
PE – 2
PE– n-1
Memory
※ 五島正裕,「アドバンストコンピュータアーキテクチャ」,講義資料「アクセラレータの将来」より
高性能コンピューティング論2
11
SIMD 命令セット
• (スーパ)スカラ・プロセッサの拡張命令セット
• VIS (Visual Instruction Set)
• MMX/SSE/3DNow!,AltiVec,etc.
• 元々は,64b の演算器を,16b x 4 として使う手法 (VIS,MMX)
• 1つのレジスタ内に,2~8個程度のデータをパック し,
• 1命令で,同種の演算を2~8個程度同時に行う
※ 五島正裕,「アドバンストコンピュータアーキテクチャ」,講義資料「アクセラレータの将来」より
高性能コンピューティング論2
12
SIMD の利点と問題点
• 利点: 性能‐面積効率,最大性能
• 演算器間で制御部を共有可能
• 「1命令で n 個の処理」
• 演算器により多くの面積を割り当てることが可能
• 問題点: プログラマビリティ
※ 五島正裕,「アドバンストコンピュータアーキテクチャ」,講義資料「アクセラレータの将来」より
高性能コンピューティング論2
SIMD のプログラミング
• 性能を出すためには,かなりの労力が必要
• プログラム中からベクトル演算可能な部分を見つける
• 場合によっては,アルゴリズム自体の見直しが必要
• 演算器がフル稼働するようにプログラムを書き直す
• コンパイラによる自動化
• 例) gcc –ftree-vectorize, OpenACC など
• ただし,ピーク性能が出ることはほとんどない
• ハンド・チューニングしたコードの性能の数分の1程度
13
高性能コンピューティング論2
GPU
14
高性能コンピューティング論2
15
GPU (Graphics Processing Unit)
• 本来は画像処理のための SIMD プロセッサ
• 現在は画像処理以外の汎用プログラムの高速化にも広く利用
• GPGPU (General Purpose computing on GPU) と呼ばれる
• 2000年代後半に開発環境(特に CUDA)の整備が急速に進む
• お手頃価格のアクセラレータとしての地位を確立
[ GPU ]
高性能コンピューティング論2
16
※ C. Kozyrakis, スタンフォード大学 EE382A 講義資料より
高性能コンピューティング論2
17
スカラ・データ
を操作
※ C. Kozyrakis, スタンフォード大学 EE382A 講義資料より
高性能コンピューティング論2
18
GPU のアーキテクチャ
• 複数の SMX (Streaming Multiprocessor eXtreme) を搭載
• 各スレッド・ブロック
はいずれかのSMX
に割り当てられる
• SMX 間で L2C
以下を共有
※ NVIDIA社ホワイトペーパー,「Kepler GK110」より
高性能コンピューティング論2
19
SMX のアーキテクチャ
• 192個の CUDA コア
• 要はスカラ演算器
• 整数演算/単精度浮動小数点
演算を実行
• 64個の倍精度浮動小数点
演算器
• 32個のロード/ストア・ユニット
• 制御部(命令キャッシュ,
スケジューラ等)は
CUDA コア間で共通
※ NVIDIA社ホワイトペーパー,「Kepler GK110」より
高性能コンピューティング論2
20
サイクル毎に
ワープを切り
替えて実行
1ワープ
=32スレッド
※ O. Mutlu, カーネギーメロン大学 15-740/18-740 講義資料より
高性能コンピューティング論2
21
GPU における分岐命令の実行方法
• 分岐成立側と分岐不成立側の両方の命令を実行
• 各スレッドが分岐結果に応じて実行命令のレジスタ書き込みを制御
• Branch divergence が問題
• ワープ内に分岐成立/不成立のスレッドが混在
• SP の利用効率が大幅に低下
※ O. Mutlu, カーネギーメロン大学 15-740/18-740 講義資料より
高性能コンピューティング論2
22
GPU におけるメモリ・アクセス
• メモリ・アクセスが性能上のボトルネック
• レイテンシ: 数百サイクル
• ワープ内のスレッドは同一サイクルに同じ命令(ロード/ストア)を実行
• 大量のメモリ・リクエストが発生
• コアレッシング
• ワープ内の各スレッドが境界内の連続メモリ領域にアクセスする場合に,
メモリ・リクエストを1つにまとめて実行
[ コアレッシング ]
https://www.microway.com/hpc-tech-tips/gpu-shared-memory-performance-optimization/ より
高性能コンピューティング論2
23
GPU の性能
• アプリによっては CPU より
も大幅に速い
• 各アプリの説明
• CHROMA
• 格子量子色力学(LQCD)
シミュレーション
• AMBER
• 分子動力学シミュレーション
• NAMD
• 大規模分子シミュレーション
• LAMMPS
• 分子動力学シミュレーション
• GROMACS
• 分子動力学シミュレーション
※ http://www.nvidia.com/object/gpu-test-drive.html より
高性能コンピューティング論2
GPU のまとめ
• 大量の演算器を搭載してベクトル演算を行うプロセッサ
• 価格がお手頃なため,アクセラレータとして広く利用
• プログラミングが大変
24
高性能コンピューティング論2
SSE/AVX
25
高性能コンピューティング論2
SSE/AVX
• Intel 社が提供する SIMD 拡張命令セット
• SSE (Streaming SIMD Extensions)
• Pentium III ~ Nehalem までサポート
• 計 128b のデータに対する SIMD 演算を提供
• AVX (Advanced Vector Extensions)
• Sandy Bridge 以降でサポート
• 計 256b のデータに対する SIMD 演算を提供
26
高性能コンピューティング論2
27
SSE/AVX における SIMD 演算
• SSE: 16x8b, 8x16b, 4x32b, 2x64b 等の SIMD 演算が可能
• AVX: 8x32b, 4x64b 等の SIMD 演算が可能
https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions より
高性能コンピューティング論2
28
AVX をサポートするアーキテクチャ
• 例) Sandy Bridge
• 3 種類のレジスタ
• 64b の GPR (General Purpose Register)
• 2 つの 128b レジスタ(各16本)
• 複数の演算器/レジスタが発行ポートを共有(ポート 2-4 はメモリ用)
http://www.anandtech.com/show/3922/intels-sandy-bridge-architecture-exposed/3 より
高性能コンピューティング論2
29
AVX をサポートするアーキテクチャ
• 例) Sandy Bridge
• AVX は 128b レジスタを 2 つ連結することで 256b 分のデータを格納
• SSE(128b SIMD)のための 2 つのデータパス(INT, FP)を利用して,
256b 分のデータを浮動小数点演算器に供給
http://www.anandtech.com/show/3922/intels-sandy-bridge-architecture-exposed/3 より
高性能コンピューティング論2
30
SSE/AVX の性能
• マンデルブロ集合画像を計算するプログラムの各バージョン
を同一 CPU 上で比較
• マンデルブロ集合: フラクタルの一種
計算量が多いためベンチマーキングに利用
https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions より
高性能コンピューティング論2
31
SSE のプログラム例
• プログラミングが大変
• 単純に行数が多い
• ベクトル・レジスタの管理
• データ・アライメント
など
for ( i = 1 ; i < N – 1 ; ++i ) {
for ( j = 1 ; j < N – 1 ; ++j ) {
b [ i ][ j ] = a [ i – 1 ][ j – 1 ] + a [ i – 1 ][ j ];
b [ i ][ j ] += a [ i – 1 ][ j + 1 ];
b [ i ][ j ] += a [ i ][ j – 1 ];
5.
b [ i ][ j ] += a [ i ][ j ];
6.
b [ i ][ j ] += a [ i ][ j + 1 ];
7.
b [ i ][ j ] += a [ i + 1 ][ j – 1 ];
8.
b [ i ][ j ] += a [ i + 1 ][ j ];
9.
b [ i ][ j ] += a [ i + 1 ][ j + 1 ] );
10.
b [ i ][ j ] /= 9.0;
11. }
12. }
1. float n = 9.0;
2. __m128 vn = _mm_load1_ps (&n);
3. for ( i = 1 ; i < N – 1 ; ++i ) {
4. for ( j = 1 ; j < N – 1 ; j+=4 ) {
5.
__m128 vx = _mm_loadu_ps (&a [ i – 1 ][ j – 1 ]);
6.
__m128 vy = _mm_loadu_ps (&a [ i – 1 ][ j ]);
7.
__m128 vz = _mm_loadu_ps (&a [ i – 1 ][ j + 1 ]);
8.
__m128 vb = _mm_add_ps(vx, vy);
9.
vb = _mm_add_ps(vb, vz);
10. vx = _mm_loadu_ps (&a [ i ][ j – 1 ]);
11. vy = _mm_loadu_ps (&a [ i ][ j ]);
12. vz = _mm_loadu_ps (&a [ i ][ j + 1 ]);
13. vb = _mm_add_ps(vb, vx);
14. vb = _mm_add_ps(vb, vy);
15. vb = _mm_add_ps(vb, vz);
16. vx = _mm_loadu_ps (&a [ i + 1 ][ j – 1 ]);
17. vy = _mm_loadu_ps (&a [ i + 1 ][ j ]);
18. vz = _mm_loadu_ps (&a [ i + 1 ][ j + 1 ]);
19. vb = _mm_add_ps(vb, vx);
20. vb = _mm_add_ps(vb, vy);
21. vb = _mm_add_ps(vb, vz);
22. vb = _mm_div_ps(vb, vn);
23. _mm_storeu_ps(&b [ i ][ j ], vb);
24. }
25. }
[ 平均値フィルタのコード例(スカラ版) ]
[ 平均値フィルタのコード例(SSE版) ]
1.
2.
3.
4.
高性能コンピューティング論2
32
SSE/AVX のまとめ
• Intel が提供している SIMD 拡張命令セット
• スカラ型 CPU を拡張することで SIMD 演算を実現
• SIMD 利用のための性能オーバヘッドが少ない
• コプロセッサ型のアクセラレータと比べ,データ転送のコストが小さい
• プログラム中のベクトル演算が有効な処理に対して,ピンポイントの
SIMD 化が可能
• プログラミングが大変
高性能コンピューティング論2
Xeon Phi
33
高性能コンピューティング論2
34
Xeon Phi
• Intel 社のコプロセッサー型
アクセラレータ
• GPGPU に対抗
• 高性能計算分野で最近流行
※ Intel社ホワイトペーパー,「An Overview of Programming for
Intel Xeon processors and Intel Xeon Phi coprocessors」より
• 後方互換性
• 他の Intel CPU 向けに開発されたプログラムがそのまま動く
高性能コンピューティング論2
35
Xeon Phi のアーキテクチャ
• 50個以上のコア
• 動作周波数は 1 GHz 程度
• プライベートの L2 キャッシュ
• コア間をリングバスによって接続
https://software.intel.com/en-us/articles/intel-xeon-phi-coprocessor-codename-knights-corner より
高性能コンピューティング論2
36
Xeon Phi のコア・アーキテクチャ
• Pentium がベースのインオーダ・コア
• 4 スレッド・マルチスレッディング
• 512b SIMD 演算器を搭載
https://software.intel.com/en-us/articles/intel-xeon-phi-coprocessor-codename-knights-corner より
高性能コンピューティング論2
Xeon Phi の特徴
• アーキテクチャ的には面白い
• 性能を出すのが結構大変らしい
• ハイエンド GPU の方が高性能,という噂
• 商業的に失敗?
37
高性能コンピューティング論2
本日のまとめ
38
高性能コンピューティング論2
まとめ
• アクセラレータの概要
• GPU
• SSE/AVX
• Xeon Phi
39
高性能コンピューティング論2
次回
• 2/5(金) 10:40~
• 「大規模コンピュータ」について解説
• レポート課題を提示
40