/*****************************************************
reverse.cc
反転フィルター処理
******************************************************/
vs_module
reverse(iImage data)
{
parallel<1,1>(x,y) {
data[][] = abs(255 - data[][]);
}
}
/****************************************
filter.vpe
フィルター処理起動用スクリプト
****************************************/
// 通信処理初期化 -------------
#pragma host_name host1
#pragma host_name host2
#pragma host_name host3
#pragma host_name host4
// データの初期化 (画像データの読み込み)-------------
imgLoad("./toy.pgm", data);
// モジュール実行時の引数データの分割方式設定-------------
set(data,DIVISION,BLOCK);
// モジュールの実行
module(reverse, data);
// 保存するためにデータを回収
gather(data);
imgSave("./result.pgm", data);
- 入力画像の用意
- モジュールのコンパイル
% vs_makemodule reverse.cc
- プログラムの実行
% vios_run < filter.vpe
- #pragma host_name host1
モジュールを実行する計算機ホストを設定する。
このプログラムではhost1,host2,host3,host4の計4台の計算機で並列実
行を行う。
- imgLoad("./toy.pgm", data);
iImage 型の変数data に PGM画像 toy.pgmを読み込む
- set(data,DIVISION,BLOCK);
モジュールを呼び出すとき、引数"data"を分割してモジュール実行を行う計算機に送信する。この関数はその分割方式の設定を行っている。
今回の分割方式は、"BLOCK"である。 どのように分割されるかはデータ分割方式を参照。
2次元変数のデフォルトの分割方式はBLOCKであるため、この記述は省略することが可能。
- module(reverse, data);
あらかじめコンパイルしたモジュール"reverse" を実行する。引数
"data"は計算機台数に応じて自動的に分割し、実行ホストに送られる。
- gather(data);
モジュールの終了時に結果を集計する処理は行われないため、モジュー
ルによって変更されたデータを集計するためにこの関数を用いる。
- imgSave("./result.pgm", data);
iImage型の変数はPGM画像としてこのように保存することができる。
parallel<1,1>(x,y){} はそのブロック内を並列に処理することを示す。
最初の "<1,1>"は、並列処理単位の指定である。左から順に、x,yの粒度の設定をしており、この場合x,yともに1、つまり1pixelずつ全ての画素に対して
data[][] = abs(255 - data[][]);
という処理を行う。
この並列処理の最小単位をワーキングセットという。
ここで、parallel構文内での data[][] の様な大括弧"[ ]"
の配列アクセスは、現在注目している画素を表す。
次の(x,y) というのはインデックス変数名の設定である。必ず記述しなければならないが、このプログラムでは使用しないので説明は省く。
入力画像 toy.pgm
結果画像
これらの画像はGIF形式です。VIOSで用いるときはPGMに変換してください。