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

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

Slide 1

NUMAの構成

Slide 1

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

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

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

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

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

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

GPU.....

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

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

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

untitled

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

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

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

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

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

Microsoft PowerPoint - suda.pptx

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

CUDA基礎1

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

GPGPUクラスタの性能評価

GPGPUイントロダクション

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

PowerPoint Presentation

Slide 1

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

名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL アライアンスパートナー コアテクノロジーパートナー NVIDIA JAPAN ソリュ

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

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

Microsoft Word - paper.docx

目的と目次 OpenCL はこれからのマルチコアプログラミングの主流 ( かも ) GPU (NVIDIA, AMD/ATI) Cell B.E. 組み込みプロセッサ 共通コードとして OpenCL に対応するために必要な準備を考える 目次 基礎編 ( 今回 ) OpenCL とは 実践編 高速化の

GPGPU

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

Microsoft PowerPoint - GPU_computing_2013_01.pptx

tabaicho3mukunoki.pptx

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

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 - 先端GPGPUシミュレーション工学特論(web).pptx

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

Microsoft Word - HOKUSAI_system_overview_ja.docx

2 09:00-09:30 受付 09:30-12:00 GPU 入門,CUDA 入門 13:00-14:30 OpenACC 入門 + HA-PACS ログイン 14:45-16:15 OpenACC 最適化入門と演習 16:30-18:00 CUDA 最適化入門と演習

GPUコンピューティングの現状と未来

VXPRO R1400® ご提案資料

memo

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

Microsoft PowerPoint - OpenMP入門.pptx

スライド 1

ホワイトペーパー

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

Slide 1

GPGPUによる高速画像処理

GPUを用いたN体計算

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

本文ALL.indd

CCS HPCサマーセミナー 並列数値計算アルゴリズム

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

memo

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

Slide 1

GPU CUDA CUDA 2010/06/28 1

Microsoft PowerPoint ppt

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N

main.dvi

VOLTA AND TURING: ARCHITECTURE Akira Naruse, Developer Technology, 2018/9/14

AquesTalk Mac マニュアル

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

並列・高速化を実現するための 高速化サービスの概要と事例紹介

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

スライド 1

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

POSIXスレッド

PowerPoint プレゼンテーション

Catalog_Quadro_Series_ のコピー2

修士論文

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

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

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

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

hpc141_shirahata.pdf

Insert your Title here

27_02.indd

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

スライド 1

NUMAの構成

! 行行 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

program7app.ppt

N08

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

PowerPoint プレゼンテーション

スライド 1

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

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

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

Transcription:

Windows で始める CUDA 入門 GTC 2013 チュートリアル エヌビディアジャパン CUDA エンジニア森野慎也

1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Linux Windows MacOS X にて動作

Compute Capability ハードウエアアーキテクチャのバージョン Fermi (2.0 以降 ) がターゲットです 機能対応するデバイス発表 1.0 初期バージョン 2006/11 1.1 global メモリ上の 32-bit atomic 演算 GeForce 9XXX 系 2007/10 1.2 メモリアクセスパターンの改善実行スレッド数の増加 など GeForce GT240 など 1.3 倍精度演算 GTX285, Tesla C1060 など 2008/6 2.0 32 cores/sm L1 キャッシュなど GTX580 Tesla C2070 など 2009/10 2.1 48 cores/sm GTX460 GTX560Ti など 3.0 192 cores/smx GTX680, Tesla K10 2012/3 3.5 Dynamic Parallelism, 64 DP/SMX Tesla K20(X) 2012/11

最近の CUDA デバイス デバイス名 コア数 ピーク演算性能単精度 / 倍精度 (FLOPS) メモリバンド幅 GB/sec Compute Capability 3.0 Quadro K5000 1536 2.1 T / 90 G 173 Tesla K10 1536 x 2 4.58 T / 0.19 T 320 GeForce GTX770 1536 3.21 T / 134 G 224.3 Compute Capability 3.5 Tesla K20X 2688 3.95 T / 1.31 T 250 Tesla K20 2496 3.52 T / 1.17 T 208 GeForce GTX Titan 2688 4.50 T / 1.31 T 288.4

1. Nsight Visual Studio Edition Visual Studio での CUDA 開発 ビルド デバッグ プロファイル CUDA Toolkit に含まれる (CUDA 5.5 から ) 開発者登録が不要になりました

1. 装置構成 マザーボード CPU ( 数コア ) DRAM チップセット PCIe GPU: CPU につながった GPU プロセッサ (~ 数千コア ) DRAM 外部演算装置

1. 典型的な実行例 CPU プログラム開始 GPU は CPU からの制御で動作する GPU データ転送 GPU プログラム実行依頼 完了待ち GPU での演算 データ転送 入力データは CPU GPU へと転送 結果は GPU CPU と転送

1. CUDA カーネル カーネル = GPU 上のプログラム GPU 向け言語 (C++ ベース ) にて記述される 特別なコンパイラ (NVCC) でコンパイル 100 万スレッドオーダーでの並列動作 Massively parallel 並列度の階層構造 GPU のアーキテクチャに密接に関係

