VIOSでは、メインフロー記述部ではモジュール単位での並行実行を、またモジュー
ル内では
並列画像処理ワーキングセット単位での並列実行を行います。
メインフロー部記述では、image型の変数の依存関係から実行できるモジュール
の検出を
行うことにより並行実行制御を行っています。例えば、
main() { image A, B, C; int a, b; A = load("foo.pgm"); B = load("bar.pgm"); C = load("baz.pgm"); Module1(A, a); Module2(B, b); if (a > b) Module3(A, C); else Module3(B, C); }のようなメインフロー記述部があるとき、image型の依存関係は
(論理上) parallelで囲まれた領域を並列画像処理ワーキングセットが
指定された
分割単位(pixel, row, column, box)で並列実行を行います。 またそれ以外の部分は、
逐次処理を行います。
例: module X { int global_val; (モジュール内で有効な大域変数) parallel { int local_val (WS内で有効な局所変数); ... // 並列実行部 } // ここで同期がとられます。 { // 逐次実行部 } parallel { // 並列実行部 } }(実装上) 複数のIPUにワーキングセット群がまとめて処理されます。 実装上の分割
#vios divtype モジュール名 {box|row|column}があります。例えばIPUが4台ある場合は
box row column +-----+-----+ +-----------+ +--+--+--+--+ | | | | 1 | | | | | | | 1 | 2 | +-----------+ | | | | | | | | | 2 | | | | | | +-----+-----+ +-----------+ |1 |2 |3 |4 | | | | | 3 | | | | | | | 3 | 4 | +-----------+ | | | | | | | | | 4 | | | | | | +-----+-----+ +-----------+ +--+--+--+--+のように分割されます。
モジュール間ストリーム通信命令(com)で受信を待っているワーキングセットは、実行を
待機しています。つまり、com命令は単にワーキングセット間の通信だけではなく、
実行制御を行うことができます。サンプルとしてDPマッチングを参照してください。