スライド 1

Similar documents
スライド 1

スライド 1

スライド 1

計算機アーキテクチャ

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

スライド 1

Microsoft PowerPoint - ARC-SWoPP2011OkaSlides.pptx

スライド 1

PowerPoint プレゼンテーション

Microsoft PowerPoint - OS07.pptx

適応フィルタのSIMD最適化

N08

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

Microsoft PowerPoint - ARC2009HashiguchiSlides.pptx

020105.メモリの高機能化

Operating System 仮想記憶

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)

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

OS

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

Microsoft PowerPoint - No7note.ppt

Microsoft PowerPoint - arc5

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

Microsoft PowerPoint - sales2.ppt

計算機アーキテクチャ

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

スライド 1

Microsoft PowerPoint - kougi7.ppt

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

Microsoft PowerPoint - 11Web.pptx

スライド 1

Microsoft PowerPoint - ICD2011TakadaSlides.pptx

スライド 1

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

Microsoft PowerPoint - ARCICD07FukumotoSlides.pptx

Microsoft PowerPoint - No6note.ppt

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

Microsoft PowerPoint - OS12.pptx

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

10-vm1.ppt

ComputerArchitecture.ppt

Microsoft PowerPoint - SWoPP06HayashiSlides.ppt

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

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

Microsoft PowerPoint - OS09.pptx

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

メモリ管理

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

PowerPoint プレゼンテーション

スライド 1

Microsoft Word - CygwinでPython.docx

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

今週の進捗

Microsoft PowerPoint ppt

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

hard5.pptx

< B8CDD8AB B83685D>

Microsoft PowerPoint - ar10_08.ppt

ex04_2012.ppt

Microsoft PowerPoint - OS12.pptx

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

スライド 1

第 1 回 C 言語講座 1. コンピュータって? だいたいは 演算装置 制御装置 記憶装置 入出力装置から構成されている 演算装置 CPU の一部で実際に計算を行う装置 制御装置 CPU の一部で演算装置や入出力装置 記憶装置の読み書きなどを制御する装置 記憶装置プログラムや情報 データを一時的

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

Microsoft Word - レポート回答集.docx

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

PowerPoint プレゼンテーション

cp-7. 配列

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

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

Microsoft PowerPoint ppt

スライド 1

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

Microsoft PowerPoint - OS11.pptx

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

Microsoft PowerPoint - kougi6.ppt

<4D F736F F F696E74202D F A282BD94BD959C89F A4C E682528D652E707074>

PowerPoint プレゼンテーション

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

Microsoft PowerPoint - OpenMP入門.pptx

情報科学概論

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

Microsoft PowerPoint - Prog05.ppt

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

プログラミング実習I

スライド 1

コンピュータ工学Ⅰ

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

PeopleJpeg2Bmpマニュアル

プログラミング実習I

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

スライド 1

スライド 1

HPCマシンの変遷と 今後の情報基盤センターの役割

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

ゲームエンジンの構成要素

Microsoft PowerPoint - Sol7 [Compatibility Mode]


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

Microsoft Word - 3new.doc

Transcription:

知能制御システム学 画像処理の高速化 OpenCV による基礎的な例 東北大学大学院情報科学研究科鏡慎吾 swk(at)ic.is.tohoku.ac.jp 2007.07.03

リアルタイム処理と高速化 リアルタイム = 高速 ではない 目標となる時間制約が定められているのがリアルタイム処理である.34 ms かかった処理が 33 ms に縮んだだけでも, それによって与えられた時間制約が満たされるのであれば, 有用な結果だといえる. 速いアルゴリズムを使う のがもちろん基本 e.g. 離散フーリエ変換 高速フーリエ変換 ここでは, アルゴリズムは同じなのに, プログラムの書き方によって速度が変わる典型的な例を見ていく 試行錯誤の過程でもある 2