1. カーネル実行の階層 CPU GPU Grid データ転送 Block0 Block1 Thread Thread CPU からの呼び出し単位 Block に分解される Block GPU プログラム実行依頼 Grid Block2 Thread 一定数の Thread を持つ GPU 上の並列プロセッサ (SMX) 内部でで実行される Block n Thread Thread 最小の実行単位

1. Warp Block Warp0 Thread Warp 32 GPU-threads Warp1 Thread HW 上の実行単位 Warp2 Thread Warp n Thread

1. Streaming Multiprocessor extreme SMX ( 簡略化しています ) レジスタ 64 K 個 (256 KB) 192 Cores/SMX Compute Capability 3.5 Core Core Core Core 0 1 3 2 Core Core Core Core 0 1 3 2 Core Core Core Core 0 1 3 2 SFU Core Core Core 0 1 3 2 LD/ST Core Core Core 0 1 3 2 DP Core Core Core 0 1 3 2 共有メモリ L1 Cache 64 KB テクスチャキャッシュ 48 KB SFU Special Function Unit LD/ST Load/Store Core 15 Core 15 Core 15 SFU 15 LD/ST 15 DP 15 DP 倍精度演算ユニット

1. Streaming Multiprocessor extreme GPU 内部の 並列プロセッサ 本質的に並列 ( しか実行できない ) Block は SMX 内部で動作 GPU は SMX の個数でスケールする 高性能な GPU 数多くの SMX を搭載 旧世代 (Fermi 以前 ): Streaming Multiprocessor (SM) と呼びます

1. Grid Block Warp Thread Grid カーネル全体 全ての Block を含む Block カーネル設計 時に 重要な粒度 Blockのサイズはカーネル内で一定 実行個数は 変更可能 Warp 高速なプログラムを書く 時に重要な粒度 HWに密接に関連 分岐処理 メモリアクセスの粒度 Thread 個々のGPUスレッド カーネルは スレッド単位の視点で書く

1. CUDA プログラム実行の概要 SM(X) CPU Grid Block Block Block Warp Warp Warp Grid Block CPU からの呼び出し単位 Block に分解 SM 上の実行単位 Warp に分解 SM 共有メモリのスコープ Warp CUDA 固有の並列単位 32 GPU threads 条件分岐の粒度 SM(X) ハードウエア上の並列プロセッサ

2. プログラミングの基礎 ホストプログラミング メモリ転送 カーネルの実行 カーネルプログラミング GPU 上の関数の実装

2.1 CUDA ホストプログラミング メモリのアロケーション 解放 cudamalloc()/cudafree() メモリコピー cudamemcpy() カーネルの呼び出し 特殊な構文 同期 cudadevicesynchronize()

2.1 cudamalloc() / cudafree() cudaerror_t cudamalloc(void devptr, size_t size) cudaerror_t cudafree(void *); 例 : float *devptr; /* float 型 1024 個の要素分のデバイスメモリをアロケート */ cudamalloc((void**)&devptr, sizeof(float) * 1024); /* 解放 */ cudafree(devptr);

2.1 cudamemcpy() cudaerror_t cudamemcpy (void dst, const void src, size_t count, enum cudamemcpykind kind) 例 : float src[1024] = {..} float *ddst; cudamalloc((void**)&ddst, sizeof(float) * 1024); cudamemcpy(ddst, src, sizeof(float) * 1024, cudamemcpyhosttodevice); src から ddst に float 型 1024 個の要素をコピーする

2.1 cudamemcpy() メモリは ホスト デバイス の二種類 enum cudamemcpykind cudamemcpyhosttodevice cudamemcpydevicetohost cudamemcpydevicetodevice cudamemcpyhosttohost (cudamemcpydefault : GPUdirect)

2.1 カーネル呼び出し カーネル呼び出しの構文 kernelname<<<griddim, BlockDim>>>( 引数 ); GridDim : グリッド中のブロック数 BlockDim : ブロックあたりのスレッド数引数は 複数個指定可能例 : sample<<<1, 256>>>(x, y, z);

2.1 cudadevicesynchronize() cudaerror_t cudadevicesynchronize (void) 例 : somekernel<<<xxx, yyy>>>(a, b, c); cudadevicesynchronize(); カーネルが終了するまで待つ

2.1 cudaerror_t エラーチェック 成功時は cudasuccess を返す エラーの場合 値を確認 const char cudageterrorstring (cudaerror_t error) エラーを説明する文字列を返す

2.1 CUDA カーネル global void mykernel(int a, float *pb, ) { /* device code */ } ホストから呼び出し可能なデバイス側の関数 global を修飾子として持つ 戻り値は void でなければならない 通常の C/C++ の構文が使用可能

2.2 プログラム例 配列の和 c[i] = a[i] + b[i] メモリの取り扱い基本的なカーネルの実装

