スライド 1

Similar documents
スライド 1

スライド 1

スライド 1

Microsoft PowerPoint - ARC-SWoPP2011OkaSlides.pptx

講義計画 1. コンピュータの歴史 1 2. コンピュータの歴史 2 3. コンピュータの歴史 3 4. 論理回路と記憶, 計算 : レジスタとALU 5. 主記憶装置とALU, レジスタの制御 6. 命令セットアーキテクチャ 7. 演習問題 8. パイプライン処理 9. メモリ階層 : キャッシュ

この方法では, 複数のアドレスが同じインデックスに対応づけられる可能性があるため, キャッシュラインのコピーと書き戻しが交互に起きる性のミスが発生する可能性がある. これを回避するために考案されたのが, 連想メモリアクセスができる形キャッシュである. この方式は, キャッシュに余裕がある限り主記憶の

スライド 1

Microsoft PowerPoint - OS07.pptx

PowerPoint プレゼンテーション

計算機アーキテクチャ

Operating System 仮想記憶

スライド 1

スライド 1

Microsoft PowerPoint - ARC2009HashiguchiSlides.pptx

020105.メモリの高機能化

適応フィルタのSIMD最適化

OS

Microsoft PowerPoint - ICD2011TakadaSlides.pptx

Microsoft PowerPoint - No7note.ppt

システムLSIとアーキテクチャ技術  (part II:オンチップ並列            アーキテクチャ)

DRAM SRAM SDRAM (Synchronous DRAM) DDR SDRAM (Double Data Rate SDRAM) DRAM 4 C Wikipedia 1.8 SRAM DRAM DRAM SRAM DRAM SRAM (256M 1G bit) (32 64M bit)

出 アーキテクチャ 誰が 出 装置を制御するのか 1

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

Microsoft PowerPoint - 11Web.pptx

N08

Microsoft PowerPoint - arc5

SCIMA アーキテクチャと性能評価 - SCIMA アーキテクチャの概要 - 中村宏東京大学先端科学技術研究センター

< B8CDD8AB B83685D>

Microsoft PowerPoint - OS12.pptx

Microsoft PowerPoint - OS09.pptx

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

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

Microsoft PowerPoint - ARCICD07FukumotoSlides.pptx

Microsoft PowerPoint - sales2.ppt

今週の進捗

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

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

Microsoft Word - nvsi_050110jp_netvault_vtl_on_dothill_sannetII.doc

Microsoft PowerPoint - OS11.pptx

ComputerArchitecture.ppt

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

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

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

本日の範囲 ファイルとその中身 コンピュータにおける情報の表現 ファイルとフォルダ コンピュータの仕組み 通信 ネットワーク, インターネット 情報の符号化, その限界 コマンドライン プログラムの仕組み 通信の符号化, その限界 暗号 簡単なプログラムの作成 実行 Excel で計算 データの可視

システムLSIとアーキテクチャ技術  (part II:オンチップ並列            アーキテクチャ)

Microsoft PowerPoint - No15›¼‚z‰L›¯.ppt

MIPSのマイクロアーキテクチャ

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

10-vm1.ppt

ソフトウェア基礎技術研修

Microsoft PowerPoint - No6note.ppt

ビッグデータ分析を高速化する 分散処理技術を開発 日本電気株式会社

スライド 1

Microsoft PowerPoint - t-kubo07PN-LAMBDA-slide.ppt

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

Microsoft PowerPoint - Sol7 [Compatibility Mode]

2008 年度下期未踏 IT 人材発掘 育成事業採択案件評価書 1. 担当 PM 田中二郎 PM ( 筑波大学大学院システム情報工学研究科教授 ) 2. 採択者氏名チーフクリエータ : 矢口裕明 ( 東京大学大学院情報理工学系研究科創造情報学専攻博士課程三年次学生 ) コクリエータ : なし 3.

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

hard5.pptx

スライド 1

Microsoft PowerPoint - mp11-06.pptx

Microsoft Word - r0703.doc

メモリ管理

Microsoft PowerPoint - comprog11.pptx

ICDE’15 勉強会 R24-4: R27-3 (R24:Query Processing 3, R27 Indexing)

ex04_2012.ppt

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

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - OS12.pptx

計算機概論

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

Microsoft PowerPoint - kougi7.ppt

スライド 1

コンピュータ工学Ⅰ

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

MMUなしプロセッサ用Linuxの共有ライブラリ機構


Microsoft PowerPoint - OpenMP入門.pptx

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

Microsoft PowerPoint ppt

router_cachehit.eps

Web 環境におけるレイヤー別負荷の 2 違い DB サーバ AP サーバ 後ろのレイヤーほど負荷が高く ボトルネックになりやすい

スライド 1

PowerPoint プレゼンテーション

コンピュータ工学Ⅰ

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

計算機アーキテクチャ

