GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0: GPUスパコン 本演習ではNVIDIA社の

Similar documents
1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

Slide 1

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

TSUBAME2.0におけるGPUの 活用方法

07-二村幸孝・出口大輔.indd

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

Slide 1

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

untitled

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation

NUMAの構成

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

1. マシンビジョンにおける GPU の活用

GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

CUDA基礎1

Microsoft PowerPoint - suda.pptx

GPGPUクラスタの性能評価

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1

スライド 1

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード]

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

2011 年 3 月 3 日 GPGPU ハンズオンプログラミング演習 株式会社クロスアビリティ ability.jp 3 Mar 2011 Copyright (C) 2011 X-Ability Co.,Ltd. All rights reserved.

CUDA 連携とライブラリの活用 2

PowerPoint プレゼンテーション

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

GPU.....

N 体問題 長岡技術科学大学電気電子情報工学専攻出川智啓

Microsoft PowerPoint - 11.pptx

演算増幅器

GPU CUDA CUDA 2010/06/28 1

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

GPGPUイントロダクション

Microsoft PowerPoint - GPU_computing_2013_01.pptx

tabaicho3mukunoki.pptx

スライド 1

Microsoft PowerPoint - kougi7.ppt

PowerPoint プレゼンテーション

演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出 ( プログラム + 考察レポート ) で単位

program7app.ppt

パソコンシミュレータの現状

OpenFOAM(R) ソースコード入門 pt1 熱伝導方程式の解法から有限体積法の実装について考える 前編 : 有限体積法の基礎確認 2013/11/17 オープンCAE 富山富山県立大学中川慎二

Microsoft PowerPoint - handout07.ppt [互換モード]

Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx

PowerPoint Presentation

1 GPU GPGPU GPU CPU 2 GPU 2007 NVIDIA GPGPU CUDA[3] GPGPU CUDA GPGPU CUDA GPGPU GPU GPU GPU Graphics Processing Unit LSI LSI CPU ( ) DRAM GPU LSI GPU

Microsoft PowerPoint _OpenCAE並列計算分科会.pptx

ex04_2012.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

微分方程式 モデリングとシミュレーション

Microsoft PowerPoint - kougi9.ppt

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速

GPUを用いたN体計算

PowerPoint プレゼンテーション

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran

Microsoft Word - 3new.doc

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

修士論文

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

Microsoft PowerPoint - 先端GPGPUシミュレーション工学特論(web).pptx

<4D F736F F F696E74202D2091E63489F15F436F6D C982E682E992B48D8291AC92B489B F090CD2888F38DFC E B8CDD8

スライド 1

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

偏微分方程式の差分計算 長岡技術科学大学電気電子情報工学専攻出川智啓

Microsoft Word - no12.doc

cp-7. 配列

Microsoft PowerPoint - 09.pptx

工学院大学建築系学科近藤研究室2000年度卒業論文梗概

Microsoft PowerPoint - OpenMP入門.pptx

N08

スライド 1

Microsoft PowerPoint - 13th.ppt [互換モード]

スライド 1

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

MPI または CUDA を用いた将棋評価関数学習プログラムの並列化 2009/06/30

27_02.indd

Microsoft PowerPoint - OS07.pptx

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日

Fujitsu Standard Tool

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション

プログラム言語及び演習Ⅲ

memo

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

02: 変数と標準入出力

Images per Second Images per Second VOLTA: ディープラーニングにおける大きな飛躍 ResNet-50 トレーニング 2.4x faster ResNet-50 推論 TensorRT - 7ms レイテンシ 3.7x faster P100 V100 P10

スライド 1

Prog1_10th

Microsoft Word - HOKUSAI_system_overview_ja.docx

02: 変数と標準入出力

GPUによる樹枝状凝固成長のフェーズフィールド計算 青木尊之 * 小川慧 ** 山中晃徳 ** * 東京工業大学学術国際情報センター, ** 東京工業大学理工学研究科 溶融金属の冷却過程において形成される凝固組織の形態によって材料の機械的特性が決定することは良く知られている このようなミクロな組織の

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

最新の並列計算事情とCAE

PowerPoint Template

数値計算

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

memo

Transcription:

演習II (連続系アルゴリズム) 第2回: GPGPU 須田研究室 M1 本谷 徹 motoya@is.s.u-tokyo.ac.jp 2012/10/19

GPU 画像 動画処理用ハードウェア 低性能なプロセッサがたくさん詰まっている ピーク性能が非常に高い GPUを数値計算に用いるのがGPGPU Graphics Processing Unit General Purpose GPU TSUBAME2.0: GPUスパコン 本演習ではNVIDIA社のGPUを用いる CUDA プログラミングをしてもらいます

