1
担当• 大島聡史（助教） ohshima@cc.u-tokyo.ac.jp• 星野哲也（助教） hoshino@cc.u-tokyo.ac.jp
質問やサンプルプログラムの提供についてはメールでお問い合わせください2017年03月14日（火）2• 09：30 - 10：00

受付• 10：00 - 12：00

Reedbush-Hログイン、GPU入門• 13：30 - 15：00

OpenACC入門• 15：15 - 16：45

OpenACC最適化入門と演習• 17：00 - 18：00

OpenACCの活用（CUDA連携およびライブラリの活用）

1

1. Reedbushにログインする（別資料を参照）※ログインノードは-U/-H共通
2. 利用上の注意
3. バッチジョブを実行し、GPUを動かす
4. プロファイラ（nvvp）を使う

2• ディレクトリの扱いについて– ログイン時のディレクトリ（/home/gt00h/txxxxx）にはログイン時に最低限必要なファイルのみを置く– 作業には/lustre以下のディレクトリ（/lustre/gt00h/txxxxx）を使う– /homeに置いたファイルは計算ノードから参照できない• コンパイルの為の準備– moduleコマンドを使ってコンパイルのための準備をする• モジュールをロード：module load 対象モジュール名– 環境変数PATHなどが書き換わり、コンパイラやライブラリが利用可能に– バージョンを指定する場合：module load 対象モジュール名/バージョン• 使用可能なモジュールの一覧を表示：module avail• 使用中のモジュールを確認：module list

3

• CUDA開発環境を使う場合– module load cuda

• PGIコンパイラを使う場合– （OpenACCやCUDA Fortranを使う場合）– module load pgi• Intelコンパイラを使う場合– module load intel• MPIを使う場合（コンパイラに追加してloadする）– module load mvapich2-gdr/2.2/{gnu,intel,pgi}– module load openmpi-gdr/2.0.2/{gnu,intel,pgi}• ジョブ実行時にも同じmoduleをloadすること• 組み合わせて使用しても良い– 順序に注意、環境変数PATHやLD_LIBRARY_PATHなどを確認する

4• PBS Professionalを用いてジョブを実行する• 用意するもの– ジョブスクリプト（シェススクリプトファイル）• 使用する主なコマンド– qsub ジョブを投入する（実行させる、キューに入れられる）– rbstat ジョブの実行状況を確認する– qdel ジョブを削除する（削除したいジョブのIDを引数に指定する）

5• ジョブスクリプトの例#!/bin/bash#PBS -W group_list=gt00h#PBS -q h-lecture#PBS -l select=1:ompthreads=18#PBS -l walltime=0:01:00. /etc/profile.d/modules.shmodule load cuda
cd ${PBS_O_WORKDIR}./a.out

使用するシェル
グループ名
キュー名
使用するリソース量
最大実行時間module初期化
module設定（CUDA Cの例）
ジョブを投げたディレクトリへ移動
実行

その他の主なオプションなど-N jobname
ジョブ名（出力ファイル名などに影響）-o outfile / -e errfile
出力されるファイル名を任意に変更-j oe
エラー出力と標準出力をまとめる

6

• 投入例
bash@reedbush-u4 hello $ qsub rbu.sh
276722.reedbush-pbsadmin0• 確認例（Reedbush-U上で動かした例）

bash@reedbush-u4 hello $ rbstat
Reedbush scheduled stop time: 2017/03/30(木) 09:00:00 (Remain: 24days 09:15:19)
JOB_ID276724

JOB_NAME
rbu.shSTATUS PROJECTRUNNING pz0097

QUEUE
u-debug

START_DATE
03/05 23:44:25

ELAPSE
TOKEN
00:00:16 0.0– -sオプションを付ければさらに詳細な情報が得られる• 削除例
bash@reedbush-u4 hello $ qdel 272624
qdel: Job has finished– 投入したジョブに問題があることがわかったときなどに使う

NODE
1

7

