VIOSにおけるプログラミングは、C言語に非常に良く似たVPEーpと言う言語を使用して行います。
VPEーpはインタープリタ言語であり、必要最低限の命令しか持っていません。
しかし、ユーザが追加命令を作成するにより並列画像処理を行うことが出来るようになります。
追加命令は、VPEーpで記述します。それはVIOSにより一端C++のソースに変換、そしてコンパイル
され、VPEーpの1命令として組み込まれます。
従ってこの変換を理解することは、VIOSによるプログラムの理解につながります。
それでは各命令の変換の概要について順に説明します。なお、これはあくまでイメージであり、
実際にこのままのC++ソースに変換されるわけではありません。
for(y = □; y < ■; y++)このように変換されます。□、■、◯、●にはそれぞれ実行時に各実行単位に割り振られた画像
for(x = ◯; x < ●; x++) { }
sync();
}
sync();
image_name->width関数の形式をしていますが、このように指定した画像構造体のメンバ変数からの読みだしになる
image_name->height
image_name->hotx
image_name->hoty
/* 書き出しの場合 */
value = x;
global_write(value);
/* 読みだしの場合 */処理中の一貫性処理は無くなり、各ip1ごとに独立した変数として扱われます。しかし、
x = value;/* 書き出しの場合 */
value = x;/* ただしparallel文の最後 */
sync();
join(value);
次に、各命令の内部構造および、特定の場合において必要となる特殊な記述方法について説明します。
この場合、繰り返しの変数を排他制御あり(デフォルト)にすると内部では、
if(ip1_id == 0) {と、展開されます。これでも実行されますが、繰り返しの回数が増えると排他制御の回数も増え、
for(i = 0 && global_write(i) ; global_read(i) && i < ◯; i++ && global_write(i)) {
signal(id, 1);
/* このparallel文も本当は展開されてます */
parallel {}
}
signal(id, 0);
} else {
/* このparallel文も本当は展開されてます */
while( wait(id) > 0 ) parallel {}
}
if(ip1_id == 0) {
for(i = 0; i < ◯; i++) {
signal(id, 1);
/* このparallel文も本当は展開されてます */
parallel {}
}
signal(id, 0);
} else {
/* このparallel文も本当は展開されてます */
while( wait(id) > 0 ) parallel {}
}
上記のparallel文の展開法でも分かるように、VIOSにおいて実際に並列処理されているのは
ip1単位でのみです。また、comm命令では必要となるデータが送られてくるまでウェイトします。
よって、parallel文が2重for文に展開された際、先に実行される座標(左上)が自ip1内で後から実行
される座標(右下)を待つ場合、永久にウェイトし続けます。
現在の解決法としては、
後者について。comm命令における通信バッファは1命令中は保存されるので、まず最初の発生する通信が左上から右下のみになるようにプログラムを作成する。 送信するparallel文と受信するparallel文を別にする。
この2つを次リリースにおいて実装する予定です。フラグによりparallel文の展開方法を変更する。 comm命令を拡張した複数データ通信命令を実装する。