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

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

Slide 1

GPU CUDA CUDA 2010/06/28 1

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

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

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

プログラミングI第10回

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

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

スライド 1

Slide 1

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

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

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

GPGPUクラスタの性能評価

Microsoft PowerPoint - C4(反復for).ppt

JavaプログラミングⅠ

02: 変数と標準入出力

Microsoft Word - 3new.doc

02: 変数と標準入出力

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

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

cp-7. 配列

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

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

講習No.9

C#の基本2 ~プログラムの制御構造~

プログラミング実習I

GPU.....

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - kougi7.ppt

2

Microsoft PowerPoint - kougi6.ppt

AquesTalk プログラミングガイド

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

Prog1_10th

Java プログラミング Ⅰ 11 回目多次元配列 2 次元配列 2 次元配列配列要素が直線上に並ぶ一次元配列に対して 平面上に並ぶ配列要素をもつ配列 直観的には 2 次元配列の準備配列変数の宣言は型と識別子を指定して次のように行う 型識別子 [ ][ ]; または 型 [ ][ ] 識別子 ; 配

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

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

02: 変数と標準入出力

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

Week 1 理解度確認クイズ解答 解説 問題 1 (4 2 点 =8 点 ) 以下の各問いに答えよ 問題 bit 版の Windows8.1 に Java をインストールする時 必要なパッケージはどれか 但し Java のコンパイルができる環境をインストールするものとする 1. jdk

スライド 1

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

NUMAの構成

NUMAの構成

PowerPoint プレゼンテーション

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

Insert your Title here

02: 変数と標準入出力

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

Microsoft PowerPoint - OpenMP入門.pptx

三者ミーティング

デジタル表現論・第6回

演習2

JavaプログラミングⅠ

JavaプログラミングⅠ

Microsoft PowerPoint - chap10_OOP.ppt

memo

基礎プログラミング2015

Microsoft Word - no103.docx

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

pp2018-pp9base

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - lec10.ppt

program7app.ppt

02: 変数と標準入出力

PowerPoint プレゼンテーション

2

PowerPoint Template

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

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

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Microsoft PowerPoint - 09.pptx

第9回 配列(array)型の変数

Prog1_6th

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

メソッドのまとめ

人工知能入門

AquesTalk Win Manual

スライド 1

簡単な検索と整列(ソート)

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

NUMAの構成

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

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft PowerPoint - sales2.ppt

about MPI

三科目合計の算出関数を用いて各教科の平均点と最高点を求めることにする この2つの計算は [ ホーム ] タブのコマンドにも用意されているが 今回は関数として作成する まず 表に 三科目合計 平均 と 最高点 の項目を用意する 項目を入力する際 適宜罫線などを設定し 分かりやすい表作成を心がけること

Java講座

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

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

スライド 1

memo

講習No.12

Microsoft PowerPoint - 06.pptx

Transcription:

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

問題の選択 目的 CUDA プログラミングを経験 ( 試行錯誤と習得 ) 実際に CPU のみの場合と比べて高速化されることを体験 問題 ( インプリメントする内容 ) 滑降シンプレックス法 (Nelder s Downhill Simplex Method) による 3 次関数フィッティング 目的関数値評価回数が多い ( 今回のテスト対象としては好都合 ) インプリメントが容易 ( 不要な個所で悩まずに済む ) 手法自体 ( の振る舞い ) が理解しやすい ( 動作確認が容易 ) データ点毎に完全に独立した残差計算の存在 ( 並列化対象 ) 今後, 当てはめ問題を CUDA を用いて実装する予定がある ( ノウハウの獲得 ) 3 次 なのは特に理由なし