• あらかじめ用意されているGPUプログラムを用いてコンパイ
ルとバッチジョブの実行を試す• 手順$ module load pgi$ cd /lustre/gt00/txxxxx（t利用者番号）$ cp -r /lustre/gt00h/z30097/public2/kosyu74/check .
$ makepgcc -acc -ta=tesla:cc60 -o vector_c_acc vector.c$ qsub check.sh※実行されるまで待つ（rbstatで確認）
makeにより実行されるコマンド$ cat check.sh.o*n = 10initial: 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00 10.00
result: 2.00 4.00 6.00 8.00 10.00 12.00 14.00 16.00 18.00 20.00

8• （Windowsユーザのみ）準備

NVIDIA CUDA Visual Profiler– Cygwinインストール時にxorg-serverとxinitをインストールしておく– 「XWin Server」を起動する• タスクトレイにアイコンが2つ増える– 緑の線の入った方のアイコンから「Cygwin Terminal」を起動する• 使用– Reedbushへssh接続する際に-Yオプションを付けておく• ssh -Y reedbush.cc.u-tokyo.ac.jp -l txxxxx– module設定を行い、nvvpを起動する• module load cudaを設定したあとでnvvpコマンドを実行

1

GPUについてGPUスパコン事情
Reedbushシステムの紹介

2• 現在のHPC・計算機科学・計算科学分野では様々な並列計算
ハードウェアが利用されている– マルチコアCPU：複数の計算コアを1つのチップにまとめたCPU• 代表例：Intel Xeon / Core, AMD Opteron/FX, IBM POWER, FUJITSUSPARC64, ARM Cortex– サーバ向けでは1999年POWER4、PC向けでは2005用Dual-Core
Opteron/AthlonX2が初出と思われる– メニーコアプロセッサ：マルチコアCPUよりも多数の計算コアを搭載• 代表例：Intel Xeon Phi, Sun Niagara, PEZY PEZY-1/SC– 明確に何コア以上がメニーコアという定義が有るわけではない– GPU：画像処理用HWに端を発するメニーコアプロセッサ• 代表例：NVIDIA Tesla/GeForce, AMD FirePro/Radeon– FPGA：プログラミングにより回路構成を変更可能なプロセッサ• 代表例：Xilinx Virtex, Altera Stratix

3• ムーアの法則に支えられたCPUの性能向上が終わりつつある– 微細化によるチップあたりトランジスタ数の向上– クロック周波数の向上↓– 消費電力や発熱が問題となり頭打ち↓– マルチコア化、
メニーコア化による並列演算性能の向上へ

出展 : The chips are down for Moore’s law : Nature News & Comment
http://www.nature.com/news/the-chips-are-down-for-moore-s-law-1.19338

4• 画像処理用のハードウェア– 高速・高解像度描画、3D描画処理（透視変換、陰影・照明）、画面出力• CPUやマザーボードに組み込まれたチップとして、また拡張スロットに搭載するビデオカードとして広く利用される• GPUに求められる処理が並列計算に適した処理であったため、CPUに先んじて並列化による高性能化が進んだ• 性能・機能の向上に伴い2000年代後半から汎用演算への活用が進み、GPGPUやGPUコンピューティングと呼ばれる（General-Purpose computation on GPUs)※参考：3次元画像描画の手順① (2, 2)② (8, 3)③ (5, 7)
オブジェクト単位、頂点単位、ピクセル単位で並列処理が可能→並列化により高速化しやすい5• ハードウェアの構成バランスの違い（イメージ）– 限られたトランジスタを主に何に用いるか
マルチコアCPU

メニーコアプロセッサ

GPU

計算ユニット
メモリ
キャッシュなど
制御部など– 多数の計算ユニットを搭載し全体として高性能を得ることを重視– （この図ではわからないが）計算性能にみあったデータを供給せねばならないため、総メモリ転送性能も重視• GDDR5やHBMを活用

