PVMを利用

『超入門文書 http://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/ 』の講義7 アプリケーションの並列化の例にあるソース2をたどって、PVMを用いたPCクラスタ用ソースの骨格を確認する。

下記抜粋ソースは次のような構成になっているようである。

1 pvm用のパッケージ(みたいなもの)をとりこんで、
2 新規のプロセスの発生にあたって、PCクラスタ全体を通じてのプロセスIDを取得
3 PCクラスタで一緒に動くべきプロセス群に名前をつけてそれに所属させる
4 一緒に動くプロセス群には、予め一緒に動くプロセス数nprocを指定するが、一緒に動くプロセスの最初のプロセスとして開始された場合には、自分以外のnproc-1個の同調プロセスを発生させる(spawn)。すでに動いている同調プロセス群の1員として開始させるときには、すでに生まれている同調セットの何番目にあたるかの情報をもとに登録する

という内容

1 #include <pvm3.h>

2 
/* enroll in pvm */
mytid = pvm_mytid();

3 
/* Join a group and, if I am the first instance,
iproc=0, spawn more copies of myself
*/
iproc = pvm_joingroup("FDM");

4 
if (iproc == 0) {
tids[0] = pvm_mytid();
pvm_spawn("pfdm1d", &argv[1], 0, NULL, nproc-1, &tids[1]);
}
pvm_barrier("FDM", nproc);

/* get task IDs */
if( iproc == 0 ) {
pvm_initsend(PvmDataRaw);
pvm_pkint(&tids[0], nproc, 1);
pvm_bcast("FDM", TID_MSG);
my_i = 0;
} else {
pvm_recv( -1, TID_MSG);
pvm_upkint(&tids[0], nproc, 1);
for(i=1 ; i<nproc ; i++) {
if(tids[i] == mytid) {
my_i = i;
break;
}
}
}