問題の概要 3 次関数フィッティング : 問題の作成 3 次多項式 y f 3 2 x; p p3x p2x p1x p0 の正解パラメタ p t を適当な値に決める 2 次元平面上にn 個のデータ点 x, y f ( x ; p ) i 0, n 1 を適当に用意する i i i t 初期パラメタ値 p 0 を適当 ( p t から遠すぎず近すぎず ) に与える 初期 Simplex の残りの頂点は p 0 の周りに適当に配置 最小二乗法 minimize R n 1 i0 p f ; p x i y i 2 として p を推定する 滑降シンプレックス法自体のパラメタ ( 反射や収縮時の倍率値 ) は,``Numerical Recipies in C 掲載コードと同一の値を用いた. これは,Nelder らが論文内で 経験的に最も良いパラメタ値の組み合わせ と述べていた値だったと思う.

計算条件 浮動小数点数は単精度 (32-bit float) データ点数 n=30000 真のパラメタ値 p t =(p 0, p 1, p 2, p 3 ) = ( 0.0, 0.8, -0.08, 0.0014 ) 初期パラメタ値 p 0 =(p 0, p 1, p 2, p 3 ) = ( 0.5, 0.7, 0.0, 0.0 ) 初期シンプレックス生成用 λ=(λ 0, λ 1, λ 2, λ 3 ) =( 0.1, 0.1, 0.1, 0.01 ) 初期シンプレックスの頂点の一つを p 0 として, 残りの 4 頂点 (0 番 ~3 番と呼ぶことにする ) は以下のように作る. j 番の頂点は, p 0 から 1 つのパラメタだけを動かした場所 計算時間比較時 : j番頂点のp i p0のpi p 0のpi i if i other j として作る. floating point 演算の結果が完全に一致しないので, 何らかの収束条件で計算を止めるのでなく, 滑降 Simplex 法の手続きを一定回数 (200 回 ) 行った時点で止めることにした. 各回で選択される手続きの種類によって関数値の計算回数は異なるので, 浮動小数演算結果の違いにより手続き選択に差異を生じた場合, この方法では本当に厳密な時間比較とはならない. ただ, 今回比較した 4 種のプログラムの選択手続きが 200 回の間で ほとんど 同じであることは事前確認した. ( 例えば,C++_CPU と C++_CUDA では 195 回目までは同一の選択がなされていた )

コードフロー概要 青字は CUDA 使用版プログラムのみ device 選択 (CUDA ランタイム初期化 ) データ点群作成, 初期シンプレックス作成等 device memory, host 側メモリはここで確保 データ点群はここで device memory へ転送しておく 200 回滑降 Simplex 法の手続きループ ここの時間を計測 メモリ解放等の後始末処理 結果出力表示等

device 上で計算する部分 CUDAを使うのは目的関数計算の個所 CPUのみ版のプログラムでは, 目的関数 R n 1 i0 f ; p x i y i 2 p を素直にループ計算する. CUDA 使用版のプログラムでは R p f ;p block個数分 blockサイズ分 x i y i 2 1thread が 1 データ点の残差 2 乗値を計算 外側の Σ は host で行う この Σ は block 内の先頭 thread が行う のようにした. block サイズ (threads/block) は 64 である.

