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

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

GPGPUイントロダクション

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

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

今回の内容 GPU の発展 GPU のアーキテクチャ CPU の発展 性能の変化 シングルコアからマルチコア GPU の応用例 6

Microsoft PowerPoint - GPU_computing_2013_01.pptx

Slide 1

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

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

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

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

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

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

NUMAの構成

Microsoft PowerPoint - suda.pptx

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

Slide 1

プログラミング実習I

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

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

PGIコンパイラ導入手順

いまからはじめる組み込みGPU実装

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

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

プログラミング基礎

untitled

GPGPU

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

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

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

PowerPoint Presentation

本文ALL.indd

PowerPoint プレゼンテーション

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

講習No.1

研究報告用MS-Wordテンプレートファイル

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

N08

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

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

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

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

memo

GPGPUクラスタの性能評価

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

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

GPU.....

Prog1_6th

Microsoft PowerPoint - prog03.ppt

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

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

C C UNIX C ( ) 4 1 HTML 1

GPU CUDA CUDA 2010/06/28 1

DVIOUT

Microsoft Word - no02.doc

memo

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

Microsoft PowerPoint - kougi7.ppt

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

スライド 1

スライド 1

Microsoft PowerPoint - C++_第1回.pptx

memo

情報処理学会研究報告 IPSJ SIG Technical Report Vol.2016-CSEC-75 No /12/1 ハッシュ関数 Keccak の GPU 実装 グェンダットトゥオン 1 1 岩井啓輔 1 黒川恭一 概要 : 次世代ハッシュ関数 SHA-3 の候補であった Ke

Microsoft Word - paper.docx

VXPRO R1400® ご提案資料

Microsoft PowerPoint ppt

Microsoft PowerPoint - OpenMP入門.pptx

NUMAの構成

04-process_thread_2.ppt

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Slide 1

Microsoft PowerPoint - 09.pptx

GPUコンピューティング講習会パート1

memo

GPUを用いたN体計算

プログラミング基礎I(再)

システムソリューションのご紹介

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

PowerPoint プレゼンテーション

main.dvi

スライド 1

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

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

JavaプログラミングⅠ

#include<math.h> 数学関係の関数群で sin() cos() tan() などの三角関数や累乗の pow() 平方根を求める sqrt() 対数 log() などがあります #include<string.h> 文字列を扱う関数群 コイツもまた後日に 4. 自作関数 実は 関数は自分

PowerPoint プレゼンテーション - 物理学情報処理演習

2006年10月5日(木)実施

! 行行 CPUDSP PPESPECell/B.E. CPUGPU 行行 SIMD [SSE, AltiVec] 用 HPC CPUDSP PPESPE (Cell/B.E.) SPE CPUGPU GPU CPU DSP DSP PPE SPE SPE CPU DSP SPE 2

IPSJ SIG Technical Report Vol.2013-HPC-138 No /2/21 GPU CRS 1,a) 2,b) SpMV GPU CRS SpMV GPU NVIDIA Kepler CUDA5.0 Fermi GPU Kepler Kepler Tesla

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

情報処理Ⅰ演習

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

WebGL OpenGL GLSL Kageyama (Kobe Univ.) Visualization / 57

23 Fig. 2: hwmodulev2 3. Reconfigurable HPC 3.1 hw/sw hw/sw hw/sw FPGA PC FPGA PC FPGA HPC FPGA FPGA hw/sw hw/sw hw- Module FPGA hwmodule hw/sw FPGA h

01-introduction.ppt

OpenGL GLSL References Kageyama (Kobe Univ.) Visualization / 58

Prog1_12th

Transcription:

GPU のプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

今回の内容 GPU プログラミング環境 (CUDA) GPU プログラムの実行の流れ CUDA によるプログラムの記述 カーネル (GPU で処理する関数 ) の構造 記述方法とその理由 GPU 固有のパラメータの確認 405

GPU(Graphics Processing Unit) とは 画像処理専用のハードウェア 具体的には画像処理用のチップ チップ単体では販売されていない PCI Ex カードで販売 ( チップ単体と区別せずに GPU と呼ぶことも多い ) マザーボードやノート PC に搭載 PCI Ex カードとして販売される GPU には, ビデオメモリと呼ばれる RAM が搭載 406

GPU のハードウェア構造 CUDA Core( 旧 Streaming Processor, SP) と呼ばれる演算器を多数搭載 Streaming Multiprocessor(SM, SMX) が複数の CUDA Core と SFU, メモリをまとめて管理 SFU(Special Function Unit) 数学関数を計算するユニット 複数の SM が集まって GPU を構成 407