6• CPUとは異なる特徴を持つ– 非常に多くの（1000以上）の計算ユニットを搭載、計算ユニット単体の性能は低い• CPUよりも低い・貧弱な動作周波数、キャッシュ、分岐、……
– 計算コアが完全に個別には動けない• 32個などの単位でスケジューリング、SIMD演算器が大量に搭載された
イメージ– 浅めのキャッシュ階層、複数階層のメモリ、高バンド幅メモリ• 特定のアプリケーションでは非常に高い性能– 最近はビッグデータや機械学習の分野で有用なため注目が高まっている• CPUとは異なるプログラミング・最適化の知識と技術が必要– 本講習会がその手助け・入り口となることを期待します7• GPU等のアクセラレータを搭載したスパコンの普及– TOP500リスト 2016年6月版• TOP20中4システム、TOP500中67システムがGPUスパコン
順 名称
位 設置機関
1 Sunway TaihuLight
National Supercomputing Center in Wuxi

開発ベンダー
国
NRCPC
China

Rmax
Rpeak
93014594
125435904

構成

2

Tianhe-2 (MilkyWay-2)
National Super Computer Center in Guangzhou

NUDT
China

33862700
54902400

TH-IVB-FEP Cluster, Intel Xeon E5-2692 3120000
12C 2.200GHz, TH Express-2, Intel Xeon 2736000
Phi 31S1P

3Titan
DOE/SC/Oak Ridge National Laboratory

Cray Inc.
US

17590000
27112550

Cray XK7 , Opteron 6274 16C 2.200GHz, 560640
Cray Gemini interconnect, NVIDIA K20x 261632

4

Sequoia
DOE/NNSA/LLNL
K computer
RIKEN Advanced Institute for Computational Science (AICS)
Mira
DOE/SC/Argonne National Laboratory
Trinity
DOE/NNSA/LANL/SNLIBM
USFujitsu
Japan
IBM
US
Cray Inc.
US

17173224
20132659.2
10510000
11280384
8586612
10066330
8100900
11078861

BlueGene/Q, Power BQC 16C 1.60 GHz, 1572864
0
Custom705024SPARC64 VIIIfx 2.0GHz, Tofu
0interconnect
BlueGene/Q, Power BQC 16C 1.60GHz, 786432
0
Custom301056
Cray XC40, Xeon E5-2698v3 16C
0
2.3GHz, Aries interconnect

8

Piz Daint
Swiss National Supercomputing Centre (CSCS)

Cray Inc.
Switzerland

6271000
7788852.8

Cray XC30, Xeon E5-2670 8C 2.600GHz, 115984
73808
Aries interconnect , NVIDIA K20x

9Hazel Hen
HLRS - Höchstleistungsrechenzentrum Stuttgart

Cray Inc.
Germany

56401707403520

Cray XC40, Xeon E5-2680v3 12C
2.5GHz, Aries interconnect

1850880

Cray Inc.
Saudi Arabia

55369907235174

Cray XC40, Xeon E5-2698v3 16C
2.3GHz, Aries interconnect

1966080
05
6
7

10 Shaheen II
King Abdullah University of Science and Technology

コア数
アクセラレータコア数

Sunway MPP, Sunway SW26010 260C
1.45GHz, Sunway

10649600
08• GPU等のアクセラレータを搭載したスパコンの普及– TOP500リスト 2016年11月版では（少なくとも）TOP100中14システム、
TOP500中48システムがGPUを活用• #3, Titan (Cray XK7), ORNL, 18/27PF, Tesla K20x
• #8, Piz Daint (Cray XC50), CSCS, 9.8/16PF, Tesla P100
– Green500リスト 2016年11月版ではP100がワンツーフィニッシュ
• #1, NVIDIA DGX-1, 9462.1 MF/W
• #2, Piz Daint (Cray CX50), CSCS, 7453.5 MF/W

• ピーク性能や電力あたり性能の高い超大規模システムが構築できることが広く認知されている– （汎用性ではマルチコアCPUに劣るが）

9

Oakleaf-FX (通常ジョブ用)(Fujitsu PRIMEHPC FX10)

Oakbridge-FX (長時間ジョブ用)（Fujitsu PRIMEHPC FX10 ）Yayoi(Hitachi SR16000/M1)

