=================================================================== RCS file: /home/cvs/OpenXM/doc/OpenXM-specs/OX-RFC-102.tex,v retrieving revision 1.2 retrieving revision 1.6 diff -u -p -r1.2 -r1.6 --- OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2003/12/09 01:27:06 1.2 +++ OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2020/03/14 01:21:56 1.6 @@ -3,77 +3,77 @@ \IfFileExists{graphicx.sty}{\usepackage{graphicx}}{} \IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} \title{OpenXM-RFC102 (Draft)} -\author{$BLnO$(B $B@59T(B \\ ($B?@8MBgM}(B)} +\author{野呂 正行 \\ (神戸大理)} \date{} \begin{document} \maketitle -\def\gr{Gr\"obner $B4pDl(B} +\def\gr{Gr\"obner 基底} \def\st{\, s.t. \,} \def\noi{\noindent} \def\ve{\vfill\eject} -\section{server $B4VDL?.$NF3F~(B} +\section{server 間通信の導入} -OpenXM-RFC-100, OpenXM-RFC-101 ($B0J2<(B RFC-100,RFC-101) $B$G$O(B, $B7W;;$O(B -client (master) $B$H(B server $B4V$N(B RPC (remote procedure call) $B$H$7$F9T$o$l$k(B. -$B$3$N7ABV$G9T$&$3$H$,$G$-$kJ,;6JBNs7W;;$H$7$F$O(B +OpenXM-RFC-100, OpenXM-RFC-101 (以下 RFC-100,RFC-101) では, 計算は +client (master) と server 間の RPC (remote procedure call) として行われる. +この形態で行うことができる分散並列計算としては \begin{itemize} -\item master $B$,;E;v$rJ,3d$7$F!"3F(B server $B$K0MMj$9$k(B. -\item $B0l$D$N7W;;$K$$$/$D$+J}K!$,$"$k>l9g$K(B, $B$=$l$>$l$NJ}K!$r(B -$BJL!9$N(B server $B$K0MMj$9$k(B. +\item master が仕事を分割して、各 server に依頼する. +\item 一つの計算にいくつか方法がある場合に, それぞれの方法を +別々の server に依頼する. \end{itemize} -$B$J$I$,9M$($i$l(B, $BZ$7$?(B \cite{OpenXM}. -$B$7$+$7(B, $B$5$i$KJ#;($JJ,;6JBNs7W;;%"%k%4%j%:%`$G$O(B, -server $B4V$NDL?.$,I,MW$K$J$k>l9g$,$"$k(B. $B8=>u$N(B RFC-100,101 $B$G$b(B, -server $B$,(B tree $B>u$K7k9g$7$FJ,;67W;;$r9T$&$3$H$O$G$-$k$,(B, -$B$3$N>l9g$"$/$^$G0lJ}$,(B client, $BB>J}$,(B server $B$H$7$FF0:n$7$F$$$k(B. -$BNc$($P(B, ScaLAPACK $B$N$h$&$K(B, $B3F(B process $B$,9TNs$N(B -$B0lIt$rJ];}$7$F(B, $BF10l$N%W%m%0%i%`$rl9g(B, pivot $BA*Br$N$?$a$K(B, $BJ#?t(B process $B4V$GJ];}$5$l$F$$$k(B -$BCM$N:GBgCM$r7hDj$7$?$j(B, $B9T$NF~$l49$($r9T$C$?$j$9$k$?$a$K(B, -process $B4V$G$N%G!<%?$N$d$j$H$j$,I,MW$H$J$k(B. +などが考えられ, 実際に有効であることを実証した \cite{OpenXM}. +しかし, さらに複雑な分散並列計算アルゴリズムでは, +server 間の通信が必要になる場合がある. 現状の RFC-100,101 でも, +server が tree 状に結合して分散計算を行うことはできるが, +この場合あくまで一方が client, 他方が server として動作している. +例えば, ScaLAPACK のように, 各 process が行列の +一部を保持して, 同一のプログラムを実行しながら LU 分解をして +いく, といった並列アルゴリズムを実装するのは難しい. +この場合, pivot 選択のために, 複数 process 間で保持されている +値の最大値を決定したり, 行の入れ換えを行ったりするために, +process 間でのデータのやりとりが必要となる. -$B$5$i$KC1=c$JNc$H$7$F$O(B broadcast $B$,$"$k(B. $BNc$($P(B, $B$"$kB?9`<0=89g(B $G$ -$B$,%0%l%V%J!<4pDl$+$I$&$+%A%'%C%/$9$k$K$O(B, $G$ $B$+$i:n$i$l$kA4$F$N(B S-$BB?9`<0$,(B -$G$ $B$K$h$j(B 0 $B$K4JLs$5$l$k$3$H$r<($;$P$h$$!#8D!9$N4JLsA`:n$OFHN)$J$N$G(B, -$BE,Ev$KJ,3d$7$FJBNs7W;;$G$-$k$,(B, $B$^$:(B $G$ $B$r3F(B server $B$KAw$kI,MW$,$"$k(B. -$B$3$l$O(B, RFC-100 $B$N$b$H$G$O(B master $B$,3F(B server $B$K=g$KAw$k$N$G(B, server $B$N(B -$B?t(B $N$ $B$KHfNc$7$?$N%W%m%;%9$N(B -$BDL?.O)$r3+@_$9$k$?$a$N;EAH$_$ruBV$KF~$k(B. $B$$$:$l$+$NF0:n(B -$B$K$*$$$F%(%i!<$r@8$8$?>l9g$K$O(B $status$ $B$H$7$F(B $-1$, $B@.8y$7$?>l9g$K$O(B -$0$ $B$r%9%?%C%/$KCV$/(B. $peer$ $B$O(B, $BAj$G$"$k(B. $host$ $B>e(B, $B%]!<%HHV9f(B $port$ $B$G(B accept $B$7$F$$$k(B server $B$KBP$7(B, -connect $B$9$k(B. -$B%(%i!<$r@8$8$?>l9g$K$O(B $status$ $B$H$7$F(B $-1$, $B@.8y$7$?>l9g$K$O(B -$0$ $B$r%9%?%C%/$KCV$/(B. $peer$ $B$O(B, $BAj$lFHN)$Kl9g(B -$B$K%G!<%?$NH/?.85(B (root)$B$N<1JL;R$O3F(B server $B$,$"$i$+$8$aCN$C$F$*$/I,MW$,$"$k(B. +グループ内の broadcast は, いわゆる collective operation として実行さ +れる. すなわち, グループ内の各 server でそれぞれ独立に実行されているプ +ログラムにおいて, 一斉にある関数を呼び出すことにより, その関数から復帰 +したときに, broadcast されたデータが返される, という形をとる. この場合 +にデータの発信元 (root)の識別子は各 server があらかじめ知っておく必要がある. -\item master $B$+$i(B server $B%0%k!<%W$X$N(B broadcast +\item master から server グループへの broadcast -master $B$+$i(B server $B%0%k!<%W$X$N(B broadcast $B$O(B, $B%0%k!<%WFb$N(B -server $B$,%9%?%C%/%3%^%s%IBT$A>uBV$K9T$&$3$H$,$G$-$k$H$9$k(B. -$B$3$N>l9g(B, master $B$O$"$k0l$D$N(B server $B$K(B data $B$r(B push $B$9$k(B. -$B$3$N(B server $B$N<1JL;R$r(B $root$ $B$H$9$k(B. -$B$=$N8e(B, $B%0%k!<%WFb$NA4(B server $B$K(B, $root$ $B$rH/?.85$H$9$k(B -broadcast $B$r>= 1; mask > 0; mask >>= 1 ) + if ( (r+mask) < nserver_102 ) { + dst = myrank_102+mask; + if ( dst >= nserver_102 ) dst -= nserver_102; + ox_send_data_102(dst,data); + } + asir_push_one(data); +} +\end{verbatim} + +同様の手続きに reduction がある. これは, 各 server にあるデータを, 2 +項演算により処理していき, 最後に $root$ に演算結果が集められる手続きで +ある. この場合も, 簡単のため $root$ が $0$ であるとして, 識別子が +識別子が $b$ の server では, $b$ を下位ビットから順に見て, + +\begin{enumerate} +\item そのビットが 1 なら, そのビットを 0 にした識別子をもつ server +(それは必ず存在する) にデータを送信して終了. +\item そのビットが 0 で, そのビットを 1 にした値が $nserver-1$ 以下 +なら, そこからデータを受信する. そのデータと手持ちのデータ +の 2 項演算結果で手持ちデータを更新する. +\end{enumerate} + +この方法によれば, 最終結果は $root$ にデータが集められる. この場合にも, +server の総数を $nserver$ とするとき, 高々 $\lceil \log_2 nserver\rceil$ +ステップ後には手続きが終了する. + +\begin{verbatim} +void ox_reduce_102(int root,void (*func)()) +{ + Obj data,data0,t; + int r,mask,id,src,dst; + + r = myrank_102-root; + if ( r < 0 ) r += nserver_102; + data = (Obj)asir_pop_one(); + for ( mask = 1; mask < nserver_102; mask <<= 1 ) + if ( r&mask ) { + dst = (r-mask)+root; + if ( dst >= nserver_102 ) dst -= nserver_102; + ox_send_data_102(dst,data); + break; + } else { + src = r+mask; + if ( src < nserver_102 ) { + src += root; + if ( src >= nserver_102 ) src -= nserver_102; + ox_recv_102(src,&id,&data0); + (*func)(CO,data,data0,&t); data = t; + } + } + asir_push_one(r?0:data); +} +\end{verbatim} + +対応する SM コマンドは以下の通りである. + +\begin{enumerate} +\item +\begin{verbatim} +SM_bcast_102 +\end{verbatim} + +Request: +\begin{tabular}{|c|c|c|} \hline +{\tt int32 OX\_COMMAND} & {\tt int32 SM\_bcast\_102} & {\tt int32 $root$} \\ \hline +\end{tabular} + +Output: none. + +Stack after the request: +\begin{tabular}{|c|c|} \hline +{\tt int32 OX\_DATA} & {\tt $CMObject$} \\ \hline +\end{tabular} + +\item +\begin{verbatim} +SM_reduce_102 +\end{verbatim} + +Request: +\begin{tabular}{|c|c|} \hline +{\tt int32 OX\_COMMAND} & {\tt int32 SM\_reduce\_102} \\ \hline +{\tt int32 $root$} & {\tt int32 CMO\_String} {$opname$} \\ \hline +\end{tabular} + +Stack after the request: +\begin{tabular}{|c|c|} \hline +{\tt int32 OX\_DATA} & {\tt $CMObject$} \\ \hline +\end{tabular} + +Output: none. +\end{enumerate} + +\section{エラー処理} + +server は RFC-100,101 の リセットプロトコルを実装していれば, +master から server をリセットし, master-server 間の通信路を +リセットすることはできる. これに加えて,グループ内の server 間通信路 +をリセットする必要がある. 識別子が $i$ ($0\le i \le nserver$) +の server の動作は次のようになる. + \begin{tabbing} -\underline{$B<1JL;R$,(B $i$ ($0\le i \le nserver$) $B$N(B server $B$NF0:n(B}\\ +\underline{識別子が $i$ ($0\le i \le nserver$) の server の動作}\\ for \= $j = 0$ \= to $i-1$ do\\ \> do\\ - \> \>$data$ $\leftarrow$ $B<1JL;R(B $j$ $B$N(B server $B$+$i$N(B OX $B%G!<%?(B\\ + \> \>$data$ $\leftarrow$ 識別子 $j$ の server からの OX データ\\ \> while $data \neq$ {\tt OX\_SYNC\_BALL}\\ end for\\ for $j = i+1$ to $nserver-1$ do\\ - \> {\tt OX\_SYNC\_BALL} $B$r(B $B<1JL;R(B $j$ $B$N(B server $B$KAw?.(B\\ + \> {\tt OX\_SYNC\_BALL} を 識別子 $j$ の server に送信\\ end for \end{tabbing} -$B$3$NR2p$9$k(B. +以下, asir における RFC-102 関連の API を紹介する. -\subsection{server $B4VDL?.O)3+@_(B} +\subsection{server 間通信路開設} +以下の関数は, master 用に用意されたもので, SM コマンド送信用の +wrapper である. + \begin{itemize} -\item {\tt ox\_set\_rank\_102($Nserver$,$Rank$)} +\item {\tt ox\_set\_rank\_102($Server$,$Nserver$,$Rank$)} -$BDL?.AjuBV(B -$B$KF~$j(B, $BDL?.$,@.N)$7$?$i(B, $BAw(B $Host$ $B$N%]!<%HHV9f(B $Port$ $B$N(B TCP $B%]!<%H$KBP$7$F(B connect $B$9$k(B. -$BDL?.$,@.N)$7$?$i(B, $BAw