Fermi アーキテクチャの構造 Tesla M2050 の仕様 SM 数 14 CUDA Core 数 448(=32 Core/SM 14 SM) 動作周波数 1,150 MHz 単精度演算ピーク性能 1.03 TFLOPS 408

GPU の模式図 GPU Chip Streaming Multiprocessor SM SM SM SM SM SM SM SM レジ ローカルメモリ SM SM SM SM L2 キャッシュ L1 キャッシュ スタ CUDA Core レジスタ CUDA Core 共有メモリ レジスタ CUDA Core レジスタ CUDA Core GPU Streaming Multiprocessor Streaming Multiprocessor CUDA Core CUDA Core ローカルメモリ コンスタントメモリ テクスチャメモリ グローバルメモリ 409

CUDA Compute Unified Device Architecture NVIDIA 社製 GPU 向け開発環境 (Windows,Linux,Mac OS X) 2007 年頃発表 C/C++ 言語 + 独自のGPU 向け拡張 専用コンパイラ (nvcc) とランタイムライブラリ いくつかの数値計算ライブラリ ( 線形代数計算,FFTなど) CUDA 登場以前 グラフィクスプログラミングを利用 足し算を行うために, 色を混ぜる処理を実行 汎用計算のためには多大な労力が必要 410

プログラマブルシェーダを用いた汎用計算 グラフィックス API(DirectX, OpenGL) による描画処理 + シェーダ言語 (HLSL, GLSL) による演算 void gpumain(){ vec4 ColorA = vec4(0.0, 0.0, 0.0, 0.0); vec4 ColorB = vec4(0.0, 0.0, 0.0, 0.0); vec2 TexA = vec2(0.0, 0.0); vec2 TexB = vec2(0.0, 0.0); TexA.x = gl_fragcoord.x; TexA.y = gl_fragcoord.y; TexB.x = gl_fragcoord.x; TexB.y = gl_fragcoord.y; } ColorA = texrect( texunit0, TexA ); ColorB = texrect( texunit1, TexB ); gl_fragcolor = F_ALPHA*ColorA + F_BETA*ColorB; シェーダ言語を用いた配列加算 (c= *a + *b) の例 void main(){ glutinit( &argc, argv ); glutinitwindowsize(64,64);glutcreatewindow("gpgpuhelloworld"); glgenframebuffersext(1, &g_fb); glbindframebufferext(gl_framebuffer_ext, g_fb); glgentextures(4, g_ntexid); // create (reference to) a new texture glbindtexture(opt1, texid); gltexparameteri(opt1, GL_TEXTURE_MIN_FILTER, GL_NEAREST); gltexparameteri(...); glteximage2d(opt1, 0, opt2, width, height, 0, GL_RGBA, GL_FLOAT, 0); ( 以下省略 ) GPU の処理 (GLSL) 各ピクセルに対して実行 CPU の処理 (OpenGL) 411

CUDA によるプログラミング CPU をホスト (Host),GPU をデバイス (Device) と表現 ホスト (CPU) 処理の流れや GPU を利用するための手続きを記述 プログラムの書き方は従来の C 言語と同じ 利用する GPU の決定,GPU へのデータ転送,GPU で実行する関数の呼び出し等 412

CUDA によるプログラミング CPU をホスト (Host),GPU をデバイス (Device) と表現 デバイス (GPU) 処理する内容を関数として記述 引数は利用可能, 返値は利用不可 ( 常にvoid) 関数はkernelと呼ばれる 関数呼び出しはlaunch, invokeなどと呼ばれる 413

Hello World 何を確認するか 最小構成のプログラムの作り方 ファイル命名規則 ( 拡張子は.c/.cpp) コンパイルの方法 (gcc, cl 等を使用 ) #include<stdio.h> int main(void){ printf("hello world n"); } return 0; helloworld.c 414

CUDA で Hello World 何を確認するか 最小構成のプログラムの作り方 ファイル命名規則 ( 拡張子は.cu) コンパイルの方法 (nvcc を使用 ) #include<stdio.h> int main(void){ #include<stdio.h> int main(void){ } printf("hello world n"); printf("hello world n"); return 0; helloworld.cu 違いは拡張子だけ? } return 0; helloworld.c 415

CUDA プログラムのコンパイル ソースファイルの拡張子は.cu nvcc を用いてコンパイル CPU が処理する箇所は gcc 等がコンパイル GPU で処理する箇所を nvcc がコンパイル helloworld.cu には CPU で処理する箇所しかない 416

CUDA で Hello World CUDA 専用の処理を追加 #include<stdio.h> global void kernel(){} int main(void){ GPU で実行される関数 ( カーネル ) global が追加されている kernel<<<1,1>>>(); printf("hello world n"); 通常の関数呼出とは異なり, <<<>>> が追加されている } return 0; hellokernel.cu 417

CUDA プログラムの実行 実行時の流れ (CPU 視点 ) 利用するGPUの初期化やデータの転送などを実行 GPUで実行する関数を呼び出し GPUから結果を取得 time CPU 初期化の指示必要なデータのコピーカーネルの実行指示 CPU と GPU は非同期 CPU は別の処理を実行可能 結果の取得 GPU 初期化メモリに書込カーネルを実行実行結果をコピー 418

Hello Thread(Fermi 世代以降 ) printf を GPU から呼び出し, 並列に実行 #include<stdio.h> hellothread.c int hello(){ printf("hello Thread n"); return 0; } int main(void){ hello(); 画面表示 関数呼び出し } return 0; 419

Hello Thread(Fermi 世代以降 ) GPU の各スレッドが画面表示 #include<stdio.h> global void hello(){ printf("hello Thread n"); } int main(void){ hellothread.cu 画面表示 (Fermi 世代以降で可能 ) コンパイル時にオプションが必要 arch=sm_20 以降 } hello<<<1,1>>>(); cudadevicesynchronize(); return 0; カーネル実行 ホストとデバイスの同期をとる CPUとGPUは原則同期しないので, 同期しないとカーネルを呼び出した直後にプログラムが終了 420

CUDA でカーネルを作成するときの制限 printf による画面出力 Fermi 世代以降の GPU で, コンパイルオプションを付与 arch={sm_20 sm_21 sm_30 sm_32 sm_35 sm_50 sm_52} エミュレーションモード GPU の動作 ( 並列実行 ) を CPU で模擬 CUDA4.0 以降では消滅 オプション付きのコンパイル nvcc arch=sm_20 hellothread.cu 421

GPU プログラムへの変更 変更点 関数の前に修飾子 global をつけた 422

変更の理由 変更点 関数の前に修飾子 global をつけた 変更によって実現されること GPU で実行する関数という目印になる 変更が必要な理由 ホスト (CPU) からGPUで実行する関数 ( カーネル ) を呼び出し CPUが処理する箇所とGPUが処理する箇所は別のコンパイラがコンパイル コンパイルの時点でどれがカーネルかを明記 423

GPU プログラムへの変更 変更点 関数 hello の返値を void にした 424

変更の理由 変更点 関数 hello の返値を void にした 変更によって実現されること GPU のハードウェア構造に適したプログラムを作成できる 変更が必要な理由 GPUはホストと別に独立したメモリを持つ GPUは描画情報を受け取り, 画面に出力 GPU CPU の頻繁なデータ転送は苦手 画面出力 描画情報 プログラマがメモリ管理を行い, 無駄なデータ転送による実行速度低下を回避 425

GPU プログラムへの変更 変更点 関数呼出の際に関数名と引数の間に <<<1,1>>> を付けた 426

変更の理由 変更点 関数呼出の際に関数名と引数の間に <<<1,1>>> を付けた 変更によって実現されること GPU のハードウェア構造に適したプログラムを作成できる 変更が必要な理由 GPU には数百から数千の CUDA コアが搭載されており, それらが協調して並列処理を実行 1 スレッドが実行する処理を書くことでカーネルの作成を簡略化 並列処理の度合いはカーネル呼出の際に指定 427

GPU プログラムへの変更 変更点 カーネルを呼び出した後に同期を取る関数を呼んだ 428

変更の理由 変更点 カーネルを呼び出した後に同期を取る関数を呼んだ 変更によって実現されること GPU で実行した結果が正しく得られる 変更が必要な理由 CPU と GPU は非同期に処理を実行 関数を呼んで CPU 側に制御が戻った直後に return 0 でプログラムが終了 ( 画面表示が行われない ) 正しい結果を得るためにカーネルの終了を待つ 429

Hello Thread(Fermi 世代以降 ) <<<, >>> 内の数字を変えると表示される内容が変化 #include<stdio.h> hellothread.cu global void hello(){ printf("hello Thread n"); } int main(void){ } hello<<<?,?>>>(); cudathreadsynchronize(); return 0; <<<>>> 内の数字を変えると画面表示される行数が変わる <<<1,8>>>, <<<8,1>>>, <<<4,2>>> 等 430

<<<,>>> 内の 2 個の数字の意味は? GPUのハードウェアの構成に対応させて並列性を管理 各階層における並列実行の度合を指定 <<<,>>> 内に 2 個の数字を記述して, 各階層の並列度を指定 ハードウェア構成 並列化の階層 CUDA GPU 並列に実行する処理 Grid Streaming Multiprocessor スレッドの集まり Thread Block CUDA Core スレッド Thread 431

GPU の並列化の階層 グリッド-ブロック-スレッドの3 階層 グリッド (Grid) 並列に実行する処理 GPUが処理を担当する領域全体 スレッド (Thread) GPUの処理の基本単位 CPUのスレッドと同じ ブロック (Block) もしくはスレッドブロック (Thread Block)* スレッドの集まり * スレッドブロックだと長いのでブロックで統一 432

GPU の並列化の階層 各階層の情報を参照できる変数 x,y,z をメンバにもつ dim3 型構造体 グリッド (Grid) griddim グリッド内にあるブロックの数 ブロック (Block) blockidx blockdim ブロックに割り当てられた番号ブロック内にあるスレッドの数 スレッド (Thread) threadidx スレッドに割り当てられた番号 433

Hello Threads(Fermi 世代以降 ) <<<, >>> 内の数字を変えると表示される内容が変化 #include<stdio.h> global void hello(){ printf("griddim.x=%d, blockidx.x=%d, blockdim.x=%d, threadidx.x=%d n", griddim.x, blockidx.x, blockdim.x, threadidx.x); } int main(void){ } hello<<<?,?>>>(); cudadevicesynchronize(); return 0; <<<>>> 内の数字を変えると画面表示される内容が変わる <<<>>> 内の数字とどのパラメータが対応しているかを確認 hellothreads.cu 434

GPU の構造とカーネルの書き方 GPU はマルチスレッド ( メニースレッド ) で並列処理 数百から数千の CUDA コアが搭載されており, それらが協調して並列処理を実行 カーネルには 1 スレッドが実行する処理を書く カーネルの作成を簡略化 カーネルを呼び出す際に並列処理の度合いを指定 カーネルと引数の間に追加した <<<,>>> で並列処理の度合を指定 435

各階層の値の設定 設定の条件 GPU の世代によって設定できる上限値が変化 確認の方法 pgaccelinfo devicequery GPU Computing SDK に含まれているサンプル CUDA Programming Guide https://docs.nvidia.com/cuda/cuda c programmingguide/#compute capabilities 436

pgaccelinfo の実行結果 Device Number: 0 Device Name: Tesla M2050 Device Revision Number: 2.0 Global Memory Size: 2817982464 Number of Multiprocessors: 14 Number of Cores: 448 Concurrent Copy and Execution: Yes Total Constant Memory: 65536 Total Shared Memory per Block: 49152 Registers per Block: 32768 Warp Size: 32 Maximum Threads per Block: 1024 Maximum Block Dimensions: 1024, 1024, 64 Maximum Grid Dimensions: 65535 x 65535 x 65535 Maximum Memory Pitch: 2147483647B Texture Alignment: 512B Clock Rate: 1147 MHz Initialization time: 4222411 microseconds Current free memory: 2746736640 Upload time (4MB): 2175 microseconds ( 829 ms pinned) Download time: 2062 microseconds ( 774 ms pinned) Upload bandwidth: 1928 MB/sec (5059 MB/sec pinned) Download bandwidth: 2034 MB/sec (5418 MB/sec pinned) 437

選択の際に重要行時のパラメータpgaccelinfo 実行結果 Revision Number: 2.0 GPU の世代 ( どのような機能を有しているか ) 実 Global Memory Size: 2817982464 Warp Size: 32 Maximum Threads per Block: 1024 Maximum Block Dimensions: 1024, 1024, 64 Maximum Grid Dimensions: 65535 x 65535 x 65535 各方向の最大値 1 ブロックあたりのスレッド数は最大 1024 (1024, 1, 1), (1, 1024, 1) (32, 32, 1), (4, 4, 64) など 438

レポート課題 2( 提出期限は 2 学期末 ) hellothreads.cu を実行し, 下記について考察せよ <<<,>>> 内の数字はどの情報を指定しているか 変数名 (griddim.x, etc.) とそれが表す情報の両方について考察 全スレッド数を 2 16, 1 ブロックあたりのスレッド数を 2 6 として実行するには,<<<,>>> 内にどのように記述すればよいか #include<stdio.h> global void hello(){ printf("griddim.x=%d, blockidx.x=%d,blockdim.x=%d, threadidx.x=%d n", griddim.x, blockidx.x, blockdim.x, threadidx.x); } int main(void){ hello<<<?,? >>>(); cudadevicesynchronize(); } return 0; hellothreads.cu 439

レポートの書式 必ず表紙を付けること 授業名, 課題番号, 学籍番号, 氏名, 提出日に加えて課題に要した時間を書く 課題内容, プログラム, 実行結果, 考察で構成 プログラムを実行した tesla?? および GPU の番号も明記すること pdf 形式に変換してメールで提出 宛先 degawa at vos.nagaokaut.ac.jp メール題目 課題 2( 氏名 ) 440