Total Peak performance
Total number of nodes
Total memory
Peak performance / node
Main memory per node
Disk capacity
SPARC64 Ixfx 1.84GHz

Total Peak performance
Total number of nodes
Total memory
Peak performance / node
Main memory per node
Disk capacity
SPARC64 Ixfx 1.84GHz

Total Peak performance
Total number of nodes
Total memory
Peak performance / node
Main memory per node
Disk capacity
IBM POWER 7 3.83GHz: 1.13 PFLOPS: 4800: 150 TB
: 236.5 GFLOPS: 32 GB: 1.1 PB + 2.1 PB: 136.2 TFLOPS: 576: 18 TB: 236.5 GFLOPS: 32 GB: 147TB + 295TB

Total Users > 2,000: 54.9 TFLOPS: 56: 11200 GB: 980.48 GFLOPS: 200 GB: 556 TB

10

Reedbush

Oakforest-PACS(データ解析・シミュレーション融合
スーパーコンピュータシステム) Reedbush-U (CPU only) とReedbush-H (with GPU) からなる Reedbush-U
508.03 TFlops
 2016/7/1 試験運用開始
 2016/9/1 正式運用開始
 Reedbush-H

1297.15-1417.15 TFlops
 2017/3/1 試験運用開始


最先端共同HPC基盤施設(JCAHPC)により導入


東大と筑波大による仮装組織

ピーク性能:25PFFLOPS
8,208 Intel Xeon Phi (KNL)



TOP500 #6@世界、#1＠日本Green500 #6@世界、#2@日本



HPCG #3@世界、#2@日本

2016/10/1 試験運用開始



2016/12/1 正式運用開始

11• システム構成・運用：SGI• Reedbush-U (CPU only)– Intel Xeon E5-2695v4 (Broadwell-EP, 2.1GHz 18core) x 2ソケット (合計1.210 TF), 256 GiB (153.6GB/sec)– InfiniBand EDR, Full bisection BW Fat-tree– システム全系: 420 ノード, 508.0 TF• Reedbush-H (with GPU)
– CPU・メモリ：Reedbush-U と同様– NVIDIA Tesla P100 (Pascal世代 GPU)• (4.8-5.3TF, 720GB/sec, 16GiB) x 2 / ノード– InfiniBand FDR x 2ch, Full bisection BW Fat-tree– 120 ノード, 145.2 TF(CPU)+ 1.15~1.27 PF(GPU)= 1.30~1.42 PF

12• L'homme est un roseau
pensant.
• Man is a thinking reed.
• 人間は考える葦である
Pensées (Blaise Pascal)

Blaise Pascal(1623-1662)

13• ストレージ/ファイルシステム– 並列ファイルシステム (Lustre)• 5.04 PB, 145.2 GB/sec– 高速ファイルキャッシュシステム: Burst Buffer (DDN IME (Infinite
Memory Engine))• SSD: 209.5 TB, 450 GB/sec• 電力, 冷却, 設置面積
– 空冷, 378 kVA(冷却除く)、< 90 m2• データ解析、ディープラーニング向けソフトウェア・ツール
キット– OpenCV, Theano, Anaconda, ROOT, TensorFlow, Torch, Caffe, Chainer,
GEANT4
詳しくはWebをご参照ください
http://www.cc.u-tokyo.ac.jp/system/reedbush/14
計算ノード: 1.795-1.926 PFlops
Reedbush-U (CPU only) 508.03 TFlops
CPU: Intel Xeon E5-2695 v4 x 2 socket(Broadwell-EP 2.1 GHz 18 core,
×420
45 MB L3-cache)
Mem: 256GB (DDR4-2400, 153.6 GB/sec)

Reedbush-H (w/Accelerators)
1287.4-1418.2 TFlops
CPU: Intel Xeon E5-2695 v4 x 2 socket
Mem: 256 GB (DDR4-2400, 153.6 GB/sec)
GPU: NVIDIA Tesla P100 x 2
×120(Pascal, SXM2, 4.8-5.3 TF,
Mem: 16 GB, 720 GB/sec, PCIe Gen3 x16,
NVLink (for GPU) 20 GB/sec x 2 brick )SGI Rackable
C2112-4GP3

