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

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

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

Slide 1

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

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

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

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

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

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

GPU.....

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

untitled

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

Slide 1

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

Microsoft PowerPoint - suda.pptx

NUMAの構成

GPGPUクラスタの性能評価

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

02: 変数と標準入出力

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

Microsoft PowerPoint - 高速化WS_ver1.1.1

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

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

GPU CUDA CUDA 2010/06/28 1

N08

スライド 1

コンピューターグラフィックスS

memo

02: 変数と標準入出力

memo

02: 変数と標準入出力

02: 変数と標準入出力

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

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

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

スライド 1

スライド 1

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

CUDA基礎1

Microsoft PowerPoint - GPU_computing_2013_01.pptx

Microsoft PowerPoint - Lec15 [互換モード]

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

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

Prog1_10th

02: 変数と標準入出力

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

一方, 物体色 ( 色や光を反射して色刺激を起こすもの, つまり印刷物 ) の表現には, 減法混色 (CMY) が用いられる CMY の C はシアン (Cyn),M はマゼンタ (Mgent),Y はイエロー (Yellow) であり, これらは色の 3 原色と呼ばれるものである なお, 同じシア

PowerPoint Presentation

tabaicho3mukunoki.pptx

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

演算増幅器

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

スライド 1

PowerPoint プレゼンテーション

02: 変数と標準入出力

プログラミングI第10回

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

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

NM30操作DLL(SSK.DLL)

Microsoft PowerPoint - comprog11.pptx

第7章 レンダリング

Microsoft Word - Cプログラミング演習(10)

第7章 レンダリング

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

memo

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

POSIXプログラミング Pthreads編

hpc141_shirahata.pdf

gengo1-11

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

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

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

memo

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

02: 変数と標準入出力

AquesTalk Mac マニュアル

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

Fujitsu Standard Tool

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

Microsoft Word - paper.docx

Microsoft PowerPoint pptx

< F2D834F838C A815B A CC>

(MIRU2010) NTT Graphic Processor Unit GPU graphi

Microsoft Word - no15.docx

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

< F2D B838A835882CC8CF68EAE2E6A7464>

スライド 1

表示の更新もそういた作業のひとつに当たる スレッドの使用アニメーション アニメーションやシミュレーションなどは画面の更新が一定のタイミングで行われていく この連続した画面の更新をスレッドを利用して行う しかし paint() メソッドを直接呼び出して表示を更新することはできない その理由

Microsoft PowerPoint - 第3回目.ppt [互換モード]

JavaプログラミングⅠ

Microsoft PowerPoint - kougi9.ppt

Insert your Title here

適応フィルタのSIMD最適化

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

スライド 1

スライド 1

Transcription:

CUDA 画像処理入門 GTC 213 チュートリアル エヌビディアジャパン CUDA エンジニア森野慎也

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

1. 医用画像処理における GPU の活用 CT や MRI から画像を受信して三次元画像の構築をするシステム 2 次元スキャンデータから 3 次元 4 次元イメージの高速生成 CUDA 化により画像処理速度を約 2 倍に高速化

1. CUDA で画像処理 GPU = Graphics Processing Unit 画像を 生成する ためのプロセッサです 与えられた画像 を 処理する ことも上手です 複雑な処理 も プログラミング できます CUDA による画像処理の入門編です

2. 画像処理 : アフィン変換 画像の線形変換 平行移動

2. アフィン変換 変換式 1 1 1 y x t d c t b a Y X y x 1 cos sin sin cos T rotate 1 y x magnify r r T 1 1 1 y x translate t t T 変換行列の例

2. 画像のメモリ配置 RGBA(8 bit, uchar4) の配列 index = x + y * pitchinpixels pitchinpixels = pitchinbytes / sizeof(uchar4) width (x, y)

2. 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 ( 行 ) コピーする

2. アフィン変換 : カーネル設計 スレッド に 変換後の画面の ピクセル を割り当てる ピクセル数分 スレッドが走る 例 : 262,144 (= 512 x 512) スレッド スレッドは 処理対象のピクセルを持つ 自分の位置 (X, Y) を知ることが必要

2. 2D での Block Thread の割り当て 1 Block 1 Pixel = 1 Thread (i, j) = (GlobalID(x),GlobalID(y)) Thread を 2 次元 で質点に対応 Block を 2 次元 で定義 一定のサイズ Grid : 必要数の Block を 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

2. アフィン変換 : Grid サイズ指定 /* value radix で割って 切り上げる */ int divroundup(int value, int radix) { return (value + radix 1) / radix; } /* griddim, blockdim を 2 次元 (x, y 方向 ) に初期化 */ dim3 blockdim(128, 4); /* divroundup() は 切り上げの割り算 */ dim3 griddim(divroundup(width, blockdim.x), divroundup(height, blockdim.y)); affinetransformkernel<<<griddim, blockdim>>>(ddst, dsrc, );