kernel コード // shared memoryの動的割当サイズに ( sizeof(float_type)*block 個数 ) を指定すること! template< unsigned int N_PARAM, class FLOAT_TYPE > //N_PARAMはパラメタ個数で, 今回は4である.FLOAT_TYPEは今回はfloatである. global void CTest_Kernel2( FLOAT_TYPE* g_in_xs, // データ点 X 座標の配列 FLOAT_TYPE* g_in_ys, // データ点 Y 座標の配列 FLOAT_TYPE* g_in_params, // パラメタベクトル unsigned int g_in_numofdata, // データ点個数.=データ点配列サイズ. FLOAT_TYPE* g_out_sumresidues_per_block // 各ブロックでの残差 2 乗値を格納するための配列領域 (block 個数分のサイズが確保されていること ) ) { // ブロックの最初の N_PARAM 個の thread が shared memory にパラメタ値をコピーする shared FLOAT_TYPE P[N_PARAM]; if( threadidx.x < N_PARAM ) { P[threadIdx.x] = g_in_params[threadidx.x]; } syncthreads(); // パラメタ値のコピー完了を待つための同期 //1threadが1データ点の残差値を計算して, 結果格納域 DY[] に入れる extern shared FLOAT_TYPE DY[]; DY[ threadidx.x ] = 0; unsigned int i = blockidx.x * blockdim.x + threadidx.x; // このthreadが扱うデータ点のindexを計算 if( i < g_in_numofdata ) { FLOAT_TYPE X = g_in_xs[i]; FLOAT_TYPE Y = ((P[3]*X + P[2])*X + P[1])*X + P[0]; // 三次関数値 Y = f(x;p) を計算 FLOAT_TYPE dy = Y - g_in_ys[i]; // データ点の実際のY 座標との差を取り DY[threadIdx.x] = dy * dy; // その2 乗値を結果とする } syncthreads(); // 計算待ち同期 } //thread 群のうちの一人が結果の総和を取り global memory に書き込む if( threadidx.x == 0 ) { FLOAT_TYPE Sum=0; for( unsigned int j=0; j<blockdim.x; j++ ) { Sum += DY[j]; } g_out_sumresidues_per_block[blockidx.x] = Sum; } host 側は,g_out_SumResidues_per_block[] を host メモリに転送し, 要素の総和を取って目的関数値とする.

計算時間計測 C++(CPU のみ ),C++(CUDA 利用 ),python(cpu のみ ),python(pycuda 利用 ) の 4 種類のプログラムの最適化計算ループ部分に費やす時間を計測. 4 種のプログラムは同一のデータ点群座標をテキストファイルから読込んで使用 C++(CPU のみ ) は, 計算に CUDA を使わないが, ソースを.cu として C++(CUDA 利用 ) と同条件でビルドした 使用ハードウェア構成 CPU : AMD Phenom II X4 945 (3.0GHz) Memory : TRJ JM800QLU-2G ( DDR2 PC2-6400) 4 CUDA-enable device : 組込用 ELSA ETS1060-C4EBB(TeslaC1060 4G GDR3) 4 ( 今回は単一 deviceのみ使用 ) Linux( CentOS ) 上で実行

計算時間計測結果 プログラム毎の計算時間 [ms] C++ Python C++ CUDA C++ CPU Python CUDA Python CPU 1 回目 19.95 34.614 136.2609863 36965.778 2 回目 16.097 34.73 132.481 37252.154 3 回目 16.487 34.336 140.856 37282.06 4 回目 17.119 34.434 132.442 38195.374 5 回目 16.155 34.879 133.597 37133.879 6 回目 16.064 34.517 143.884 37073.071 7 回目 16.556 34.365 138.612 36887.006 8 回目 16.072 34.421 139.353 38133.234 9 回目 16.304 34.636 131.373 38003.304 10 回目 16.492 34.54 132.695 36639.149 Min 16.064 34.336 131.373 36639.149 Ave 16.7296 34.5472 136.1553986 37356.5009 Max 19.95 34.879 143.884 38195.374

考察 etc C++ CPU のみの場合に比べて CUDA を用いることで高速化されたが,2 倍程度である. python 扱っている問題が, 低コスト 大量個数 であったため, メモリ転送量が多いことがボトルネックとなっているのかもしれない. 高コスト 複数 (<< 大量 ) のような処理ではより高速化される? CPU のみの場合に比べて PyCuda 利用側はかなり速くなっているのだが CUDA 利用 以前に, 単純に高コスト部分がコンパイルされた (?) ことが大きい可能性もある? 課題 今回のコードの書き方によるパフォーマンスの良さがどの程度かについては不明である ( 計算が正しく動作する, というレベル ). 良い作法に従うコードならばパフォーマンスが向上すると思われる. 複数 device を同時利用する場合も検討すべきである.