/**************************************************
Jacobi.cc
Jacobi処理(SyncCache版)
***************************************************/
#define TIMES 25
vs_module
jacobi(fImage_opt data)
{
fImage_opt shadow(data); // テンポラリ変数
// 径1の外周(全領域中での)は処理からはずす
vsSetBoundary2D(1);
fprintf(stderr,"process start!\n");
for(int i=0; i < TIMES; i++) {
parallel(x,y) {
shadow[][] = (data[-1][] + data[][-1] + \
data[+1][] + data[][+1]) / 4;
}
ImgCopy(data, shadow); // 大域変数に戻す
vsSyncCache(data);
}
}
/****************************************
* 実装実験用プログラム jacobi.vpe *
****************************************/
// 通信処理初期化 -------------
#pragma host_name host1
#pragma host_name host2
#pragma host_name host3
#pragma host_name host4
#pragma use_intercomm
// データの初期化 -------------
int w,h, pic;
w = 512;
h = w;
pic = w/3*2;
fImage data(w,h);
int i,j;
for(j=w/3; j < pic; j=j+1) {
for(i=w/3; i < pic; i=i+1) {
data(i,j) = 8;
}
}
set(data, CACHE, 1);
module("jacobi", data);
gather(data);
imgSave("result.pgm", data);
for(j=w/3; j < pic; j=j+1) {
for(i=w/3; i < pic; i=i+1) {
data(i,j) = 8;
}
}
C言語と同じようにfor文が使用できます。 ただし i++ のようなインクリメント演算子は使えません。