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

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

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

Slide 1

untitled

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

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

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

NUMAの構成

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

GPU.....

Slide 1

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

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

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

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

GPU CUDA CUDA 2010/06/28 1

CUDA基礎1

Microsoft PowerPoint - 高速化WS_ver1.1.1

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

Slide 1

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

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

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

Microsoft PowerPoint - suda.pptx

02: 変数と標準入出力

GPGPUクラスタの性能評価

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

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

一般社団法人電子情報通信学会 THE INSTITUTE OF ELECTRONICS, INFORMATION AND COMMUNICATION ENGINEERS 信学技報 IEICE Technical Report A P (2014-6) FDTD 法の並列化技術とオープンソ

02: 変数と標準入出力

02: 変数と標準入出力

N08

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

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

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

GPGPUイントロダクション

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

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

Microsoft PowerPoint - GPU_computing_2013_01.pptx

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

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

02: 変数と標準入出力

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

適応フィルタのSIMD最適化

Prog1_10th

Microsoft Word - paper.docx

スライド 1

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

de:code 2019 CM04 Azure Kinect DK 徹底解説 ~ 進化したテクノロジーとその実装 ~ 技術統括室 千葉慎二 Ph.D.

02: 変数と標準入出力

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 最適化入門と演習

program7app.ppt

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

準備 計算結果を可視化するために OpenGL を 利用する. 2

(MIRU2010) NTT Graphic Processor Unit GPU graphi

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

GPGPU

ARToolKit プログラムの仕組み 1: ヘッダファイルのインクルード 2: Main 関数 3: Main Loop 関数 4: マウス入力処理関数 5: キーボード入力処理関数 6: 終了処理関数 3: Main Loop 関数 1カメラ画像の取得 2カメラ画像の描画 3マーカの検出と認識

Microsoft PowerPoint - handout08.ppt

スライド 1

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

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

NM30操作DLL(SSK.DLL)

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

02: 変数と標準入出力

TSUBAMEのTeslaを用いたGPGPU(CUDAの基礎)

PowerPoint プレゼンテーション

Microsoft PowerPoint - ep_cpp04.ppt

02: 変数と標準入出力

第1回 プログラミング演習3 センサーアプリケーション

<4D F736F F D CF097AC E A D836A B2E646F6378>

Microsoft PowerPoint - kougi7.ppt

JFA福島アカデミー2013.indd

演算増幅器

PowerPoint プレゼンテーション

卒業論文

IntelR Compilers Professional Editions

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

AquesTalk Mac マニュアル

Insert your Title here

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

gengo1-11

Microsoft PowerPoint - 11.pptx

WebGL Safari WebGL WebGL Safari Kageyama (Kobe Univ.) / 5

メソッドのまとめ

GPGPUによる高速画像処理


pp2018-pp9base

VOLTA ARCHITECTURE DEEP DIVE 成瀬彰, シニアデベロッパーテクノロジーエンジニア, 2017/12/12

AquesTalk プログラミングガイド

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

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

10-vm1.ppt

DSRC普及促進検討会 総会 DSRCクレジット決済標準化の検討状況

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

Microsoft PowerPoint - ip02_01.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

PowerPoint プレゼンテーション

CUDA 9 AND MORE 成瀬彰, シニアデベロッパーテクノロジーエンジニア, 2017/12/12

Transcription:

CUDA 画像処理入門 エヌビディアジャパン CUDA エンジニア森野慎也 GTC Japan 2014

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

RGB Y( 輝度 ) 変換 カラー画像から グレイスケールへの変換 Y = 0.299 R + 0.587 G + 0.114 B

CUDA における画像処理の基礎 2 次元メモリ確保 API Pitch を考慮 cudamallocpitch() cudamemcpy2d() 並列化 CUDA の並列度 : 数万以上欲しい Kepler での目安 : CUDA Core 数 x 10 程度 ( 最低限 )

PITCH を考慮したメモリレイアウト RGBA(8 bit, uchar4) の配列 index = x + y * pitchinpixel pitchinpixel = pitchinbyte / sizeof(uchar4) width (x, y)

2 次元メモリ確保 転送 cudaerror_t cudamallocpitch ( void** devptr, size_t* pitch, size_t width, size_t height ) width バイトのメモリを height 行分 取得する 行は pitch バイトで整列する cudaerror_t cudamemcpy2d ( void* dst, size_t dpitch, const void* src, size_t spitch, size_t width, size_t height, cudamemcpykind kind ) dst で示されるメモリ (dpitch バイトで整列 ) に src で示されるメモリ (spitch バイトで整列 ) を width ( バイト ) x height ( 行 ) コピーする

サンプルコード uchar4 *src, *dimage; size_t spitch, dpitch, dpitchinpixel; // ピッチつきで メモリをアロケート cudamallocpitch(&dimage, *dpitch, width * sizeof(uchar4), height); dpitchinpixel = dpitch / sizeof(uchar4); // ピッチを変換しつつ ホスト デバイスへと メモリ転送 cudamemcpy2d(dimage, dpitch, src, spitch, width * sizeof(uchar4), height, cudamemcpyhosttodevice);

画像処理における並列化の基本 基本 : 1 ピクセルに対して 1 スレッドを対応させる ピクセル数分 スレッドが走る 例 : 262,144 (= 512 x 512) スレッド スレッドは 処理対象のピクセルを持つ 自分の位置 (x, y) を知ることが必要

2D での BLOCK THREAD の割り当て 1 Thread : 2 次元 でピクセルに対応 Grid 1 Pixel = 1 Thread (x, y) = (Global ID X, Global ID Y) : 2 次元 で定義 一定のサイズのタイル : 必要数の を 2 次元 に敷き詰める

