OmniRpcの一つの目的は、RPCを用いて並列プログラミングを実行することです。 並列プログラミングの例として、 3. OmniRpcによるプログラミング で示した例で、calc_sin関数を複数のリモートホストで並列に実行します。
OmniRpcで並列プログラミングするには、大きくわけて
実行環境として、以下のような環境を仮定します。
以下に、非同期呼び出しの例をしめします。
#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の関係は以下のようになります。
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の値をホストの数よりも大きくしておくことをわすれない でください。