SGI Rackable C1102-PL1

InfiniBand EDR 4x
100 Gbps /nodeDual-port InfiniBand FDR 4x

56 Gbps x2 /node

InfiniBand EDR 4x, Full-bisection Fat-tree
145.2 GB/s

並列ファイルシステム
5.04 PB
Lustre Filesystem
DDN SFA14KE x3

Mellanox CS7500
634 port +SB7800/7890 36
port x 14

436.2 GB/s
管理サーバー群
高速ファイルキャッシュシステム
209 TB
DDN IME14K x6

Login
Login
Login
Login
Login
Login
node
node
node
node
node
node
ログインノード x6

UTnet

ユーザ

15

メモリ
128GB

DDR4
DDR4
DDR4
DDR4

QPI
76.8GB/s

15.7 GB/s

15.7 GB/s

PCIe sw

NVIDIA
Pascal

DDR4
DDR4
DDR4
DDR4

メモリ
128GB

76.8GB/s

PCIe sw
20 GB/s
NVLinK
NVLinK
20 GB/s
EDR switch

EDR

G3
x16

G3
x16

IB FDRHCAIntel Xeon
E5-2695 v4(BroadwellEP)
G3
x16

G3
x16

76.8GB/s

76.8GB/s
QPIIntel Xeon
E5-2695 v4(BroadwellEP)

NVIDIA
PascalIB FDR
HCA

16

ストレージなど

１．計算したいデータを送る
何らかのバスCPU

ネットワーク~32GB/s(PCI-Express)

OSが動いている~20GB/s (IB)GPU
OSは存在しない

２．計算を行う

３．計算結果を返す~200GB/s
メインメモリ（DDRなど）~1,000GB/s
デバイスメモリ（GDDR, HBMなど）• CPUやGPUが複数搭載されていることもあるが、ここでは割愛• GPUを使う為には１．２．３．を考える（実装する）必要がある• デバイス内外のデータ転送速度差が大きいため、対象とするプロセッサ内で計算が完結していることが望ましい17

1. GPUに対応したソフトウェア（アプリケーション）を使う– GPU上で行われる計算自体は実装しない、基本的にGPUの知識は不要– 存在するものしか使えない、手持ちのプログラムには適用不能

2. （GPUに対応していないプログラムから）GPUに対応したライブラリやフレームワークを使う– GPU上で行われる計算自体は実装しない、基本的にGPUの知識は不要– 対象分野における共通のAPIが存在しGPU化されていれば恩恵は大• BLASなどの数値計算ライブラリ、ビッグデータ・機械学習系のライブ
ラリ・フレームワークなど

3. GPU上で行われる計算そのものを実装する– １や２で用いるソフトウェア・ライブラリ等そのものを作る– GPUに関する知識が必要– 手持ちのプログラム・独自のプログラムをGPU化できる
本講習会の主な対象

18• 主な開発環境（プログラミング言語など、特に並列化に用いるもの）– CPU/MIC• MPI, OpenMP• (pthread, Cilk+, TBB, …)– GPU• CUDA, DirectCompute– FPGA• Verilog HDL

OpenACC
OpenCL– 従来は個別のものが使われていたが、近年では共通化も進みつつある• 習得が大変、移植が大変という利用者の声が反映されている

