=================================================================== RCS file: /home/cvs/OpenXM/doc/OpenXM-specs/OX-RFC-102.tex,v retrieving revision 1.1 retrieving revision 1.6 diff -u -p -r1.1 -r1.6 --- OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2003/12/04 03:03:17 1.1 +++ OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2020/03/14 01:21:56 1.6 @@ -3,78 +3,78 @@ \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, $BAjo(B, server $B$O8GM-$N8@8l$r;}$D$N$G(B, $B$3$N5!G=(B -$B$O(B server $B$NAH$_9~$_4X?t$H$7$Fl9g(B +RFC-102 下でのプログラミングスタイルは, 基本的には RFC-100,101 と変わらない. +すなわち, master であるプログラムが実行され, 必要に応じて server に +仕事が依頼され, master はその結果を使って自らの仕事を続行する. +これに加えて, RFC-102 では, server どうしが「自律的」にデータの送受信 +を行うことができる. このため, server は, server 間通信路に OX データを +送信する機能, また、server 間通信路から OX データを受信する機能を +提供しなければならない. +server 間通信を利用する最も典型的な例として broadcast がある. + \begin{enumerate} -\item {\tt ox\_send\_cmo\_102($Rank$,$Data$)} +\item グループ内 broadcast -$B<1JL;R(B $Rank$ $B$N(B server $B$K(B $Data$ $B$r(B CMO $B$H$7$FAw?.$9$k(B. -\item {\tt ox\_recv\_cmo\_102($Rank$)} +グループ内の broadcast は, いわゆる collective operation として実行さ +れる. すなわち, グループ内の各 server でそれぞれ独立に実行されているプ +ログラムにおいて, 一斉にある関数を呼び出すことにより, その関数から復帰 +したときに, broadcast されたデータが返される, という形をとる. この場合 +にデータの発信元 (root)の識別子は各 server があらかじめ知っておく必要がある. -$B<1JL;R(B $Rank$ $B$N(B server $B$+$i(B CMO $B%G!<%?$r$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. +この方法によれば, +下位により長く連続して 0 が現われる識別子を持つ server ほど +先にデータを送信し始めるため, デッドロックにはならない. また, +独立なペアどうしの通信が同時に行えるとすれば, グループ内の +server の総数を $nserver$ とするとき, 高々 $\lceil \log_2 nserver\rceil$ +ステップ後には全ての server にデータが行き渡る. +以下に, {\tt ox\_asir} における実装を示す. -\item master $B$+$i(B server $B%0%k!<%W$X$N(B broadcast +\begin{verbatim} +void ox_bcast_102(int root) +{ + Obj data; + int r,mask,id,src,dst; -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} -$B0J2<$G$O(B, $B%0%k!<%WFb$G(B broadcast $B$r9T$&= 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 $B<1JL;R$,(B $(b-1)2^k$ $B$G$"$k(B server $B$+$i%G!<%?$r do\\ + \> \>$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} を 識別子 $j$ の server に送信\\ +end for +\end{tabbing} +この手順により, デッドロックなしに全ての通信路を空にすることができる. +この操作は, master-server 通信路のリセット後に行われるため, 各 server +は master からのデータ待ち状態にある. よって, 次の SM コマンドを +各 server に一斉に送ることにより行う. +\begin{verbatim} +SM_reset_102 +\end{verbatim} -\section{$B%(%i!<=hM}(B} +Request: +\begin{tabular}{|c|c|} \hline +{\tt int32 OX\_COMMAND} & {\tt int32 SM\_reset\_102} \\ \hline +\end{tabular} -server $B$O(B RFC-100,101 $B$N(B $B%j%;%C%H%W%m%H%3%k$r