SEMリファレンスマニュアル

© matsuda@symbolics.jp (2010.4.15)

MPI関数

SEM用大域変数
$IdProc : 各プロセスID
$NProc : SEM使用時,現在の使用可能プロセス数(Mathematica計算カーネル数).
$mpiCommWorld : 使用クラスタ中のプロセスプールID(通常は,mpiCommWorldと同じ値)
$IdProc
プロセス0に対応するnotebookはMathematicaのFronendも兼ねてる関係上、扱いが特別にならざるをえない。次の例を参照。

mpiSend[expr, target, tag, comm]
ターゲットプロセスtargetに対し任意のMathematicaデータexprを送信.データにはタグtagを設定.受信側で同一タグを指定しない限り受信できない.送受信用のプロセスプールをcommで指定.デフォルトはmpiCommWorld.ブロッキング通信(同期式通信).

mpiRecv[expr, target, tag, comm]
ターゲットプロセスtargetから任意のMathematicaデータを受信しexprに格納.データにはタグtagを設定.送信側タグと同じタグを指定しない限り受信できない.送受信用のプロセスプールをcommで指定.デフォルトはmpiCommWorld.ブロッキング通信(同期式通信).

mpiSendRecv[sendexpr, dest, recvexpr, source, comm]
送信元sourceと送信先destとの間で送受信を同時に行う.送信データはsendexpr,受信データはrecvexprで指定.プロセスプールcomm.dデフォルトはmpirWorld.

mpiISend[expre, target, tag, comm, req]
mpiSendに等しい.ただし,非ブロッキング通信(非同期通信).mpiWait[req]によって同期を行う.

mpiIRecv[expr, target, tag, comm, req]
mpiRecvに等しい.ただし,非ブロッキング通信(非同期通信).mpiWait[req]によって同期を行う.

mpiTest[req]
mpiISend, mpiIRecvによって生じた非同期通信を完了させる.ただし,必ずしもTrueが帰って来るとは限らないので通常は,次のmpiWaitを使用.

mpiWait[req]
mpiISend, mpiIRecvによって生じた非同期通信を完了させる.mpiTestをTrueが帰ってくるまで実行.

mpiWaitall[reqlist]
非ブロック通信によって生じた完了待ちリクエストのリストreqlistすべてに対し,mpiTestがTrueを返すまで待つ.

mpiWaitany[reqlist]
非ブロック通信によって生じた完了待ちリクエストのリストreqlistのいずれか一つに対しmpiTestがTrueを返すまで待つ.この場合は,すべての状態変数がTrueになっている.

mpiBcast[expr, root, comm]
rootプロセスからプロセスプールcomm(デフォルトmpiCommWorld)内のすべてのプロセス(root自身を含む)に対しデータexprを送信する.

mpiGather[sendexpr, recvexpr, root, comm]
rootプロセスにプロセスプールcomm(デフォルトmpiCommWorld)内のすべてのプロセス(root自身を含む)からデータsendexprを集め,recvexprに格納する.recvexprはしたがってリストになる.この場合,sendexprはリモートプロセスで使用されている変数名になるが,mpiGatherからは透過であると仮定する.
この関数だけの例外として,mpiGather[expr]という形式が許される.この場合,rootはプロセス0を過程.commは現在の$mpiCommWorldを仮定.また,recvexprの代わりに本関数の辺値として結果を得る.

mpiAllgather[sendexpr,recvexpr, comm]
プロセスプールcomm(デフォルトmpiCommWorld)内のすべてのプロセスが各プロセスが持つデータsendexprを集め,recvexprに格納する.この場合,sendexprはリモートプロセスで使用されている変数名になるが,mpiAllgatherからは透過であると仮定する.

mpiScatter[sendexpr, recvexpr, root, comm]
プロセスroot上のデータsendexprをプロセスプールcomm(でフォルトmpiCommWorld)上のすべてのプロセス(rootを含む)に対し分配する.受け取る側の名前はrecvexpr.したがって,recvexprの名前はrootプロセスから透過であると仮定する.なお,送信側データのサイズがプロセス数より小さい場合は,一部プロセスのrecvexprには空リストが格納される.また,均等に分割できない場合は端数部分が一部プロセスに追加格納される.

