=================================================================== RCS file: /home/cvs/OpenXM/doc/OpenXM-specs/OX-RFC-102.tex,v retrieving revision 1.5 retrieving revision 1.6 diff -u -p -r1.5 -r1.6 --- OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2003/12/11 06:40:10 1.5 +++ OpenXM/doc/OpenXM-specs/OX-RFC-102.tex 2020/03/14 01:21:56 1.6 @@ -3,61 +3,61 @@ \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$rl9g$b(B, $B4JC1$N$?$a(B $root$ $B$,(B $0$ $B$G$"$k$H$7$F(B, $B<1JL;R$,(B -$B<1JL;R$,(B $b$ $B$N(B server $B$G$O(B, $b$ $B$r2<0L%S%C%H$+$i=g$K8+$F(B, +同様の手続きに reduction がある. これは, 各 server にあるデータを, 2 +項演算により処理していき, 最後に $root$ に演算結果が集められる手続きで +ある. この場合も, 簡単のため $root$ が $0$ であるとして, 識別子が +識別子が $b$ の server では, $b$ を下位ビットから順に見て, \begin{enumerate} -\item $B$=$N%S%C%H$,(B 1 $B$J$i(B, $B$=$N%S%C%H$r(B 0 $B$K$7$?<1JL;R$r$b$D(B server -($B$=$l$OI,$:B8:_$9$k(B) $B$K%G!<%?$rAw?.$7$F=*N;(B. -\item $B$=$N%S%C%H$,(B 0 $B$G(B, $B$=$N%S%C%H$r(B 1 $B$K$7$?CM$,(B $nserver-1$ $B0J2<(B -$B$J$i(B, $B$=$3$+$i%G!<%?$rl9g$K$b(B, -server $B$NAm?t$r(B $nserver$ $B$H$9$k$H$-(B, $B9b!9(B $\lceil \log_2 nserver\rceil$ -$B%9%F%C%W8e$K$O 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$NuBV$K$"$k(B. $B$h$C$F(B, $BR2p$9$k(B. +以下, asir における RFC-102 関連の API を紹介する. -\subsection{server $B4VDL?.O)3+@_(B} +\subsection{server 間通信路開設} -$B0J2<$N4X?t$O(B, master $BMQ$KMQ0U$5$l$?$b$N$G(B, SM $B%3%^%s%IAw?.MQ$N(B -wrapper $B$G$"$k(B. +以下の関数は, master 用に用意されたもので, SM コマンド送信用の +wrapper である. \begin{itemize} \item {\tt ox\_set\_rank\_102($Server$,$Nserver$,$Rank$)} -$Server$ $B$,B0$9$k%0%k!<%W$KB0$9$k(B server $B$NAm?t(B $Nserver$ $B$H(B, -$B$=$N(B server $B$N%0%k!<%WFb<1JL;R(B $Rank$ $B$rDLCN$9$k(B. +$Server$ が属するグループに属する server の総数 $Nserver$ と, +その server のグループ内識別子 $Rank$ を通知する. \item {\tt ox\_tcp\_accept\_102($Server$,$Port$,$Rank$)} -$Server$ $B$KBP$7(B, $B%]!<%HHV9f(B $Port$ $B$G(B, -$B<1JL;R(B $Rank$ $B$N(B server $B$+$i$N(B connect $BBT$A>uBV$KF~$k$h$&;X<($9$k(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$h$&;X<($9$k(B. -$BDL?.$,@.N)$7$?$i(B, $BAwl9g(B, $B%9%?%C%/$K%W%C%7%e$5$l$k(B. -$B$r;XDj$9$kI,MW$,$"$k(B. $B<1JL;R$,(B $Root$ $B$KEy$7$$(B server $B$G(B, $B%9%?%C%/(B -$B$+$i%G!<%?$,%]%C%W$5$l(B, $B$=$N%G!<%?$,(B, $B3F8F$S=P$7$NLa$jCM$H$J$k(B. +識別子 $Root$ の server を root として, グループ内で broadcast する. +$Data$ が指定された場合, スタックにプッシュされる. +を指定する必要がある. 識別子が $Root$ に等しい server で, スタック +からデータがポップされ, そのデータが, 各呼び出しの戻り値となる. \item {\tt ox\_reduce\_102($Root$,$Operation$[,$Data$])} -$B%0%k!<%WFb$N3F(B server $B$N%9%?%C%/$+$i%]%C%W$7$?%G!<%?$KBP$7(B -$Operation$ $B$G;XDj$5$l$kFs9`1i;;$r9T$$(B, -$B7k2L$r(B $Root$ $B$G;XDj$5$l$k(B server $B$G$N4X?t8F$S=P$7$NLa$jCM$H$7$F(B -$BJV$9(B. -$Data$ $B$,;XDj$5$l$?>l9g(B, $B%9%?%C%/$K%W%C%7%e$7$F$+$i>e5-$NA`:n$r(B -$B