19• 対象とするGPU：NVIDIA Tesla P100
– Tesla：NVIDIA社が開発しているGPUシリーズの1つ、HPC向け• コンシューマ向けのGeForceシリーズと比べて、単精度演算以外の演算も高速、速度や信頼性の高いメモリを搭載、などの違いがある• 対象とするGPUプログラミング開発環境：主にOpenACC– OpenACC：指示文を用いて並列化を行うプログラミング環境。C言語とFortranの両方の仕様が定められている。PGIコンパイラなど幾つかのコンパイラが対応。（GPUが主なターゲットだが）GPU専用言語ではない。
– CUDA (Compute Unified Device Architecture)：NVIDIAのGPU向け開発
環境。C言語版はCUDA CとしてNVIDIAから、Fortran版はCUDA
FortranとしてPGI(現在はNVIDIAの子会社)から提供されている。
– （特に単純なプログラムにおいては）OpenACCでもCUDAでも同様の性能が出ることもあるが、一般的にはCUDAの方が高速20• 2004年頃：GPU上である程度プログラミングが可能となった– 「プログラマブルシェーダ」が登場– それ以前は機能の切替程度しかできなかった– 主に画像処理のためのプログラミングであり、様々な汎用計算アルゴリ
ズムを実装するのに十分なものとは言えなかった• 2006年頃：CUDAが登場、様々な制限はありつつも「普通のプログラム」が利用可能に– 様々なアルゴリズムが実装された、科学技術計算への応用も活発化– GPUスパコンの誕生– バージョンアップにより高機能化、制限の撤廃（最新は8.0）• 2011年頃：OpenACCが提案される– CUDAより容易で汎用性のある（NVIDIA GPUに縛られない）プログラ
ミング環境に対する要求の高まり– 最新仕様は2.5、実装されているのは2.1程度まで

21• GeForce– コンシューマ向けグラフィックスカード– 主にゲーミングPCで使われる（＋最近は機械学習、VR等も）– 単精度演算性能を重視（倍精度演算用のHWをあまり搭載していない）、
クロック周波数が高めの傾向– 安価• Quadro– ワークステーション用グラフィックスカード• Tesla– HPC（科学技術計算、スパコン）向けGPU– 画面出力できないモデルも多い（“Graphics” Processing Unit……？）– 倍精度演算性能も重視、クロック周波数が低めの傾向、ECCメモリ対応– 安価とは言い難い

22• アーキテクチャ（世代）と特徴・新機能– Tesla：最初のHPC向けGPU– Fermi：2世代目、大規模HPCシステムにも普及（TSUBAME2など）• ECCメモリ、FMA演算、atomic演算– Kepler：現在HPCにて多く利用されているGPU• 動的な並列処理（GPUカーネルからGPUカーネルの起動）、Hyper-Q（複数CPUコアによるGPU共有）、シャッフル命令、読み込み専用
データキャッシュ、Unifiedメモリ、PCI-Express 3.0、etc.
– Maxwell：コンシューマ向けGPU• 電力あたり性能の向上、Teslaとしての製品は存在しない– Pascal：最新GPU、Reedbush-Hに搭載• HBM2（三次元積層タイプの高速メモリ）、高速な半精度浮動小数点
演算、 NVLink（高速バス）、SXM2（PCIe以外の接続形態）、etc.
– Volta：次世代GPU

23• 世代毎・型番毎に色々な性能や制限の違いがあるため、細かい最適化パラメタについては利用環境に合わせて考える必要がある– 最大並列度、レジスタ数、共有メモリ容量、命令実行サイクル数、etc.

24

•
•

GPUの構造と特徴について学ぶ
最適化を行ううえで考えるべきことの概要を学ぶ•

本講習会ではCUDAを用いたプログラム最適化については扱わないが、その方法（概要）を知っているとOpenACCの最適化も行いやすくなるため、簡単に説明する

25

SPARC64
IXfx

Xeon E5-2695 v4(Broadwell-EP)

Oakleaf-FX

Reedbush-H
ホストCPU

Tesla P100
(Pascal)Tesla K40
(Kepler)

Reedbush-H
GPU

Xeon Phi 7250
(Knights
Landing)
Oakforest-PACS

コア数

16

18
(HT 36/RBでは無効)

3584(64*56組)

2880(192*15組)

68(HT 272)

クロック周波数

1.848 GHz

2.1~3.3 GHz

1.328~1.480 GHz

745 MHz

1.4~1.6 GHz

搭載メモリ
種別と容量

DDR3
32GB

DDR4 最大1.54TB(RB 128GB/socket)

HBM2
16GB

GDDR5
12GB

MCDRAM 16GB
+ DDR4 96GB