mpiAlltoall[sendexpr, recvexpr, comm]
ブロセスプールcomm(デフォルトmpiCommWorld)上のすべてのプロセスに対し,データsendexprを分配し,各プロセスはrecvexprでそれを受け取る.ただし,recvexprはプロセス分の同じ値のリストになる.

mpiReduce[sendexpr,recvexpr,operation,root,comm]
プロセスプールcomm(デフォルトmpiCommWorld)上のすべてのsendexprを関数operationで縮約し,結果をプロセスroot上の変数recvexprに格納する.なお,現在用意されているoperationはmpiSum,mpiMax,mpiMinしか用意されておらず,またユーザが関数を定義することもできない.

下記の例は並列内積計算.

mpiAllreduce[sendexpr,recvexpr,operation,comm]
mpiReduceに同じ.ただし,結果がすべてのプロセスに残る.

mpiReduceScatter[sendexpr,recvexpr,operation,comm]
mpiReduceで得られた部分リストを各プロセスに分配(scatter)する.mpiAllreduceとの違いに注意.

mpiCommSize[comm]
comm内のプロセス数を返す.

mpiCommRank[comm]
comm内での自分自身のIdを返す.

mpiCommDup[comm]
プロセスプールcommの複製を作る.このプール内での計算は現プロセスプール内に影響しない.

mpiCommSplit[comm,color,key]
プロセスプールcommを各プロセスに(論理的に)分割する.その際,整数colorは分割された場合のグループIDを表し,整数keyは各グループ内での昇順での位置を指定する.次の例は4カーネルを2カーネルずつに分割する場合の例.

mpiCommMap[comm]
comm内のすべてのプロセスのIdのリストを返す.

mpiCommMap[comm, target]
comm内のすべてのプロセスのIdのリストのうち,targetに相当するIdを返す.

mpiCommFree[comm]
プロセスプールcommを解放する.

他のMPI補助関数

mpiWtime[]
過去のある時点からの壁時間での経過時間.ただし,すべてのプロセスで同じ時間を刻んでる保証はない.

mpiWtick[]
刻み幅.

MaxByElement[in]
各プロセスから得られたリストのリストinに対し,もっと大きな値を持つリストを返す.mpiMaxで使用.

MinByElement[in]
各プロセスから得られたリストのリストinに対し,もっと小さな値を持つリストを返す.mpiMinで使用.

SetMonitor[state]
整数state=0の時,MPIモニター中止.state=1(MacOSのみ,デフォルト)の時,MPIモニター表示.state=2の時,MPIモニータウィンドウ表示ならびにMPIerrsファイルにログ作成.

GetMonitor[]
現在のMPIモニターのstate値を返す.

SEM上位関数群

ParallelDo[expr,loopspec]
Doの並列版.Mathematica組み込み並列関数名と衝突するため,SEMParallelDo[類似:SEMDoも可能]を使用すること.

ParallelFunctionToList[f,count]
クラスタ全体にわたり,関数fを回数count分繰り返す.回数countが$NProcの整数倍でないとき,端数をどのプロセスで実行するかは保証されない.

ParallelFunctionToList[f,count,root]
プロセスrootを指定した時は,答えがrootプロセスに戻る.

LoadBalanaceFunctionToList[f,count]
ParallelFunctionToListに同じ.ただし,関数fの実行割当において負荷分散を行う.下記の例では,プロセス0に計算が集中している.たまたまプロセス0の資源が空いてることが多かったため.

LoadBalanaceFunctionToList[f,count,root]
プロセスrootを指定した時は,答えがrootプロセスに戻る.

ParallelTable[expr,loopspec]
Tableの並列版.Mathematica組み込み関数名と同一だが使用可能[類似:SEMParallelTable,SEMTableも可能].ただし仕様が異なる.以下の結果はプロセス0の分のみであることに注意.これはMathematicaの組み込み関数ParallelTableと仕様が異なり一見不便のようにみえるが,データを各プロセスに配分し,それら全体に対するSEMのParalell関数を横断的に適用することが前提の場合は逆に便利となる.