2. アフィン変換 : カーネルの入出力 global void affinetransformkernel(uchar4 *ddst, const uchar4 *dsrc, ) ddst dsrc

2. アフィン変換 : カーネルのスケルトン global void affinetransformkernel(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)) { uchar4 pixel = ; /* 値を設定 */ int mypixelpos = gidx + gidy * pitch; zdst[mypixelpos] = pixel; }

2. アフィン変換 : 座標は 逆変換 変換後のピクセル座標 (X, Y) は 既知 (X, Y) から (x, y) に逆変換 ピクセルをコピー

2. アフィン変換 : 逆変換 行列は すべての変換で共通 ( 大域的 ) 事前に CPU 上で計算しておく カーネルでは 与えられた行列を使うのみ 1 1 1 1 Y X at ct a c dt bt b d bc ad y x y x x y

2. アフィン変換 : カーネル呼び出し struct Matrix { float a, b, c, d; float tx, ty; } Matrix matrix; // 値設定済み ( 略 ) Matrix inverted; // 逆行列 float det = matrix.a * matrix.d - matrix.b * matrix.c; if (det!=.f) { inverted.a = matrix.d / det; inverted.b = - matrix.b / det; inverted.c = - matrix.c / det; inverted.d = matrix.a / det; inverted.tx = (matrix.b * matrix.ty - matrix.tx * matrix.d) / det; inverted.ty = (matrix.tx * matrix.c - matrix.a * matrix.ty) / det; dim3 blockdim(128, 4); dim3 griddim(divroundup(width, blockdim.x), divroundup(height, blockdim.y)); affinetransformkernel<<<griddim, blockdim>>>(inverted, ddst, texsrc, width, height, pitch / sizeof(uchar4)); ( 略 )