Peak FLOPS[GFLOPS](DP/SP)

236.5

604.8
/ 1209.64800~5300/ 9600~10600

1430/ 42953046.2/ 6092.4

Peak B/W [GB/s]

85 (64.7)

76.8 (65.5)

720 (534)

288 (249)

MCDRAM (490)
DDR4 84.5

TDP [W]

110

120

300

235

215

※B/Wの括弧内はStream Triad実測値

26• ホスト(CPU)とデバイス(GPU)はPCI-Expressなどで接続されている• GPU上にはいくつかのコア群とデバイスメモリが搭載されている• コア群にはいくつかの計算コアと局所的な共有メモリが搭載されている• 局所的な共有メモリはデバ
イスメモリと比べて高速だ
が小容量

PCIe
など
GPU
デバイスメモリ
コア群

計算コア
計算コア
計算コア
（演算器、レジス
計算コア（演算器、レジス（演算器、レジス
タ、キャッシュ）（演算器、レジス
タ、キャッシュ）タ、キャッシュ）タ、キャッシュ）局所的な共有メモリ27• CPUからの指示に従ってGPUが動作する– 現状、CPUとGPUは主従の関係にあると言える
CPU

GPU
•
•
•
•

main関数実行開始
メモリ確保指示
データ送信
GPUカーネルの起動
GPUが計算を行っている間にCPUは他の処理をしても良い• データ取得リクエスト• メモリ解放指示

メモリ確保
データ受信
計算開始
GPUカーネル
結果返送
メモリ解放

これはCUDAを使う場合のイメージであり、OpenACCではもう少し単純なイメージで扱う（→後述）

28• 物理的な構成の概要• コア群（SM）はGPUあたり1～56（GPUのグレードに依存）• CUDAコアはSMあたり8~192（GPU世代に依存）
HOST

GPU
Streaming Multiprocessor (SM)Register
×数グループSharedMemory

ConstantCache

TextureCache

DeviceMemory

MainMemory

PCI-Express

CUDA コア

スケジューラ（×数グループ）

29• 階層性のあるハードウェア構成– 演算器の構成• 階層性のある演算器配置（CUDAコア*m × SM*n）• 幾つかの計算コアがグループを構成、同一グループ内のコアは同時に同じ演算のみ可能（SIMD的な構成）– CPUのコアのように独立して動作できず、分岐方向が違う場合にはマスク処理される– NVIDIAはSIMT(Single Instruction Multiple Threads)と呼んでいる– メモリの構成• 階層性と局所性のあるメモリ配置– 全体的な共有メモリ ＋ 部分的な共有メモリ ＋ ローカルメモリ– GPU上に搭載された大容量でグローバルなメモリ：DeviceMemory– 局所的に共有される小容量高速共有メモリ：SharedMemory– コア毎に持つレジスタ

30• 実行モデルとメモリ構成の概要

SMに対応

Grid
Block ×n個

(DeviceMemory)

CUDAコアに対応

Thread×m個

SharedMemory

GlobalMemory

ConstantMemory

TextureMemory

Host (CPU, MainMemory)

Register CPUのプロセスやスレッド同様に、Block・Threadは物理的な数以上に生成可能、
CUDAではGPUカーネル起動時に<<<,>>>という記号を用いて指定する
 特にThreadは物理的な数を超えて作成した方が良い（後述）31• 特徴の異なる複数種類のメモリ– 必ずしも全てのメモリを使う必要はない
名称

Lifetime

GlobalMemory

プログラム GPU全体 高速・高レイテンシ～GB

ConstantMemory

プログラム GPU全体 高速・高レイテンシ＋キャッシュ

64KB

TextureMemory

プログラム GPU全体 高速・高レイテンシ＋キャッシュ

GlobalMemoryと共用

SharedMemory

Grid

SM単位

超高速・低レイテンシ~112KB/SM *Register

Grid

非共有

超高速・低レイテンシ~64KB/SM *LocalMemory **

Grid

非共有

高速・高レイテンシ

-

共有範囲

速度

容量