修士論文

リソース制約下における組込みソフトウェアの性能検証および最適化方法

スライド 1

PowerPoint プレゼンテーション


2015 TRON Symposium セッション 組込み機器のための機能安全対応 TRON Safe Kernel TRON Safe Kernel の紹介 2015/12/10 株式会社日立超 LSIシステムズ製品ソリューション設計部トロンフォーラム TRON Safe Kernel WG 幹事

Microsoft PowerPoint - 11.pptx

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

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

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

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

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

Transcription:

知能制御システム学 画像処理の高速化 東北大学大学院情報科学研究科鏡慎吾 swk(at)ic.is.tohoku.ac.jp 2008.07.22

今日の内容 ビジュアルサーボのようなリアルタイム応用を考える場合, 画像処理を高速に実装することも重要となる いくつかの基本的な知識を押さえておかないと, 同じアルゴリズムを実行しているのに性能が上がらないということがしばしば生じる 今日は, あくまで普通の PC 上での プログラムの書き方 のレベルで, 高速化を考慮する際に知っておくべき基本的な考え方を学ぶ 2

リアルタイム処理と高速化 リアルタイム = 高速 ではない 目標となる時間制約が定められているのがリアルタイム処理である 34 ms 33 ms 33 ms 32 ms どちらも 1 ms の短縮だが, 例えばビデオレートでのリアルタイム処理が目的なのであれば, 両者の意味は大きく違う 平均実行時間 最悪実行時間 計算時間を短くするには計算量を減らすのが基本. だがそれだけではない 3

例 : ガウス平滑化 m n のフィルタマスクによるガウス平滑化は, 単純に実行すると 1 画素当たり O(mn) の計算量が必要 X 方向 Y 方向それぞれ 1 次元ガウス平滑化に分解できることに気づけば,1 画素当たり O(max(m,n)) の計算量で実行可能 このような性質を持つフィルタを 分離可能 (separable) という 4

実行例 time_gauss.cpp ( 時間計測は PerformanceCounter を用いている. ソースコードは perftimer.cpp) //#define OPT_NOSEP #define OPT_SEP で, 分離型, 非分離型を切り替え #define MARGIN 7 MSIZE MSIZE MSIZE = 2 * MARGIN + 1 でフィルタマスクのサイズを指定 5

わかったこと 計算量が減ったからといって, そのまま計算時間の減少につながるわけではない それどころか, 条件によっては遅くなる場合すらある 以下で, もう少しシンプルな画像処理について, 計算時間に影響を及ぼしそうな代表的な例を見ていく 6

サンプルプログラム time_framesub.cpp ( 同様に perftimer.cpp が必要 ) 簡単なフレーム間差分 ( が一定量以上の画素を緑色に表示 ) #define OPT_BASELINE L OpenCV の画像処理関数を ( 一部 ) 使用した実装 #define OPT_NAIVE L OpenCV の画像処理関数を使用せずに, 素朴に書いた実装.baseline に比べてだいぶ遅い. これを基本として手を加えていく 7

例 : ループ交換 #define OPT_INTERCHANGE L まず基本中の基本, メモリアクセスのパターンによって速度が変わる例を示す for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { PIXVAL(img, i, j) =... for (i = 0; i < width; i++) { for (j = 0; j < height; j++) { PIXVAL(img, i, j) =... 8

メモリシステム 記憶階層 CPU 主記憶 load 2 次キャッシュ 1 次キャッシュ レジスタ store ALU プログラム ( プログラマ ) から見た場合, キャッシュの存在は見えない ( 制御が自動的に行われる ) 9

コンピュータプログラムに関する経験則 空間的局所性あるデータがアクセスされた場合, その周囲の値もアクセスされる可能性が高い 時間的局所性あるデータがアクセスされる場合, 近いうちにその同じデータが再度アクセスされる可能性が高い このような経験則を生かすように記憶階層は設計されている. 逆に, このような経験則が当てはまらないようなプログラムは性能が出にくい 10

ミスペナルティ時間 キャッシュメモリの動作例 あるアドレスへの load 命令 そのアドレスの値がキャッシュ内にある? No ( キャッシュミス ) 主記憶から, そのアドレスを含む一定サイズの連続するブロックをまとめて読み出し, キャッシュに格納 Yes ( キャッシュヒット ) その値を返して完了 ( もしキャッシュ内の格納すべき場所に先客がいたら, 先に主記憶に書き戻しておく ) 極めて高速 (e.g. 1 クロック ) 要求されていたアドレスの値を返して完了 一般に, 単なる DRAM 読み出しよりも時間がかかる 平均メモリアクセス時間 = ヒット時間 + キャッシュミス率 ミスペナルティ時間 11

この PC の場合 2 次キャッシュは 2 MB Dothan の 2 次キャッシュは 8-way set associative 64-byte cache line PCView, http://homepage2.nifty.com/smallroom/ 12

