でが前処理関数であり, 21行目以下の Calculate2Dが画像処理関数である Calculate2D では,
6 4 0 x 480
画 素 の カ ラ ー 画 像 仁 後 段 のPC
からのフィード、パックを入力として,画 像平面上のマーカの 2次元位置を計算し,その座標を出力している.具体的には, 23, 24 行目で、受信ノくッファ中のデータ位置へのポインタ,2 6
,27
行自で、送信ノくッファ 中の書き込 み位置へのポインタ, 28行目で、受信ノくッファ中のフィード、バックデータ位置へのポインタ をそれぞれ取得し,2 9
,3 0
行目でユーザ引数を読み込んでいる.そして
,背景差分を行っ た後,差分後の画像とフィード、バックデータを入力として,マーカの2
次元座標位置を計 けしている.
1 #include <fstre出n.h>
2 #include <rpv.h>
3 4 struct ReadBackgroundArg { 5 char* filenarne;
6 RPV̲RGB24<IMAGE̲WIDTH,IMAGE̲HEIGHT> background;
7 ReadBackgroundArg(cons七 char本 s);
8 };
10 void* ReadBackground(void* a9 ) 11 {
12 13 14 15 16 17 18 19 } 20
ReadBackgroundArg* arg = (ReadBackgroundArg*)a;
ifs七rearn fs(arg‑>filenarne);
arg‑>background.Read(fs);
fs. close () ; re七urn NULL;
21 void* Calcula七e2D(cons七 RPV̲Inpu七*id, RPV̲Ou七pu七*od, const RPV̲Ainpu七*
aid, void* a) 22 {
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 } 42
const RPV̲RGB24<IMAGE̲WIDTH,IMAGE̲HEIGHT>* i̲da七a
(const RPV̲RGB24<IMAGE̲WIDTH,IMAGE̲HEIGHT>*)id一>da七a̲ptr[OJ [OJ ; Positions2D<MARKER NUM>* 0 da七a
= (Posi七ions2D<MARKER̲NUM>*)od‑>data̲p七r[OJ ; cons七 Positions3D<MARKER NUM>* a da七a
= (cons七 Posi七ions3D<MARKER̲NUM>*)ad‑>da七a̲p七r[OJ [OJ ; cons七 RPV̲RGB24<IMAGE̲WIDTH,IMAGE̲HEIGHT>* background (RPV̲RGB24<IMAGE̲WIDTH,IMAGE̲HEIGHT>*)a;
RPV̲RGB24<IMAGE̲WIDTH
,
IMAGE̲HEIGHT>* sub̲da七a= RPV̲Sub七rac七ion(i̲da七a,background);
// Searching for markers from七he sub七racted image // using previous 3D posi七ions of markers
// for robustness agains七 occlusion.
SearchMarker(sub̲data, a̲data, o̲data);
re七urn NULL;
図
5 . 1 0 :
プログラム例(C a l c u l a t e 2D )
さまざまな並列処理を実現できる記述力
PC
を単位とした並列化については,1 . 4
節で述べた並列手法すべてを記述すること ができる.
これらから,
RPV
は実時間並列画像処理プログラミングツールとしては高い能力を持って いることが分かる.
今後の課題としては
,まず
4.7節で述べたような複数のC P U
を塔載したP C
への対応が 送げられる.現在の RPV
では, PC
とデータ処理タスクが1
対1
で対応するしなければな らないので ,複数の CPU
を塔載したPC
でも1
個のC PU
しかデータ処理を行うことがでcない
.また ,二つ目の課題として ,負荷分散の問題が挙げられる .現在の RPV
では,各PC
へのデータ処理タスクの害IJり振りをアプリケーションプログラマが行うことで静的負 荷分散を行っている.しかし,各 P C
でのデータ処理の負荷やPC
問のデータ転送の負侍 を正確に見積ることは難しく,アプリケーションプログラマの試行錯誤によって負何分散 が適切になるようにデータ処理タスクの害IJり振りを行うことになる.
さらに,複数の C PU
を塔載した
PC
に対応すると負荷分散がより複雑になり,
アプリケーションプログラマの 負担がさらに増してしまう.
これらの課題を解決する方法としては アプリケーションプ ログラマはPC
ではなく,仮想的な分散並列要素 ( D i s t r i b u t e dCompon e n t : D C )
上でデータ 処理タスクを実行するシステムを作成し, DC
をPC
に害IJり当てることによってデータ処 理タスクを各PC
に配置する.複数の DC
を1
台のPC
に割り当てることによって,複数 のCPU
を塔載したPC
を有効に利用したり,負荷が 小
さいタスクをまとめたりすることが できる.また ,一つの DC
を複数のPC
に害IJり当てることによって,データ並列処Jfp'を行
うことができる.このとき,負荷分散が最適になるようにPC
とDC
の割り当てをどl r
~)J 的 に行うツーノレを提供で、きれば,アプリケーションプログラマの負担が軽減される.このよ うな方法が可能であるのは,データ処理タスクはデータ処理アルゴリズムのみを記述した ものであり,データ通信とは独立に記述されているので ,データ処理タスクを PC
に配汽 するときにデータ通信のことを考慮、しなくてもよし¥
からである.一つ目の課題として
,データ並列処理方式の拡張が挙げられる
.木研究で実現したデー タ並列処理方式は一つのフレーム内で分割したデータを単位として並列化する空間ノブ向の データ並列処理方式である.この他に,
フレームを単位として並列化する時間万向のデー タ並列処理方式が考えられる.例えば図5 . 1 1
のように, 1
フレーム目はPC1
が,2
フレー ム目はPC2
が,3
フレーム目はPC3
が,4
フレーム目はまたP C 1
が処理するという並列1,2,3,4,5,6,…
図
5 . 1
1:時 間 方 向 の デ ー タ 並 列 処 理FSS
PC1
l 1
4 7L t
I
5 8 ‑ tPC2
PC3 3
u
6~
図
5 . 1 2 :
時間方向のデータ並列処理時のデータ処理のタイムテープ、ノレ化である 現在の
RPV
ではこのデータ並列処理方式を実現することはできない.なぜ戸、ら,すべてのデータ処理とデータ転送が
FSS
のタイミングによって1
フレーム時間を基準 として行われているので,このデータ並列処理方式のように複数フレーム時間(この例で は3
フレーム時間)にまたがるようなデータ処理に対応できなし1からである.この課題は 以下の機能拡張によって解決できる.‑
一つのストリームのデータをフレームごとに複数のPC
に振り分ける機能をDSM
に 追加すること‑
複数のPC
からのデータを一つのス トリームにまとめる機能をDRM
に追加すること• FSS
を複数のPC
にフレームごとに振り分ける機能をFSM
に追加すること‑
複数のPC
からのFSS
を一連のFSS
にまとめる機能をFSM
に追加すること‑
このデータ並列処理方式を指定できるようにコネクションファイルの仕様を拡張する ことこれにより,上の例では,