性能指標 (1) FLOPS Floating point operations per second 1秒あたりに何回浮動小数点数演算ができるか TOP500 (http://www.top500.org/ ) にスパコンのLINPACK 性能, ピーク性能が載っている ピーク性能 (理論性能): 物理的な性能の限界 性能を測る際の目標 Xeon X5670 - 数十GFLOPS Tesla M2050 - 倍精度: 515 Gflops 単精度: 1.03 Tflops GPU はピーク性能に近づけるのが難しい

性能指標 (2) バンド幅 通信帯域 1秒あたりにどれだけデータが送れるか Tesla M2050 の理論値は 148 GB/sec GPU内のプロセッサ メモリ間のバンド幅

GPU アーキテクチャ SP: SM: Cuda core Multiprocessor

GPU の情報を調べるには? devicequery コマンドを使う csc ではログインノードで実行してもGPUが無い ジョブに書いて投げてください 計算ノードに入ればGPUが見えます GPUの情報がたくさん返ってくる コア数 メモリ量 メインメモリ キャッシュ 共有メモリ Warp cudagetdevcieproperties を呼ぶ

CUDAプログラミング Compute Unified Device Architecture プログラミングモデルはSPMD CPUからGPUを呼び出す GPUでの命令処理はSIMD CPUをホスト GPUをデバイスと呼んで区別 Single Instruction Multiple Data C, C++ の拡張として実装されている 拡張子は *.cu コンパイラはnvcc #include<cuda.h>, #include<cuda_runtime.h> csc では Torque を通して実行してください ノード は 1つ

CUDAのスレッド管理 実際のSP数よりはるかに多いスレッドを走らせることができる スレッドは階層的になっている グリッドにスレッドを詰め込んで その中にあるスレッドをまとめて実行 グリッドの中にはブロックが2次元的に配置される 1辺の長さは最大で65535 各辺の最大は65535 x 65535 (x1) ブロック処理はSMに割り当てられる ブロックの中にはスレッドが3次元的に配置される 1つのブロックの最大スレッド数は512 各辺の最大は512 x 512 x 64 スレッドは平行に処理される スレッド処理はSPに割り当てられる

ベクトル型 dim3 宣言 3次元ベクトル整数型 x,y,z の要素を持つ構造体のようなもの 要素は全て1で初期化されている dim3 hoge(8, 9, 10); dim3 hoge; hoge.x = 8; hoge.y = 9; hoge.z = 10; dim3 hoge = {8, 9, 10}; dim3 に似たものに uint3 (符号無整数ベクトル型)がある uint3 は構造体と同じ扱いをする unit3 と同様のものとしてshort3, float3, float4 などが用意されている float4 のメンバは x,y,z,w

カーネル関数 (1) CPUから直接呼び出され GPUで計算する関数をカーネル関数と呼ぶ 普通の関数呼び出しに <<<>>> をかませるだけ cf. function<<<dg, Db>>>(a, b, c); Dg, Db はdim3 変数 Dg にはグリッドに詰めるブロックの数を渡す Db には1つのブロックに詰めるスレッドの数を渡す 個々のスレッドの処理をカーネル関数に記述する uint3 blockidx, uint3 threadidx, dim3 griddim, dim3 blockdim の4つが それぞれ予め用意されていてカーネル関数内からアクセスできる blockidx の値を読み出して自分のブロック番号を知る threadidx の値を読み出して自分のブロックにおける自分のスレッド番号を知る griddim には上記Dg の値がそのまま入る blockdim には上記Gb の値がそのまま入る

カーネル関数 (2) GPU(カーネル関数) とCPUは非同期に実行 cudathreadsynchronize() で同期を取る カーネル関数どうしは基本的には同期的 時間の測り方 struct timeval t0,t1; gettimeofday(&t0, NULL); KernelFunction<<<Grid, Thread>>>(Args); cudathreadsynchronize(); gettimeofday(&t1, NULL); printf( Elapsed time = %lf\n, (double)(t1.tv_sec t0.tv_sec) + (double)(t1.tv_usec t0.tv_usec) /(1000*1000)); float f; cudaevent_t event[2]; For (i=0; i<2; i++) cudaeventcreate(&event[i], 0); cudaeventrecord(event[0], stream_1); KernelFunction<<<G,T,0,stream_1>>>(Args); cudaeventrecord(event[1],stream_1); cudaeventsynchronize(event[1]); cudaeventelapsedtime(&f, event[0], event[1]); printf( Elapsed time = %lf\n, f*1000)

関数修飾詞 global device カーネル関数に付く修飾詞 ちなみにカーネル関数の返り値は voidである カーネル関数以外でデバイスのみで実行される関数に付く 同じく void型の関数に付く host ホストで実行される関数の修飾詞 省略可

GPU のメモリ階層 名称 アクセス 速度 レジスタ 自分のスレッドのみ 4 cycle 共有メモリ 同じMultiprocessor内にあるスレッド syncthreads() で同期 デバイスメモリ 同じGPU内にある全てのスレッド 500 cycle 同期にカーネル関数再呼び出しが必要 キャッシュされる 定数メモリ 全てのスレッド キャッシュされる ローカルメモリ レジスタが溢れると使われる デバイスメモリ上に置かれる 12 cycle hit: 20 cycle miss: 500 cycle 500 cycle

メモリ操作関数 cudaerror_t cudasuccess cudaerror_t cudamalloc(void **devptr, size_t count) GPUのデバイスメモリに配列を確保する関数 cudaerror_t cudafree(void *devptr) CUDA関数が成功したときに返る値 確保したデバイスメモリの配列を開放する関数 cudaerror_t cudamemcpy(void *dst, const void *src, size_t count, enum cudamemcpukind kind) src からdstにメモリ転送する関数 kind には 以下の3種類を指定 cudamemcpyhosttodevice cudamemcpydevicetohost cudamemcpydevicetodevice (CPUからGPU) (GPUからCPU) (GPUからGPU) CPU から直接デバイスメモリをいじることはできない

メモリ修飾詞 device constant 定数メモリを修飾する 関数外に宣言する 初期化するかcudaMemcpyToSymbol()で転送する shared デバイスメモリを静的に宣言する場合に修飾させる 関数外に宣言する cudamemcpytosymbol()で転送する 共有メモリを修飾する カーネル関数内に宣言する cudaerror_t cudamemcpytosymbol(const char *symbol, const void *src, sizt_t count, size_t offset, enum cudamemcpykind kind) offset = 0, kind = cudamemcpyhosttodevice

デバイス操作関数 cudaerror_t cudagetdevicecount(int *count) cudaerror_t cudagetdevcieproperties( struct cudadeviceprop *prop, int device) デバイスのプロパティがpropに入って返ってくる関数 cudaerror_t cudasetdevice(int device) 使用可能なデバイスの数がcount に入って返ってくる関数 使用するデバイスを指定する関数 使用できるデバイスはCPU 1スレッドにつき 1個まで cudaerror_t cudagetdevice(int *device) 現在使用しているデバイス番号がdevice に入って返ってくる関数

サンプルコード ベクトルの和計算 global void AddVector_GPU(float *a, float *b, float *c, int size){ int index = blockidx.x * blockdim.x + threadidx.x; if(index<size) c[index] = a[index] + b[index]; } float *dev_a, *dev_b, *dev_c; cudamalloc((void**)&dev_a, sizeof(float)*n); cudamalloc((void**)&dev_b, sizeof(float)*n); cudamalloc((void**)&dev_c, sizeof(float)*n); dim3 Grid, Block; Block.x = 196; Grid.x = N/196 + 1; cudamemcpy(dev_a, a, sizeof(float)*n, cudamemcpyhosttodevice); cudamemcpy(dev_b, b, sizeof(float)*n, cudamemcpyhosttodevice); AddVector_GPU<<<Grid, Block>>>(dev_a, dev_b, dev_c, N); cudathreadsynchronize(); cudamemcpy(c, dev_c, sizeof(float)*n, cudamemcpydevicetohost); cudafree(dev_a); cudafree(dev_b); cudafree(dev_c);

Warp (1) GPUはSIMD型の命令実行を行う 同じ命令を32個のスレッドが同時に実行する Warp はout-of-order 実行 8つのSPが4cycle かけて実行する 同時実行する32個のスレッド単位をWarp(縦糸)と呼ぶ 準備のできたWarpから実行していく int 型の組み込み変数warpSize がカーネル関数 に用意されている もちろん 32

Warp (2) GPUでは条件分岐の分岐先が全て 実行される 有効なスレッドの結果のみが反映 不必要な命令実行が発生する このことをWarp divergence と呼ぶ なるべくWarp divergence は避ける if(a) B; else C;

デバイスメモリの coalescing メモリアクセスは16スレッドが同時に行う グローバルメモリのアクセス及び転送は以下の3つ (Compute capability 1.2 以上) Warp の半分 32バイト境界でアラインメントされた32バイト 64バイト境界でアラインメントされた64バイト 128バイト境界でアラインメントされた128バイト 同時に行われるメモリアクセスはなるべく少なく済ます 同時に発生するメモリアクセスの場所をできるだけ固まらせ かつでき るだけ同じアラインメント内に納めることを coalescing と呼ぶ

共有メモリ (1) GPUでのソフトウェアキャッシュ グローバルメモリより非常に高速 プログラムに明示的に記述する 同じブロック内のスレッドがアクセスできる カーネル関数に shared 修飾詞を付けて宣言 syncthreads() を用いて同期を取る必要がある

共有メモリ (2) 共有メモリも16 スレッドが同時にアクセスする 32個のバンクで構成されている 各バンクに対して1回につき1つのアドレスにアクセス 16スレッドがそれぞれ別のバンクにアクセスしたい 1つでもバンクが被ることをバンクコンフリクトと呼ぶ バンクコンフリクトはなるべく避ける

初級CUDA (6) 共有メモリ (3) Bank conflict が発生しているケース shared float s[n]; s[threadidx.x*2] = f(x);

初級CUDA (7) 共有メモリ (4) Bank conflict が発生していないケース shared float s[n]; s[threadidx.x] = f(x);

ループアンローリング for ループは展開したい 回数が定数なら nvccが展開してくれる #pragma unroll をforループの直前に書くことで 明示的に展開できる #pragma unroll n とすることで n回分展開される #pragma unroll 1 で展開されなくなる #pragma unroll 4 for(i=0; i<n; i++){ y[i] = f(x[i]); } for(i=0;i<n-4;i+=4){ y[i] = f(x[i]); y[i+1] = f(x[i+1]); y[i+2] = f(x[i+2]); y[i+3] = f(x[i+3]); } for(;i<n;i++){ y[i] = f(x[i]); }

第2回課題 差分法で偏微分方程式の数値シミュレーションをせよ 陽解法を使って2次元拡散方程式を解いてください 初期条件: 境界以外全て 1.0 境界条件: 境界において常に0 0 < r < 0.25 計算領域は任意 上限反復回数は100回 まずはCPUで実装してください GPUを用いて高速化をしてください CPU, GPU ともに FLOPS, GB/s をそれぞれ測定してください 上記方程式1回当たり6FLOPSとしてください

補足 (1) 偏微分方程式 偏導関数を含む等式 2種類以上の変数で偏微分されている 空間方向 時間方向など 常微分方程式は特殊な偏微分方程式 境界条件 初期条件が解を決定づける 解析的に解くのは困難もしくは不可能 計算機を用いて数値解を求める 空間 時間それぞれに関して離散化して数値計算する

補足 (2) 偏微分方程式と有限差分法 連続な偏微分方程式を離散化して解く手法 有限差分法は最も簡易かつ明解な方法の1つ 偏微分されている方向に向かって格子を生成する それぞれの格子の点に対して微分を差分に置き換 えて値を求める

補足 (2) 偏微分方程式と有限差分法 連続な偏微分方程式を離散化して解く手法 有限差分法は最も簡易かつ明解な方法の1つ 偏微分されている方向に向かって格子を生成する それぞれの格子の点に対して微分を差分に置き換 えて値を求める

補足 (3) 偏導関数と離散化誤差 例としてx軸方向の2階偏導関数 Taylor 展開を使う 離散化誤差

補足 (4) 2次元拡散方程式とその離散化 (1) 時間発展型の偏微分方程式 熱や流体中のインクの濃度が拡散していく様子を表す これを離散化する とし 未知数を左辺にもってくる

補足 (5) 2次元拡散方程式とその離散化 (2) 今回の課題では陽解法を使ってもらいます 前の時刻の値を用いて次の時刻の値を求めていく方法 今回の2次元拡散方程式の離散化スキームでは自分を 含めて周りの5つの点から次の自分の値を求めている 赤が現在 青が未来

補足 (6) ダブルバッファリング 時間発展型の偏微分方程式を解く過程において 全ての時間の値を保存していくと容量が足りない 時間を更新していくには最低で2つの領域が必要 片方の領域の数値を計算に使い もう片方の領域 に次の時間の値を埋めていく

課題について renzoku-enshu@is.s.u-tokyo.ac.jp に提出 氏名 学籍番号 出題日を明記 レポートを pdf にした上でメールで提出 演習IIであることも明記 Subject は 演習2第 回レポート 提出者氏名 プログラム+レポート 課題の半分以上の提出が単位の取得条件 全8回を予定 締切は各課題出題日から2週間後 http://olab.is.s.u-tokyo.ac.jp/~reiji/enshu2_12.htmlを参照