OmniRpcによる並列プログラム

OmniRpcの一つの目的は、RPCを用いて並列プログラミングを実行することです。 並列プログラミングの例として、 3. OmniRpcによるプログラミング で示した例で、calc_sin関数を複数のリモートホストで並列に実行します。

OmniRpcで並列プログラミングするには、大きくわけて

  1. 非同期呼び出しを使う方法
  2. OpenMPを用いたマルチスレッドプログラミングによる方法
の2つがあります。

実行環境
非同期呼び出しによる並列プログラム
ホストファイルの作成と実行
OpenMPによる並列プログラム

実行環境

実行環境として、以下のような環境を仮定します。

  1. クライアントホスト名は、jones
  2. リモートホストとして、dennis, alice, jackの3つのホストを使う。
  3. jonesから、リモートホスト、rshをパスワードの認証なしで実行できる。 すなわち、リモートホスト側の/etc/host.equivもしくはユーザの.rhostにjonesが登録 されていることが必要です。
  4. 両方のホストにOmniRpcがデフォールトパス(/usr/local/omrpc/)にイン ストールされている。
  5. また、前の例と同様に、それぞれのリモートホストにはcalc_sin関数のリモー ト実行プログラムcalc_sin.rexが登録されているものとします。

非同期呼び出しによる並列プログラム

以下に、非同期呼び出しの例をしめします。

#include <OmniRpc.h>
#include <stdio.h>
#include <math.h>

int main(int argc,char *argv[]){
   int i;
   double x, res[10];
   OmniRpcRequest req[10];

   OmniRpcInit(&argc,&argv);

   x = 0.0;
   for(i = 0; i < 10; i++){
       req[i] = OmniRpcCallAsync("calc_sin",x,&res[i]);
       x += 1.0;
   }
   OmniRpcWaitAll(10,req);
   for(i = 0; i < 10; i++) 
      printf("sin(%d)=%g\n",i,res[i]);

  OmniRpcFinalize();

}

OmniRpcCallAsyncは、遠隔呼び出しを起動し、終了を待たずに返ります。 その返り値として、その遠隔呼び出しに対応するOmniRpcRequest型の値を返し ます。これを配列に格納しておき、OmniRpcWaitAllでは全ての関数呼び出しが 終了するまで待ちます。非同期呼び出しに関連するAPIに関しては、???を参照 してください。

ホストファイルの作成と実行

実行の前に、ホストファイルを準備します。

<?xml version="1.0" ?>
<OmniRpcConfig>
   <Host name="alice" />
   <Host name="dennis" />
   <Host name="jack" />
</OmniRpcConfig>

あとの手順は、前の例と同じです。 agentとrexの関係は以下のようになります。

fig2

OpenMPによる並列プログラム

pthreadを用いて実装したOpenMPの処理系であるOmni OpenMPを用いて、 マルチスレッドプログラムからOmniRpcCallを行うことによって、並列プログ ラミングすることができます。以下に例をしめします。

#include <OmniRpc.h>
#include <stdio.h>
#include <math.h>

int main(int argc,char *argv[]){
   int i;
   double x, res[10];
   OmniRpcRequest req[10];

   OmniRpcInit(&argc,&argv);

   x = 0.0;
#pragma omp parallel for
   for(i = 0; i < 10; i++){
       req[i] = OmniRpcCall("calc_sin",x,&res[i]);
       x += 1.0;
   }
   for(i = 0; i < 10; i++) 
      printf("sin(%d)=%g\n",i,res[i]);

  OmniRpcFinalize();

}

なお、このプログラムを実行する時にはOpenMPのスレッド数を指定する環境変 数OMP_NUM_THEREASの値をホストの数よりも大きくしておくことをわすれない でください。