2D での BLOCK THREAD の割り当て blockdim.x * blockidx.x threadidx.x blockdim.y * blockidx.y threadidx.y GlobalID は (x, y, z) 方向に計算できる GlobalID(x) = blockdim.x * blockidx.x + threadidx.x GlobalID(y) = blockdim.y * blockidx.y + threadidx.y GlobalID(z) = blockdim.z * blockidx.z + threadidx.z

RGB Y 変換カーネル global void RGBToYKernel(uchar4 *ddst, const uchar4 *dsrc, int width, int height, int pitch){ int gidx = blockdim.x * blockidx.x + threadidx.x; int gidy = blockdim.y * blockidx.y + threadidx.y; } if ((gidx < width) && (gidy < height)) { int pos = gidx + gidy * pitch; // Y = 0.299 R + 0.587 G + 0.114 B uchar4 value = src[pos]; float Y = 0.299f * value.x + 0.587f * value.y + 0.114f * value.z; unsigned char y = (unsigned char)min(255, (int)y); ddst[pos ] = pixel; }

カーネル呼び出し (GRID サイズ指定 ) /* value radix で割って 切り上げる */ int divroundup(int value, int radix) { return (value + radix 1) / radix; } /* griddim, blockdim を 2 次元 (x, y 方向 ) に初期化 */ dim3 blockdim(64, 2); /* divroundup() は 切り上げの割り算 */ dim3 griddim(divroundup(width, blockdim.x), divroundup(height, blockdim.y)); RGBToYKernel<<<gridDim, blockdim>>>(ddst, dsrc, );

悪い並列化の例 Thread 0 Thread 1 Thread 2 Thread 3 GPU の並列化としては NG 非常に低速 並列度が低い メモリアクセスパターンが悪い ただし CPU 的発想としてはふつう

ここはポイント! コアレス (COALESCED) アクセス Thread : 0 1 2 3 4 5 6 7 8 Memory : threadidx.x 連続するスレッドが 連続するメモリにアクセスする threadidx.x に対して 連続

再掲 : 2D での BLOCK THREAD の割り当て blockdim.x * blockidx.x threadidx.x blockdim.y * blockidx.y threadidx.y GlobalID は (x, y, z) 方向に計算できる GlobalID(x) = blockdim.x * blockidx.x + threadidx.x GlobalID(y) = blockdim.y * blockidx.y + threadidx.y GlobalID(z) = blockdim.z * blockidx.z + threadidx.z

動かしてみる

FAQ : BLOCKDIM の決め方 1. Occupancy ( 占有率 ) を 100 % にする 2. あたりのスレッド数は なるべく小さく 3. 横方向は コアレスアクセス なるべく 長くする

BLOCKDIM の決め方 (OCCUPANCY から ) 項目 値 最大の 数 / SMX 16 最大のThread 数 / SMX 2048 最大のThread 数 / 1024 SMX あたり 2048 Thread 走らせたい Occupancy ( 占有率 ) = 100 % Occupancy = 100 % を満たす あたりのスレッド数は 2048 Thread / 16 = 128 Thread / 2048 Thread / 8 = 256 Thread / 2048 Thread / 4 = 512 Thread / 2048 Thread / 2 = 1024 Thread /

BLOCKDIM の決め方 (BLOCK の粒度から ) Grid = 4096 Thread の実行例を考えてみる : 256 Thread 1024 Threadで比較 3 SMX / GPU 1 SMXあたり 1 が実行可能とする SMX 0 SMX 1 SMX 2 256 Thread / t SMX 0 SMX 1 SMX 2 1024 Thread / サイズは小さいほうが得 128 Threads / t

BLOCKDIM の決め方 (SMX の構造から ) Warp Scheduler x 4 : 1 clock あたり 4 Warp に対する命令発行 のサイズは 128 Thread の倍数が望ましい (128 Thread = 32 Thread/Warp x 4 Warp)

タイルは横長がよい タイルの横幅は 32(Warp の幅 ) の倍数がよい 32 より小さい場合 16 もしくは 8 を使う Thread : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Memory : threadidx.x

blockdim.y RGB Y 変換時のバンド幅 : TESLA K20C blockdim.x 1 2 4 8 16 32 64 128 256 512 1024 1 1.4 2.8 5.6 11.2 22.1 43.9 78.5 119.8 119.3 115.4 87.7 Occupancy < 100 % 2 2.6 5.2 10.4 20.6 40.7 77.9 119.8 119.4 115.3 87.4-4 4.8 9.6 19.2 37.8 74.0 119.4 118.2 114.2 87.3 - - 8 8.4 16.7 33.3 69.6 115.0 117.9 111.9 87.1 - - - 16 13.4 26.3 60.6 106.7 115.0 114.3 87.2 - - - - 32 17.7 40.4 81.1 103.9 110.9 86.9 - - - - - 64 20.7 41.7 79.8 99.0 83.5 - - - - - - 128 20.7 41.6 75.6 75.3 - - - - - - - 256 20.7 41.0 60.3 - - - - - - - - 512 20.5 37.6 - - - - - 値 - : バンド幅 - (GB/sec) - - 1024 19.1 blockdim.x - - < 8 - - - - Tesla - K20c - (ECC - off) -

まとめ 画像処理における CUDA Pitch を考慮したメモリレイアウト 2 次元の Grid の呼び出し 正しい Naïve コード ( カーネル ) の書き方 コアレスアクセス ピクセルごとに スレッドを割り当てる 並列度は 数万以上 サイズは 128 が適当 ( 単純なカーネルの場合 )