2. アフィン変換 : カーネルの実装 global void affinetransformkernel(matrix invmat, 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)) { float X = gidx +.5f; float Y = gidy +.5f; float x = invmat.a * X + invmat.b * Y + invmat.tx; /* 逆変換 */ float y = invmat.d * X + invmat.e * Y + invmat.ty; uchar4 srcpixel ; if ((.f < x) && (x < width) && (.f < y) && (y < wdith)) { int srcpixelpos = int(x) + int(y) * pitchinpixels; srcpixel = dsrc[srcpixelpos]; } else { srcpixel = make_uchar4(,,, ) } ddst[gidx + gidy * pitch] = srcpixel;

2. OpenGL Interoperability CUDA から OpenGL オブジェクトをアクセス OpenGL オブジェクト登録 OpenGL オブジェクト登録解除 リソースマップ リソースアンマップ CUDA オブジェクト取得 Texture cudagraphicsglregisterimage() cudagraphicsglunregisterimage() cudagrahipcssubresourcegetmapp edarray() PBO/VBO などバッファ cudagraphicsmapresources() cudagraphicsunmapresources() cudagraphicsglregisterbuffer() cudagraphicsglunregisterbuffer() cudagraphicsresourcegetmappedpoi nter()

3. たたみ込み 画像フィルタ Gaussian Filter, Sobel Filter, Laplacian Filter パターンマッチング SAD SSD 相関マッチング etc

3. Gaussian Filter 元画像のピクセル x 係数すべて足し合わせる 係数を ガウス分布とする 1 スレッドで 1 ピクセルを出力 + 係数 元画像 値の形式は float 足し合わせる

3. カーネルの実装イメージ device float f(int x, int y); // ピクセルの値を取得する関数 global void gaussiankernel_3x3(float *ddst, const float *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)) { float pixel = coef[][] * f(gidx - 1, gidy - 1) + coef[][1] * f(gidx, gidy - 1) + coef[][2] * f(gidx + 1, gidy - 1); + coef[1][] * f(gidx - 1, gidy ) + coef[1][1] * f(gidx, gidy ) + coef[1][2] * f(gidx + 1, gidy ); + coef[2][] * f(gidx - 1, gidy + 1) + coef[2][1] * f(gidx, gidy + 1) + coef[2][2] * f(gidx + 1, gidy + 1); int mypixelpos = gidx + gidy + pitchinpixels; ddst[mypixelpos] = pixel; }

3. Texture GPU 上のハードウエア Read-only L1キャッシュが使用可能 端の要素の処理 Clamp Wrap Mirror Border 線形補間も使用可能 Texture Object Fermi 以降 CUDA 5. 以降で使用可能 カーネルに引数として渡せる

3. Texture オブジェクトの作成 TextureDesc texdesc; ResourceDesc resdesc; // 値のクリア memset(&texdesc,, sizeof(texdesc)); memset(&resdec,, sizeof(resdesc)); texdesc.addressmode[] = texdesc.addressmode[1] = cudaaddressmodeclamp; texdesc.filtermode = cudafiltermodepoint; texdesc.readmode = cudareadmodeelementtype; texdesc.normalizedcoords = ; resdesc.restype = cudaresourcetypepitch2d; resdesc.res.pitch2d.devptr = dsrc; resdesc.res.pitch2d.desc = cudacreatechanneldesc<float>(); resdesc.res.pitch2d.pitchinbytes = pitchinbytes; resdesc.res.pitch2d.width = width; resdesc.res.pitch2d.height = height; cudatextureobject_t tex; cudacreatetextureobject(&tex, &resdesc, &texdesc, NULL);

カーネル実装 :Texture 導入 device float f(cudatextureobject_t texsrc, int x, int y) { // ピクセルの値を取得する関数 return tex2d<float>(texsrc, x, y); } global void gaussiankernel_3x3(float *ddst, cudatextureobject_t texsrc, 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)) { float pixel = coef[][] * f(gidx - 1, gidy - 1) + coef[][1] * f(gidx, gidy - 1) + coef[][2] * f(gidx + 1, gidy - 1) + coef[1][] * f(gidx - 1, gidy ) + coef[1][1] * f(gidx, gidy ) + coef[1][2] * f(gidx + 1, gidy ) + coef[2][] * f(gidx - 1, gidy + 1) + coef[2][1] * f(gidx, gidy + 1) + coef[2][2] * f(gidx + 1, gidy + 1); ddst[gidx + gidy * pitchinpixels] = pixel; }

3. Constant Memory 定数専用のメモリ 複数のスレッドから 同じ値をアクセスするのが 前提 サイズは64 KB キャッシュされる 値の設定 直接初期化 Hostから値を設定することも可能 cudamemcpytosymbol()

3. カーネル実装 :Texture 導入 constant float coef[3][3] = { { 1.f / 16.f, 2.f / 16.f, 1.f / 16.f, }, { 2.f / 16.f, 4.f / 16.f, 2.f / 16.f, }, { 1.f / 16.f, 2.f / 16.f, 1.f / 16.f, }, }; device float f(cudatextureobject_t texsrc, int x, int y) { // ピクセルの値を取得する関数 return tex2d<float>(texsrc, x, y); } global void gaussiankernel_3x3(float *ddst, cudatextureobject_t texsrc, int width, int height, int pitch) { int gidx = blockdim.x * blockidx.x + threadidx.x; int gidy = blockdim.y * blockidx.y + threadidx.y; ( 略 ) }

3. 演算量 メモリアクセス量の算出 画像サイズ : x (pixels) * y(pixels) メモリ読みこみ 書き出し量 = 2 * x * y * sizeof(float) [byte] 演算量 = 17 * x * y [FP] B/F = 8 / 17.48 [byte/fp] 実際の GPU =.4~.8 [byte/fp] メモリ読み込み量が多い バンド幅律速

3. TIPS: ベクタライズによる高速化 1 つのスレッドで 複数のピクセルを処理する ( 例では 2x2) 係数 元画像 : レジスタに保存 元画像からの読み込み値は 変数 ( レジスタ ) に保存する 出力 Communication-Minimizing 2D Convolution in GPU Registers Forrest N. Iandola, David Sheffield, Michael Anderson, Phitchaya Mangpo Phothilimthana, Kurt Keutzer, http://parlab.eecs.berkeley.edu/publication/899

Sobel Filter 輪郭の検出 係数 ( 横方向 ) -1-2 -1 1 2 1 + 係数 ( 縦方向 ) -1 1-2 2-1 1 横 縦成分の合成 v 2 v x v y 2

3. ベンチマーク例 ベクタ化 性能 (GFLOPS) バンド幅 (GB/s) バンド幅効率 性能向上 Gaussian Filter (3x3) Sobel Filter - 256 112 54 % - 2x2 346 152 73 % 35 % - 25 95.3 46 % - 2x2 315 147 71 % 54 % Tesla K2 ECC off, 248 x 248 pixels.

画像処理のための CUDA 入門 画像処理のための CUDA 入門 日時 : 8/28 9/26 15:~18: 場所 : NVIDIA Japan 赤坂オフィス 定員 : 2 名 申し込み : http://www.nvidia.co.jp/object/event-calendar-jp.html 入門編 無償です