=================================================================== RCS file: /home/cvs/OpenXM/doc/Papers/rims-2003-12-16-ja-ohp.tex,v retrieving revision 1.1 retrieving revision 1.8 diff -u -p -r1.1 -r1.8 --- OpenXM/doc/Papers/rims-2003-12-16-ja-ohp.tex 2003/12/11 05:43:37 1.1 +++ OpenXM/doc/Papers/rims-2003-12-16-ja-ohp.tex 2003/12/12 06:07:02 1.8 @@ -1,6 +1,7 @@ -% $OpenXM$ +% $OpenXM: OpenXM/doc/Papers/rims-2003-12-16-ja-ohp.tex,v 1.7 2003/12/12 06:05:21 noro Exp $ %% xdvi -paper a4r rims-2003-12-16-ja-ohp %% dvips -f -t landscape rims-2003-12-16-ja-ohp| psnup -8 -r | lpr -Pxerox6 +%% dvipdfm -l rims-2003-12-16-ja-ohp \documentclass{slides} \usepackage{color} \usepackage{rgb} @@ -121,13 +122,19 @@ Visualization by JavaView and Povray. 点 $(1,0,0)$, $(1,1,0)$, $(1,0,1)$, $(1,1,1)$ 上の cone の facet を求めよ. \\ {\tt polymake} ではつぎような入力ファイル {\tt square.poly} をまず作成する. -{\footnotesize \color{blue} \begin{verbatim} -POINTS -1 0 0 -1 1 0 -1 0 1 -1 1 1 -\end{verbatim} } +\begin{minipage}{10cm} +{\footnotesize \color{blue} +\begin{verbatim} +POINTS +1 0 0 +1 1 0 +1 0 1 +1 1 1 +\end{verbatim} +} +\end{minipage} +\epsfxsize=8cm +\epsffile{rims-2003-12-16-sq.eps} {\color{red} \verb@ polymake square.poly FACETS @ } \\ 結果: @@ -248,13 +255,14 @@ Saito, Mutsumi; Parameter shift in normal generalized \newpage +\begin{minipage}{13cm} {\footnotesize \begin{verbatim} [1163]:= load("oxshell.rr"); [1164]:= load("taka_ahg.rr"); [1165]:= A=[[1,0,0],[1,1,0],[1,0,1],[1,1,1],[1,2,0]]; -[1166]:= fctr(taka_ahg.b(A,4,[s1,s2,s3])); -[[1,1],[s1+2*s2,2],[s1+2*s2-1,1]] +[1166]:= fctr(taka_ahg.b(A,0,[s1,s2,s3])); +[[1,1],[s1-s3,1],[2*s1-s2-s3,1],[2*s1-s2-s3-1,1]] \end{verbatim} \begin{verbatim} @@ -278,8 +286,10 @@ def b(A,Idx,V) { } \end{verbatim} } +\end{minipage} +\epsfxsize=12cm +\epsffile{rims-2003-12-16-sq2.eps} - \rightline{開発: 高山} \newpage @@ -312,11 +322,295 @@ value}{\tt )} \noindent \pagetitle{4. {\color{blue} OX-RFC 102 --- 本格的なサーバ間通信を用いた分散計算}} +\parskip 5pt +OX-RFC-100, 101 : master-server 間通信を用いた分散計算 -\rightline{開発: 野呂} +OX-RFC-102 : server-server 間通信 + +\underline{目標} : 本格的分散並列計算を可能にすること + +\underline{応用例} +\begin{itemize} +\item broadcast を効率化する + +N 個の server への broadcast が $O(\log_2 N)$ でできる + +\item LU 分解の分散並列計算 + +ScaLAPACK 風に, 行列を分散保持して並列計算 +\end{itemize} + +\underline{仕様} + +MPI-2 の, 動的プロセス生成, プロセスグループ間 broadcast の仕様を +参考にする \newpage +\noindent +\pagetitle{server の起動, server 間通信路の開設} + +server は OX RFC-100, 101 により起動する. この通信路に以下の SM +コマンドを送る. + +\begin{itemize} +\item {\tt SM\_set\_rank\_102} $nserver$ $rank$ + +server に, グループ内の server の総数 $nserver$ と, その中での +識別子 $rank$ ($0 \le rank \le nserver$) を通知する. + +\item {\tt SM\_tcp\_accept\_102} $port$ $peer$ + +ポート番号 $port$ の TCP ポートで, bind, listen, accept を実行 +して connect を待つ. 通信が成立したら, byte order negotiation +を行い, 相手先テーブルに登録する. + +\item {\tt SM\_tcp\_connect\_102} $peerhost$ $port$ $peer$ + +ホスト $peerhost$ のポート番号 $port$ の TCP ポートに connect する. +通信が成立したら, byte order negotiation を行い, 相手先テーブルに登録 +する. + +\end{itemize} + +\newpage + +\noindent +\pagetitle{server 間通信, broadcast, reduction} + +server 間通信は, 相互の信頼に基づき行う --- 送り手が送信したら, 受け手は +ちゃんと受信動作に入ること + +データは OX タグ付きで --- {\tt OX\_SYNC\_BALL} による通信路リセットに必要 + +以下の SM コマンドは collective 操作である. すなわち, 同一引数で +グループ内の全ての server で実行されなければいけない. + +\begin{itemize} +\item {\tt SM\_bcast\_102} $root$ + +識別子 $root$ の server のスタック上のデータを pop し, グループ内に +broadcast する. 各 server のスタックに broadcast されたデータが push +される. + +\item {\tt SM\_reduce\_102} $root$ $opname$ + +各 server のスタック上のデータが pop され, $opname$ で指定される +二項演算(結合則が必要) を順に行い, 結果を $root$ で指定される server +のスタックに push する. 他の server には $0$ が push +される. +\end{itemize} + +\newpage + +\noindent +\pagetitle{broadcast の手続き} + +{SM\_bcast\_102} の実行 + +$root=0$ で, 識別子が $b2^k$ ($b$ は奇数) の server の動作 + +\vskip\baselineskip +\begin{tabbing} +$data \leftarrow$ 識別子が $(b-1)2^k$ の server からのデータ\\ +for \= $i=k-1$ down to $0$\\ + \> 識別子が $b2^k+2^i$ の server に $data$ を送信\\ +end for +\end{tabbing} +\vskip\baselineskip +2 で割り切れる回数が多い識別子を持つ server が先にデータ送信 + +$\Rightarrow$ デッドロックにならない + +独立なペアどうしの通信が同時に行えるなら、高々 $\lceil \log_2 N\rceil$ ステップ +($N$ は server の総数) で broadcast 完了. + +\newpage + +\noindent +\pagetitle{reduction の手続き} + +{SM\_reduce\_102} の実行 + +server 数 $N$, $root=0$ で, 識別子が $b$ の server の動作 + +手持ちのデータを $data$ とする + +\vskip\baselineskip +\begin{tabbing} +for \= $i=0$ to $\lfloor \log_2 N \rfloor$\\ + \> if \= ( $b$ に $2^i$ の bit がある) then\\ + \> \> 識別子 $b-2^i$ の server に $data$ を送信して終了\\ + \> else if ( $b+2^i < N$ ) then \\ + \> \> $data_0 \leftarrow$ 識別子 $b+2^i$ の server からのデータ\\ + \> \> $data \leftarrow data$ と $data_0$ の二項演算結果 \\ + \> end if\\ +end for +\end{tabbing} +\vskip\baselineskip + +この場合も, 独立なペアどうしの通信が同時に行えるなら、高々 $\lceil \log_2 N\rceil$ ステップ +($N$ は server の総数) で reduction 完了. 結果は root に残る. +\newpage + +\noindent +\pagetitle{broadcast 時のデータの流れ} + + +$N=16$, $root=0$ の場合 + +\begin{center} +\begin{tabular}{|c|c|c|c|} +step 1 & step 2 & step 3 & step 4 \\ \hline +$0\rightarrow 8$&$0\rightarrow 4$ &$0\rightarrow 2$ &$0\rightarrow 1$ \\ + &$8\rightarrow 12$&$8\rightarrow 10$ &$8\rightarrow 9$ \\ + & &$4\rightarrow 6$ &$4\rightarrow 5$ \\ + & &$12\rightarrow 14$&$12\rightarrow 13$ \\ + & & &$2\rightarrow 3$ \\ + & & &$10\rightarrow 11$ \\ + & & &$6\rightarrow 7$ \\ + & & &$14\rightarrow 15$ +\end{tabular} +\end{center} + +reduction の場合, データの流れは逆になる (step 4 $\rightarrow$ step 1, +矢印が逆) +\newpage + +\noindent +\pagetitle{エラー処理} + +master-server 間通信路は, OX RFC-100 で規定されている. + +server-server 間通信路を空にするための, 識別子 $i$ の server での操作 + +\begin{tabbing} +for \= $j = 0$ \= to $i-1$ do\\ + \> 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 はコマンド待ち状態 + +$\Rightarrow$ 次の SM コマンドを各 server に送信すればよい + +\begin{itemize} +\item {\tt SM\_reset\_102} (引数なし, collective) +\end{itemize} + +\newpage + +\noindent +\pagetitle{Asir (master) 上での API} + +\begin{itemize} +\item {\tt ox\_set\_rank\_102($Server$,$Nserver$,$Rank$)} + +$Server$ に {\tt SM\_set\_rank\_102} を送る. + +\item {\tt ox\_tcp\_accept\_102($Server$,$Port$,$Rank$)} + +$Server$ に {\tt SM\_tcp\_accept\_102} を送る. + +\item {\tt ox\_tcp\_connect\_102($Server$,$Host$,$Port$,$Rank$)} + +$Server$ に {\tt SM\_tcp\_connect\_102} を送る. + +\item {\tt ox\_reset\_102($Server$)} (collective) + +$Server$ に {\tt SM\_reset\_102} を送る + +\end{itemize} + +\newpage + +\noindent +\pagetitle{Asir (server) 上での API} + +\begin{itemize} +\item {\tt ox\_send\_102($Rank$,$Data$)} + +識別子 $Rank$ の server に $Data$ を OX データとして送信する. +識別子 $Rank$ の server は対応する受信を開始しなければならない. + +\item {\tt ox\_recv\_102($Rank$)} + +識別子 $Rank$ の server から OX データを受信する. +識別子 $Rank$ の server は対応する送信を開始しなければならない. + +\item {\tt ox\_bcast\_102($Root$[,$Data$])} (collective) + +識別子 $Root$ の server を root として, グループ内で broadcast する. +$Data$ が指定された場合, スタックにプッシュされる. +を指定する必要がある. 識別子が $Root$ に等しい server で, スタック +からデータがポップされ, そのデータが, 各呼び出しの戻り値となる. + +\item {\tt ox\_reduce\_102($Root$,$Operation$[,$Data$])} (collective) + +グループ内の各 server のスタックからポップしたデータに対し +$Operation$ で指定される二項演算を行い, +結果を $Root$ で指定される server での関数呼び出しの戻り値として +返す. +$Data$ が指定された場合, スタックにプッシュしてから上記の操作を +実行する. $Root$ 以外の server での戻り値は 0 である. +\end{itemize} + + +\newpage + +\noindent +\pagetitle{実行例 : 一変数多項式の積 (master 側)} + +\begin{verbatim} +def d_mul(F1,F2) +{ + Procs = getopt(proc); + /* process 指定がない場合には, 自分で計算 */ + if ( type(Procs) == -1 ) return umul(F1,F2); + if ( !var(F1) || !var(F2) ) return F1*F2; + NP = length(Procs); + /* 引数を server 0 に送る */ + ox_push_cmo(0,[F1,F2]); + /* 各 server に, server 0 を root として仕事を始めるよう依頼 */ + for ( I = 0; I < NP; I++ ) + ox_cmo_rpc(I,"d_mul_main",0); + /* server 0 から結果を受け取る */ + R = ox_pop_cmo(0); + return R; +} +\end{verbatim} + +\newpage + +\noindent +\pagetitle{実行例 : 一変数多項式の積 (server 側; collective)} +\begin{verbatim} +def d_mul_main(Root) +{ + /* server の総数, 自分の id を知る */ + Id = ox_get_rank_102(); NP = Id[0]; Rank = Id[1]; + /* Root にある引数を broadcast で共有 */ + Arg = ox_bcast_102(Root); F1 = Arg[0]; F2 = Arg[1]; + L = setup_modarrays(F1,F2,NP); + Marray = L[0]; MIarray = L[1]; M = L[2]; + R = umul_chrem(F1,F2,MIarray[Rank],Marray[Rank],M); + Arg = 0; F1 = 0; F2 = 0; + /* 各 server の結果を足し合わせて, Root に置く */ + R = ox_reduce_102(Root,"+",R); + /* Root のみ, 結果を normalize する */ + if ( Rank == Root ) + R = uadj_coef(R%M,M,ishift(M,1)); + return R; +} +\end{verbatim} + +\rightline{開発: 野呂} + \end{document} -%%$Id: rims-2003-12-16-ja-ohp.tex,v 1.1 2003/12/11 05:43:37 takayama Exp $ at misc-2003/12/RIMS \ No newline at end of file +%%$Id: rims-2003-12-16-ja-ohp.tex,v 1.8 2003/12/12 06:07:02 noro Exp $ at misc-2003/12/RIMS