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