* GPUの世代により異なる** 実体はGlobalMemory、レジスタを使いすぎるとLocalMemoryに配置され
てしまう

32

• 計算時のデータの流れ
Grid

SharedMemory

ThreadConstantMemory

GlobalMemory

４

Host (CPU, MainMemory)

TextureMemory×m個
５Register

３
２
１

Block ×n個

(DeviceMemory)

33• もう少し詳しい実行モデル解説– CPUによるGPU制御、GPU上のコアの一斉動作

Host

GPU
①

GlobalMemory

MainMemory

※一斉に
動作

③
②
① SendCPU② Exec③ Recv

コア

コア

コア

SharedMemory

コア

コア

コア

SharedMemory

34• もう少し詳しい実行モデルのイメージ– 各コアが流れてくる命令を処理していくようなイメージ– GPU上のコア群は同時に同じ命令を実行している（全体で、ではない）
CUDA

マルチコアCPU
命令H

命令h

命令H

命令G

命令g

命令G

命令F

命令f

命令F

命令E

命令e

命令E

命令D
コア 0
命令C

命令d
コア 1
命令c

命令B

命令b

命令B

命令A

命令a

命令A

↓

↓

↓

コア 0

コア 1

命令D
コア 2

命令C

コア 3

…

35

• 実際のスケジューリングは32スレッド単位（＝WARP単位）で実行される• 異なるデータに対して同時に同じ演算を行う– 実行時に取得できるIDを用いて各自の計算対象（配列インデックス）を算出する– この点においてはMPIやOpenMPとあまり変わらない• WARP内のスレッド毎に分岐方向が異なるプログラムを実行する場合は、分岐方向の異なるスレッドは待たされる– divergent WARP、重要な性能低下要因– スレッドIDが連続する32個のスレッド毎に分岐方向が揃うようなプログ
ラムを作成すれば、divergent WARPによるペナルティが発生しない

36• 高性能が得られるプログラムの条件– 大量のスレッドを生成する• 理想的なBlockあたりスレッド数は64~256程度• GPUの世代やプログラムの複雑度などにも影響を受ける– GlobalMemoryのコアレスアクセスを行う• メモリアクセスをまとめる機能がある– SharedMemoryのバンクコンフリクトを回避する• SharedMemoryを利用する際に同じメモリバンクにアクセスすると性能が低下する– 分岐しない• GPUはCPUと比べて分岐処理に弱い• ループアンローリングがなどにより改善することもある• 以下、各手法の概要について説明する– 最適化の際には各手法が衝突することもあるので注意が必要

37• スレッドのコンテキストを切り替えるのがとても速いため、メモリアクセスを待つよりコンテキストを切り替えて別のス
レッドを処理した方が速い• 逆に言えば大量のスレッドでGlobalMemoryに対するメモリア
クセスのレイテンシを隠蔽しないと高い性能が得られない• ただし、レジスタや共有メモリの使用量が多すぎると多数のスレッドを実行できない– 同時に実行できるスレッドやブロックの数は色々な資源の使用量によって決まる– 並列度の高いシンプルなGPUカーネルが望ましい

38

• CPU

• GPU（CUDA）
計算命令
メモリアクセス
命令

メモリアクセス待ちの際に実行スレッドを切り替える

メモリアクセス待ち

time

time

メモリアクセス待ち39• 同一SM内の複数CUDAコアによるメモリアクセスが近い場合にまとめてアクセスできる– 詳細な条件はGPUの世代によって異なる• 最新世代ほど条件が緩い• アクセスがバラバラな（遠い）場合
コア0 コア1 コア2 コア3

4回のメモリアクセスが行われる

GlobalMemory• アクセスが揃っている（近い）場合
コア0 コア1 コア2 コア3GlobalMemory

1回のメモリアクセスに纏められる（高速）40• 高速共有メモリは16個or32個ずつのバンクにより構成– 同一バンクへのアクセスが集中すると性能低下• 均等なアクセス＝性能低下しない

SharedMemory• アクセスが集中＝性能低下する
2-way
バンクコンフリクトの例
SharedMemory