ヘテロジニアスな環境における...
TRANSCRIPT
ヘテロジニアスな環境におけるソフトウェア開発
Agenda
• ヘテロジニアスな環境の登場
– ホモジニアスからヘテロジニアスへ
• ヘテロジニアスなアーキテクチャ
– GPU
– CUDA
– OpenACC, XeonPhi
• 自分のプログラムを理解するために
– デバッガ、共通の操作体験
– TotalView
• 続きはブースで
今日の概要
より速く
ホモジーニアスな並列
• HPC
– 銀河生成、金融のリスク計算、車の衝突解析、製薬、 …
– 大規模、複雑なアルゴリズム、高速、 …
• 単一のCPUコアはクロック数が頭打ち ~ 3GHz
• ホモジーニアスな並列
– マルチスレッド (OpenMP, pthreads)
– CPUクラスタ、マルチプロセス (MPI)
• 高い汎用性、長年の実績とノウハウ
• メモリアクセス速度のボトルネック
• 高価なインターコネクト
• 複雑な非同期プログラミング
The Free Lunch Is OverBy Herb Sutter
より速く
専用の外付けデバイス
MICコプロセッサ
GPUアクセラレータ
• シンプルで高速な演算器
• 高い並列化効率
• 費用対効果
• 省電力
• 新しい言語拡張の理解
• ハードウェアの理解
ヘテロジニアスな開発環境
より速く
Top 500, Green 500, …
ヘテロジニアスな環境
GPUとXeonPhi
GPU• CUDA とOpenACC• Device, SM, CUDA Core, Warp, Lane• block, thread, … • global memory, shared, …
Xeon Phi• offloadディレクティブ• symmetricモード• nativeモード• 512bitのベクトル
GPUアーキテクチャ
• ホストCPUのアクセラレータとして
– あるいはホストをGPU演算の補助装置として
• 数千コアの並列
• グリッド(デバイス)、SM、CUDAコア(SP)
• 複数CPU x 複数GPU
• 製品ライン
– GeForce, Quadro, Tesla, …
• アーキテクチャ
– Kepler, Fermi, Maxwell, …
ハードウェア
GPUアーキテクチャ
ハードウェア階層• Grid
• SM (16個 / Grid) (Fermi)
• CUDAコア (SP, 32個 / SM) (Fermi)
• Warp(縦糸, 32スレッド)
– 制御単位。ベクトル
• Thread (撚り糸, 3D, レーン)
– CUDAコアとregisterの組
– 軽量
Grid
SM (Streaming Multiprocessor)
CUDAコア
メモリの種類• オフチップ
– Video memory
• オンチップ
– shared memory (64kB/SM)
– register
– constant cache, texture cache
CUDA
• GPUベンダーのNVIDIA公式(信頼。ベンダーロック)
• 無償の開発環境。cuFFTやcuBLASなどの数値計算ライブラリ付属。
• OpenCV, MATLAB, IMSLなどツール経由でCUDA利用することも
• ホストはWindows, Linux, Mac
• レイヤーが低く、コードが複雑。
• CUDA 5.0 5.5
– Dynamic Parallelism
• Cuda 6.0
– Unified Memory
NVIDIA CUDA
CUDAアーキテクチャ
• グリッド (デバイス)
• スレッドブロック (2D/3D)
– SMへの割付単位
• スレッド (3D)
CUDAの論理階層
• ホスト側 (呼び出し)
– MatMulKernel<<<dimGrid, dimBlock>>>(matA, matB, matC);
• デバイス側 (実装)
– __global__ void MatMulKernel(Matrix A, Matrix B, Matrix C) { ... }
• 論理構造を明示的に指定
Kernel関数
CUDAアーキテクチャ
• 開発者が明示的に指定
メモリ階層(論理的)
Memory Scope Locality
Global Device External
Shared Block Chip
Local Thread Chip
Constant Device Chip (cache)
Texture Device Chip (cache)
Register Thread Chip
shared 16kB
CUDAプログラミング
• 同一ファイル内に混在可能
• NVCCが振り分けてくれる
• メモリ修飾子
– __device__, __constant__, __shared__
• 関数修飾子
– __global__, __device__, __host__
ホストコードとデバイスコード
• 言語
– C言語の拡張
– コンパイラNVCC
– Python,Javaなどのバインディング
CUDAプログラミング
単純なプログラムの例
• CUDAサンプルvectorAdd
– 2つの配列の足し算
• データを計算単位に分割する。
• 組み込み変数 blockIdx, threadIdxごとに分ける。
• 何番目のBlock (3D), 何番目のThread (3D)にいるの
か?(論理階層)
• 何番目のdevice, SM, Warp, Laneにいるのか?(物理
階層)
kernel関数の定義
ホストメモリ確保
ホストデータ初期化
デバイスメモリ確保
メモリ転送
kernel関数呼び出し
デバイスメモリ解放
ホストメモリ解放
OpenACC
• Fortran, C/C++。有償
• ディレクティブ指向
– OpenMPとの類似
– ホストコードのみ記述
– 通常のCPUコードとしても使える
• コンパイラが多くの仕事を担当
– ループの検出
– GPUの側のメモリ管理
– CPUとGPUの間のデータ移動
– Kernel関数を作成するかどうか
• オープン規格
• Cray, PGI, NVIDIAがサポート
• CUDAと組み合わせることができる。
OpenACCの特徴
OpenACC CUDA
gang threadblock
worker warp
vector warp内のスレッド
OpenACCの論理階層
Xeon Phi
• ホストCPU にPCI Expressで接続するボード。
• MICアーキテクチャのx86互換のコプロセッサ。
– 汎用的なCPU用に書かれたコードの移植性が高い
• コアごとに512bitのSIMD処理(16命令/clock, ベクトル長)
• 独立したOS(Linux)が動作し、sshなどによるアクセス
Intel Xeon Phi コプロセッサ
• Offloadモデル
– ディレクティブ。必要な部分だけコプロセッサに投げる。
• シンメトリックモデル
– ホストとコプロセッサの間でMPIなどを使ってやりとりする
• Nativeモデル
– コプロセッサ上でのみ実行。 既存のコードをそのまま使える
柔軟な実行モデル
Xeon Phi
offloadのコード例void test08() {
float pi = 0.0f;const int count = 10000;int i;
#pragma offload target (mic)#pragma omp parallel for num_threads(4) private(i)
reduction(+:pi)for (i = 0; i < count; ++i) {
float t = (float)((i + 0.5f) / count);pi += 4.0f / (1.0f + t * t);
}pi /= count;
}
host
host
MIC
t1t0 t2 t3
MIC
offload
OpenMP
コードを理解する
• ハードウェアやプログラミングモデルの特性を理解
• メモリの制約を理解してエラーを回避する
• 複数言語、複数パラダイム
• クラスタ、スレッド、ヘテロジニアス、vector
様々なヘテロジニアス環境
• プログラムは意図したとおりではなく書かれたとおりに動く
• At Operation. 仕様書ではなくコードが全て
• 複数人による作業
• 引き継ぎ
• 移植
自分のコードがどう振る舞うか
γνῶθι σεαυτόν (汝自身を知れ, Know thyself)
コードを理解する
効率的なデバッガ
• code reading, ペアプログラミング、ベアプログラミング
• どの処理がデバイス上でどのように振舞っているか想像する
• デバッグはコーディングの2倍大変
• 開発時間の制約
• 手ぶらで立ち向かうのは危険
自分のコードと仲良くなるために
TotalView
• 幅広いコンパイラ、プラットフォーム
– C, C++, Fortran 77 & 90
– Unix, Linux, MacOS X,
– ラップトップからスパコンまで
• 並列デバッグ
– マルチスレッド、MPIデバッグ
– CUDA, Intel Xeon Phi, OpenACC
• メモリ・デバッグ機能: MemoryScape
• リバース・デバッグ機能: ReplayEngine
• パワフルで軽量、使いやすい GUI
• パッチ機能breakpoint: Evaluation Point
• スクリプト用の CLI,バッチ・デバッグ
• リモートデバッグ
TotalView
TotalView
• HPCwire 影響力のあるミドルウェア20 (2014/6)
• 世界中の企業や研究機関
TotalView
様々な動作画面
OpenACC CUDA(デバイスコード)
XeonPhiホスト コプロセッサ
同じインターフェイス
• breakpoint, ステップ実行, 関数の呼出履歴、配列の表示, …
TotalView
CUDAのデバッグ画面
GPUフォーカススレッドの論理座標
スタックトレースとインライン関数
warpのPC
CUDAグリッドとブロックの次元、warp/レーン、warp/SM、warp数
パラメータ、レジスタ、局所変数と共有変数
TotalView
CUDA:2つの座標をマッピング
物理座標 論理座標
Grid, SM, Warp, Lane Grid, Block, Thread
Summary
• 開発は大変
– 開発者や研究者はGPU, Xeon-Phiなどの新しいデバイスになじまなければならない
– 同時に従来のOpenMPやMPIの手法も知っておく必要がある
– それぞれの環境ごとのプログラムの挙動の違いをイメージする
– これらを限られた時間の制約の中で行わなければならない
• コードを知るにはデバッガが便利!
• TotalViewは複数のホストとデバイス、幅広いアーキテクチャに対し同一の操作体験
• Accelerating Great Code
ヘテロジニアスな環境
TotalViewで定時に帰ろう!!
結論
XeonPhi
http://www.eetindia.co.in/ART_8800700109_1800012_NT_af7fa4b9_2.HTM
Xeon Phi
The spectrum of models
CPU中心 Intel® Xeon Phi 中
心
ホスト
コプロセッサ
マルチコアのホスト メニーコアのホストシンメトリックoffload
Main( )Foo( )MPI_*()
Main( )Foo( )MPI_*()
Main( )Foo( )MPI_*()
Foo( ) Main()Foo( )MPI_*()
Main( )Foo( )MPI_*()
PCIe
汎用的なシリアル
および並列計算ディレクティブで並列化
対等なMPI ネイティブ
How can TotalView help you?
• Threads and/or MPI
– Deadlocks and hangs
– Race conditions
– It provides
• Asynchronous thread control
• Powerful group mechanism
• Fortran and/or C++
– Complex data structures
• Diving and recursive dive
– STL Collection Classes
• STLView
– Rich class hierarchies
• Powerful type-casting
features
Effective Debugging requires the capability to control and examine specific instances of
program execution in detail
• Memory Analysis
– Leaks and Bounds Errors
• Automatic error detection
tools
– Out of Memory Errors
• Analysis of heap memory
usage by file, function and
line
• Numerical errors
– Extensible data visualization
– Slicing and filtering of arrays
– Powerful expression system
– Conditional watchpoints
TotalView provides an answer to the question : “What is my program really doing?”
TotalView
• CUDA 4.2, 5.0, 5.5, 6.0対応
• CUDAの統一メモリ(unified memory)
• CUDAの動的モードのプログラム
• 1つのセッション内でホストとデバイスのコードをデバッグ
• TeslaやFermiなどのハードウェア上のCUDA
• LinuxおよびGPUデバイス上のスレッドを可視化
• デバイス、ブロック、スレッドメモリの階層構造を完全に可視化
• デバイスのスレッドを論理座標とデバイス座標の両方で操作可能
• CUDAの関数呼び出し、ホストのピン止めされたメモリ領域、CUDAコンテ
クストを可視化
• CUDAの関数をインラインでもスタック上でもハンドリング
• 使いやすい軽量なGUIと、自動化に適したCLI(コマンドライン)
• 複数のNVIDIAデバイスを使うアプリケーション
• CUDAで高速化されたクラスタ上のMPIアプリケーション
• 統一された仮想アドレスとGPUDirect
• メモリエラーを検知してレポート、CUDAの例外をハンドリング
NVIDIA CUDA
TotalView
CUDAのデバッグ画面
スレッド (x,y,z)
ブロック (x,y,z)
GPUフォーカス・スレッド・セレクタでCUDAスレッドのブロック(x,y) やスレッド (x,y,z) インデクスを変更する
ボックスの中にある行番号をクリックしてbreakpointを置く
TotalViewのスレッドID0以上: ホストスレッド0より小さい: GPUスレッド
TotalView
CUDAの例
GPUフォーカススレッドの論理座標
スタックトレースとインライン関数
warpのPCを指す矢印
CUDAグリッドとブロックの次元、レーンあたりのwarp、SMあたり
のワープ、ワープ数などなど
パラメータ、レジスタ、局所変数と共有変数
TotalView
GPUデバイスの情報を表示
デバイス情報
論理情報
TotalView
• ホストCPU/GPUどちらでもス
テップ実行
• コンパイラ Cray CCE 8.x
OpenACC
OpenACC
TotalView
• シンメトリックモデルのデバッグができる初め
てのデバッガ
• 付属のMemoryScapeでネイティブおよびシン
メトリックモデルのメモリデバッグ(オフロード
は8.13では未対応)
• ホストとコプロセッサ両方のスレッドを完全に
可視化
• MPI プログラムの完全サポート
• オフロードコードによる異種混合アプリケー
ションのシンメトリックデバッグ
• Xeon Phi ネイティブ・アプリケーションのリ
モートデバッグ
• Xeon および Xeon Phi 両方の非同期スレッド
制御
• マルチホスト、マルチカード
• リバースデバッグは未対応
Intel Xeon Phi
TotalView
1つのデバッグセッションで同じ操作体験ホスト コプロセッサ