2.2 デバイス メモリ構成 ホスト GPU SM(X) CPU ホストメモリ PCIe デバイスメモリ ( グローバルメモリ ) CPU 側ホストホストメモリ GPU 側デバイスグローバルメモリ

2.2 配列の和 : メモリの扱い ホスト GPU float *a, *b, *c をアロケート float *da, *db, *dc をアロケート ( デバイスメモリ ) *a, *bに値を設定ホスト-> デバイス転送 a-> da, b->db カーネル実行依頼 カーネル dc[i] = da[i] + db[i] ホスト <- デバイス転送 c <- dc 結果表示 検証 float *a, *b, *c を開放 float *da, *db, *dc を開放 ( デバイスメモリ )

2.2 配列の和 : ホストコード int main() { static const int size= 256 * 100; int memsize = sizeof(float) * size; float *a, *b, *c, *da, *db, *dc; /* ホストもデバイスもメモリは同じポインタ型 */ /* ホスト側メモリの確保と値の初期化 ( 略 )*/ /* GPU 側メモリをアロケート */ cudamalloc(&da, memsize); cudamalloc(&db,memsize); cudamalloc(&dc, memsize); cudamemcpy(da, a, memsize, cudamemcpyhosttodevice); /* メモリ転送 (Host Device) */ cudamemcpy(db, b, memsize, cudamemcpyhosttodevice); /* カーネル (addarraykernel) をここで呼ぶ */ } cudamemcpy(c, dc, memsize, cudamemcpydevicetohost); /* メモリ転送 (Host Device) */ /* 表示などの処理 ( 略 ) */ cudafree(da); cudafree(db); cudafree(dc); free(a); free(b); free(c);

2.2 並列化 ( カーネル設計 ) 複数のブロックに配分して 和をとる 図は 1 ブロックあたり 4 スレッドとした場合 Block[0] Block[1] Block[2] Block[3] a[i] b[i] 0 1 2 3 + + + + 15 14 13 12 4 5 6 7 + + + + 11 10 9 8 8 9 10 11 + + + + 7 6 5 4 12 13 14 15 + + + + 3 2 1 0 c[i]

2.2 Global ID / Local ID / Block ID Global ID Grid 内で一意 blockdim.x * blockidx.x + threadidx.x Local ID Block 内で一意 threadidx.x Global ID 0 1 2 3 Block ID (blockidx) 0 Local ID (threadidx) 0 Thread 1 Thread 2 Thread 3 Thread Block ID blockidx.x (OpenCL から概念を拝借 ) 4 5 6 7 Block ID 1 Local ID 0 Thread 1 Thread 2 Thread 3 Thread

2.2 カーネル実装 global void addarraykernel(float *dc, const float *da, const float *db, int size) { } /* Global ID を算出 */ int globalid = blockdim.x * blockidx.x + threadidx.x; if (globalid < size) { /* 範囲チェック */ /* 自スレッド担当の要素のみ 処理 */ dc[globalid] = da[globalid] + db[globalid]; }

2.2 ブロック数の指定 カーネルはブロック数でスケールする ブロックごとのスレッド数は一定 /* griddim * blockdim 個のスレッドを起動する */ int blockdim = 256; int griddim = (size + blockdim 1) / blockdim; addarraykernel<<<griddim, blockdim>>>(dc, da, db, size);

2.2 配列の和 : ホストコード int main() { static const int size= 256 * 100; int memsize = sizeof(float) * size; float *a, *b, *c, *da, *db, *dc; /* ホストもデバイスもメモリは同じポインタ型 */ /* ホスト側メモリの確保と値の初期化 ( 略 )*/ /* GPU 側メモリをアロケート */ cudamalloc(&da, memsize); cudamalloc(&db,memsize); cudamalloc(&dc, memsize); cudamemcpy(da, a, memsize, cudamemcpyhosttodevice); /* メモリ転送 (Host Device) */ cudamemcpy(db, b, memsize, cudamemcpyhosttodevice); int blockdim = 256; int griddim = (size + blockdim 1) / blockdim; addarraykernel<<<griddim, blockdim>>>(dc, da, db, size); // cudadevicesynchronize(); /* 同期 今回は 必須ではない */ } cudamemcpy(c, dc, memsize, cudamemcpydevicetohost); /* メモリ転送 (Host Device) */ /* 表示などの処理 ( 略 ) */ cudafree(da); cudafree(db); cudafree(dc); free(a); free(b); free(c);

3. Visual Studio 2010 によるビルド ビルドルールの追加

3. Visual Studio 2010 によるビルド Compute Capability の設定

3. Visual Studio 2010 によるビルド ライブラリ指定

NVIDIA Japan CUDA Monthly Seminar NVIDIA Japan では 毎月 CUDA の無償セミナーを実施しています 是非 ご参加ください 申し込み : http://www.nvidia.co.jp/object/event-calendar-jp.html 場所 : NVIDIA Japan 赤坂オフィス