64-byte cache line (cache block) あるアドレスにアクセスすると, そのアドレスを含む連続する 64 バイトがまとめてキャッシュされる 8-way set associative ある 64 バイトのライン は, キャッシュ内のどこにでも置けるわけではなく,8 箇所のうちどこかに限定される つまり満員でなくてもキャッシュから追い出される場合がある 13

640 640x480 画素,8 ビットモノクロ画像が 1 枚で約 300 KB 480 メモリアドレスが連続な方向 連続する 64 画素がキャッシュ 1 ライン 可能な限りメモリアドレスに対して連続にアクセスする方がよい キャッシュ内のデータの配置には制約があるので, キャッシュ容量ギリギリまで画像を読み込んでおけるわけではない 14

例 : 表引き (table lookup) 事前計算の結果をメモリに保存しておき, 実行時に参照する #define OPT_LUT L 色変換の計算を表引きに置き換える メモリがボトルネックになり, 速度を稼げない場合もある 15

例 : データ転送 コピーの効率化 #define OPT_MEMCPY L 現フレームの保存を for ループで 1 画素ずつコピーする代わりに memcpy() 関数で行う 可能な場合は memcpy(),memset() などを用いる方が高速になることが多い ( 訂正 ) 講義時に,memcpy() は C の標準関数ではないと口走ってしまいましたが, そんなことはなく, しっかりと標準でした 16

例 : 画素アドレス計算の最適化 #define OPT_INDEX L 画素データが格納されているアドレスを毎回計算するのは ( 特にシーケンシャルにアクセスする場合は ) 無駄であり, 可読性を犠牲にすればより高速化可能 17

#define PIXVAL(img, i, j) (*(uchar *)((img)->imagedata + (y) * (img)->widthstep + (x))) for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { PIXVAL(img, i, j) =... uchar *ptr; int gap = img->widthstep width; for (j = 0, ptr = img->imagedata; j < height; j++, ptr += gap) { for (i = 0; i < width; i++, ptr++) { *ptr =... 18

例 : ループ融合 #define OPT_FUSION L 複数のループを, ひとつのループに融合 条件分岐のオーバヘッドが減る効果もあるが, メモリアクセスの局所化による貢献も大きい 逆に, ループ内が独立した複数の処理で構成されているは, 複数のループに分解する方が高速化される場合もある ( ループ分散 ) 19

for (j = 0; j < img->height; j++) { for (i = 0; i < img->width; i++) { f(pixval(img, i, j)); for (j = 0; j < img->height; j++) { for (i = 0; i < img->width; i++) { g(pixval(img, i, j)); for (j = 0; j < img->height; j++) { for (i = 0; i < img->width; i++) { f(pixval(img, i, j)); g(pixval(img, i, j)); 20

#define OPT_UNROLL 例 : ループ展開 L 繰り返し回数の多いループを, 一部手動で展開する.( 例えば 1000 回のループを 100 回のループに置きかえ,1 ループ内に 10 回分の処理を手書きする ) 分岐命令のオーバヘッドの削減と,1 ループ内での命令スケジューリングの自由度向上に貢献する 21

結果 80000 70000 60000 time [μs] 50000 40000 30000 20000 10000 0 1 2 3 4 5 6 7 8 変更内容 ( 説明は次々ページ ) 22

結果 (6,7,8 の拡大 ) 12000 10000 8000 time [μs] 6000 4000 2000 0 6 7 8 変更内容 23

各変更内容の説明 1. baseline OpenCV 標準関数を使用 2. naive OpenCV 標準関数を使用せず, 素朴な実装 3.interchange ループ交換により,Y 方向にスキャン 4. lut 色変換で表引きを行う 5. memcpy 表引き + コピー時に memcpy() を使う 6. index 表引き + memcpy() + ループインデックスの最適化 7. fusion 表引き + memcpy() + ループインデックスの最適化 + ループ融合 8. unroll 表引き + memcpy() + ループインデックスの最適化 + ループ融合 + ループ展開 24

まとめ まず, 以上の結果はあくまでも, 今回の処理に対して, 今回のハードウェアでは結果的にこうだった, というだけである点に注意する 今回の条件では, 画素アクセスの際のアドレス計算を工夫することで大きな改善が見られた 一般に, 計算の高速化とコードの保守性 可読性を両立するのは簡単ではないため, バランス感覚が重要 リアルタイム用途の場合は, 平均時間だけでなく最悪時間にも注意する 25

さらなる高速化のために ハードウェア拡張を利用することも, 特に今後は重要になると思われる SIMD 命令 (MMX, SSE, SSE2): 通常はアセンブラレベルのプログラミングが必要 グラフィックプロセッサ (GPU) の利用 : 高級言語でプログラミングできる環境が利用できる場合が多く, 注目されている 26