ParallelTableの中で乱数生成関数を使用すると,Mathematica組み込みのParallelTableと挙動が異なるように見えることがある.SEMにおいては,各プロセスにおいて同じタイミング(つまり同じ乱数シード)で乱数を計算することが起きる.したがって,以下の例のように,各プロセスごとに異なる系列を持ちたい場合には,あらかじめ各プロセスごとに異なる乱数シードを事前に設定する必要がある.

ParallelTable[expr,loopspec,root]
rootプロセスを指定すると全プロセスの結果がrootプロセスに返される.なお,大域変数$ParallelTableCollectsをTrueにセットするとroot指定をしなくともrootプロセスに値が残る.

ParallelFunction[f,inputs,root]
データinputsの各要素に関数fを適用.これを並列に行う.結果はプロセスrootに集合.

ParallelNIntegrate[expr,loopsec]
NIntegrateの並列版.ただし,loopspecは単一の変数に対する領域指定のみ可能.

ParallelNIntegrate[expr,loopsec,digits]
ParalleNIntegrate[expr,loopsec]に同じ.ただし,digits分の精度指定が可能.

境界セル管理関数

EdgeCell[list]
各プロセスに所属する配列listの1行目,最終行を隣接するプロセス間で交換する.下例参考.

配列・ベクトル関連関数

ParallelTranspose[matrix]
各プロセスごとに分散した部分配列matrix全体をTranspose.各プロセスは結果の部分配列を保持.

ParallelProduct[matrix,vector]
各プロセスに分散した部分配列matrix全体とベクトルvectorの内積計算.結果は全プロセス同じものを得る.Mathematicaの組み込み並列関数ParallelProduct(Π)と混在しないように.[類似:SEMParallelProduct,SEMProduct]

ParallelDimensions[matrix]
各プロセスに分散した部分配列matrix全体に対するDimensions[]の計算

ParallelTr[matrix]
各プロセスに分散した部分配列matrix全体に対するTr[](Trace)の計算

ParallelIdentity[rank]
IndentityMatrixの並列版.各プロセスにはランクrankに応じた行が返される.

ParallelOuter[f,vector1,vector2]
Mathematicaの関数Outerの並列版.最終配列の要素f[a,b], a∈vector1, b∈vector2.

ParallelInverse[matrix]
Mathematicaの関数Inverseの並列版.

配列要素操作関数

ElementManage[list]
リストlist中の要素(第一要素は受信先プロセスID,第二要素は受信するデータ)にしたがって,データを送信.

ElementManage[list,switch]
受信先プロセスIDをswitchによってコントロール.ElementMange[list] の例は,Switch関数がIdentity関数の場合.Switchが整数の場合,すべてのデータが指定した整数をIDに持つプロセスに送られる.

フーリエ変換

ParallelFourier[list]

並列ディスクI/O

ParallelPut[expr,filename]
各プロセス上に存在するデータexprをすべて集めファイルfilenameに保存する.プロセスID0のプロセスが実行.

ParallelPut[expr,filename,root]
プロセスIDがrootのプロセスから実行.

ParallelPut[expr,filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.

ParallelGet[filename]
ファイルfilenameからデータを読み込み,結果をすべてのプロセッサに配分.

ParallelGet[filenmae,root]
プロセスIDがrootのプロセスから実行.

ParallelGet[filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.

ParallelBinaryPut[expr,type,filename]
ParallelPutのバイナリ版.タイプtypeについてはMathematicaのBinaryFormatに準拠.

ParallelBinaryPut[expr,type,filename,root]
プロセスIDがrootのプロセスから実行.

ParallelBinaryPut[expr,type,filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.

ParallelBinaryGet[type,filename]
ParalleGetのバイナリ版.タイプtypeについてはMathematicaのBinaryFormatに準拠.

ParallelBinaryGet[type,filenmae,root]
プロセスIDがrootのプロセスから実行.

ParallelBinaryGet[type,filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.

ParallelPutPerProcessor[expr,filename]

ParallelPutPerProcessor[expr,filename,root]
プロセスIDがrootのプロセスから実行.

ParallelPutPerProcessor[expr,filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.

ParallelGetPerProcessor[expr,filename]

ParallelGetPerProcessor[expr,filename,root]
プロセスIDがrootのプロセスから実行.

ParallelGetPerProcessor[expr,filename,root,comm]
プロセスIDがroot,プロセスプールがcommから実行.