例 : 2 重ループの走査順 まず基本中の基本, メモリアクセスのパターンによって速度が変わる例を示す.( サンプル : time_framesub.cpp) for (j = 0; j < img->height; j++) { for (i = 0; i < img->width; i++) { PIXVAL(img, i, j) =... for (i = 0; i < img->width; i++) { for (j = 0; j < img->height; j++) { PIXVAL(img, i, j) =... 3

キャッシュメモリ 主記憶 (DRAM) メモリシステム キャッシュメモリ (SRAM) load store CPU レジスタファイル 主記憶より速い 主記憶より小さい ALU プログラム ( プログラマ ) から見た場合, その存在は見えない ( キャッシュの制御は自動的に行われる ) 4

コンピュータプログラムに関する経験則 空間的局所性あるデータがアクセスされた場合, その周囲の値もアクセスされる可能性が高い 時間的局所性あるデータがアクセスされる場合, 近いうちにその同じデータが再度アクセスされる可能性が高い 5

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

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

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

240 320 メモリアドレスが連続な方向 キャッシュ 1 ライン 今回のデモで使っている USB カメラのサイズは 320x240.8 ビット画像であれば,1 枚で約 80 KB. 可能な限りメモリアドレスに対して連続にアクセスする方がよい キャッシュ内のデータの配置には制約があるので, キャッシュ容量ギリギリまで画像を読み込んでおけるわけではない 9

例 : 処理を局所化する 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)); 10

メモリは遅いので, 一度 ( キャッシュに, あるいはレジスタに ) 読み込んだ値は, 可能な限りその場で使い倒すのがよい つまり, 画像を走査するループをできるだけ少なくまとめ, 走査の数を減らすことに相当する サンプル : time_framesub_unify.cpp 11

できるだけ標準関数を使おう 自前で書いたルーチン同士で比べたら, 走査をまとめた方が断然速いのだが,OpenCV が標準で用意している関数を単純に並べたもの ( つまり走査は複数回のまま ) よりはむしろ遅くなってしまった OpenCV に標準で用意されている関数は十分に高速化されていることが多いので, 中途半端に書き直すよりはそのまま使った方が速い場合も多い ( これは OpenCV に限らず, 例えば C の標準ライブラリなどでもいえる ) 逆に考えると, 標準で用意されている関数の実装を見ると, どのように書くと速くなるのかのヒントがいっぱい手に入る 12

例 : さらに計算を減らす さて,OpenCV 標準の関数に負けているということは, まだまだ 演算処理 自体が遅いに違いない 特に 重い 計算を減らす ( 乗算 除算 浮動小数点演算 ) アルゴリズム上必要なものはしかたがない 画像を走査するときのアドレス計算にまだ改善の余地あり (*(uchar *)((iplimagep)->imagedata + (y) * (iplimagep)->widthstep + (x))) ここの乗算を減らしてみる 13

for (j = 0; j < img->height; j++) { for (i = 0; i < img->width; i++) { (*(uchar *)(img->imagedata + j * img->widthstep + i)) =... char *ip = img->imagedata; int joffset, offset; for (j = 0, joffset = 0; j < img->height; j++, joffset += img->widthstep) { for (i = 0; i < img->width; i += 1) { offset = joffset + i; *(uchar *)(ip + offset) =...; 14

サンプル : time_framesub_unroll.cpp 予想外なほど効果があった (3 倍程度高速化 ). このくらいはコンパイラがやってくれてもバチは当たらないと思うのだが? 15

例 : Loop Unrolling 繰り返し回数の多いループを, 一部手動で展開する.( 例えば 1000 回のループを 100 回のループに置きかえ,1 ループ内に 10 回分の処理を手書きする ) 分岐命令のオーバヘッドの削減と,1 ループ内での命令スケジューリングの自由度向上に貢献する サンプル : time_framesub_unroll.cpp わずかにではあるが, 効果はあるようだ. このくらいはコンパイラがやって ( 以下略 16

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