Grid[Launch] - 並列計算を起動
|
使い方
|
|
Launch(code)
Launch(code,args,options)
|
|
パラメータ
|
|
code
|
-
|
各ノードで実行する Maple コードの文字列、または独立したプロシージャ
|
args
|
-
|
リモートプロシージャコールに渡す引数
|
numnodes = posint
|
-
|
計算を実行するノード数
|
printer = procedure
|
-
|
各ノードの出力を調整するためのコールバック・プロシージャ
|
checkabort = procedure
|
-
|
処理を中止するためのコールバック・プロシージャ
|
imports = {list,set}
|
-
|
現在の Maple セッションから各ノードにインポートする表現
|
exports = {list,set}
|
-
|
マスターノード(ノード 0)から Launch を呼び出した Maple セッションにエクスポートする表現
|
clear = truefalse
|
-
|
コール間で状態を消去するかを指定
|
allexternal = truefalse
|
-
|
node0 が external であるかを指定
|
|
|
|
|
説明
|
|
•
|
Launch コマンドはジョブを並列に実行します。ジョブは、最初の引数で Maple の命令を含む文字列、または独立したプロシージャとして指定します。ここで、「独立した」プロシージャとは、リモートノードプロセスの一般メモリスペース以外に存在するプロシージャやデータを参照しないものを指します。code がプロシージャとして与えられたとき、Launch に渡される他の引数がプロシージャコールの引数として渡されます。例えば Launch(f,1,2,numnodes=4) とした場合、各ノードで f(1,2) が実行されます。
|
•
|
各ノードで同じコードが実行されます。コード内で MyNode コマンドを呼び分岐させることで、計算の各タスクを所定ノードに割り振ることができます。
|
•
|
ノード 0 の計算が終わると並列ジョブが終了します。そのとき、他の全ノードの計算が中止されます。
|
•
|
Launch は、ノード 0 の最終計算値を戻します。最終計算値がない場合、空文字列 "" を戻します。
|
•
|
各ノードは、ジョブの実行されているコードのデッドロックの発生を検知しようとします。デッドロックのタイムアウト(デフォルト 10 秒)が起きると、ジョブが中止されます。デッドロックとは、起動したジョブの全ノードがメッセージ待ちで、どのノードも計算やメッセージ送信をしていない状態とします。
|
•
|
numnodes オプションは、並列ジョブを実行する際のプロセス数を指定します。これはローカルモードでは、ローカルマシンのプロセッサ数(kernelopts(numcpus); による)、または現セッションにおける以前の Launch コールで初期化された最大ノード数となります。分散モードでは、numnodes は Grid[Status] へのコールの二回目の結果から計算可能と判断されるプロセス数をデフォルト値とします。
|
•
|
imports オプションは、現在の Maple セッションから各ノードに送る変数リストまたは変数セットを実行前に指定します。リストの内容は、(名前) = (値)のペア、アサインされた名前、グローバルな名前を表す文字列の三つの形が許されます。
|
•
|
exports オプションは、ジョブが正常に終了した後にノード 0 から現在の Maple セッションに戻す変数リストを指定します。このリストは、グローバルな名前を表す文字列だけを含んだものでなければなりません。ローカルモードのときノード 0 は現行 Maple セッションと同じなので、このオプションは余計な労力を必要としません。
|
•
|
printer オプションは、外部計算から出力が一行提供されるたびに文字列を用いて呼び出されるプロシージャを指定します。カスタム・プロシージャが与えられていない場合のデフォルトは printf コマンドです。指定したプリンター・プロシージャは文字列の引数を 1 つだけ取り、それは各ノードの途中の印刷出力を表します。
|
•
|
checkabort オプションは、引数なしで定期的に呼ばれるプロシージャを指定します。そのプロシージャが true を戻すと全ノードで計算が中止されます。プロシージャが false を戻すと計算は続行します。ローカルグリッドモードではこのオプションは無視されます。
|
•
|
clear オプションはローカルモードだけで利用できます。デフォルトとして clear = true となっているので、Launch へのコールの最後に全ノードの状態がリセットされます。clear = false とすれば、リモートノードの状態は終了時にリセットされません。
|
•
|
allexternal オプションは、ローカルモードでのみ利用できます。どのモードでも、デフォルトの動作は Launch を呼び出しているプロセスが N 個の外部ノードを生成し、それぞれが終了するのを待ちながら表示用出力を処理するというものになります。ローカルモードで allexternal が false に設定されたときは、呼び出し元プロセスはノード 0 となります。これは、ノード 0 がデータを配布し、結果を集める場合とくに便利です。データは Launch を呼ぶ前から利用可能なので、imports と exports のオプションが不要になります。ローカルに実行することの副作用として、実行中に行われた割り当てはジョブ終了後も存続し、ノード 0 のセッションの状態もクリアされないことに注意してください。
|
•
|
分散モード(別ライセンス下のツールボックスとして提供)のうちのひとつでグリッドパッケージを実行するときは、並列ジョブを起動する前に、利用したいマシン全てにサーバが走っていることを確認し、Setup コマンドを呼んでマシンのひとつをマスターノードに指定しなければなりません。このような並列計算を設定・起動する最も簡単な方法は、Launch() を引数なしで呼んだとき表示される対話型ワークシート・ページを利用することです。Windows では、さらにグリッド計算ワークシートへのショートカットのアイコンがデスクトップに作られ、グリッド計算タスクのスタートページとして利用できます。グリッドツールボックスがインストールされている場所は、kernelopts(toolboxdir=Grid) のコマンドでクエリーできます。対話型グリッド計算ページは、Maple 標準ワークシートインターフェースを必要とします。
|
|
|
互換性
|
|
•
|
Grid[Launch] コマンドは Maple 15 より導入されました。
|
|
|
例
|
|
>
|
hello := proc()
uses Grid;
printf("I'm node %d of %d\n",MyNode(),NumNodes());
Barrier();
end;
|
| (5.1) |
>
|
Grid:-Launch(hello,numnodes=5);
|
I'm node 2 of 5
I'm node 0 of 5
I'm node 4 of 5
I'm node 1 of 5
I'm node 3 of 5
| |
>
|
Grid:-Launch(hello,numnodes=3);
|
I'm node 1 of 3
I'm node 2 of 3
I'm node 0 of 3
| |
>
|
Grid:-Launch(hello,numnodes=6);
|
I'm node 3 of 6
I'm node 2 of 6
I'm node 1 of 6
I'm node 5 of 6
I'm node 4 of 6
I'm node 0 of 6
| |
>
|
primeChecker := proc()
uses Grid;
local nn, thisNode, i, myVal, rslt, rply, t1, t2, b1;
global timingData, userData, primetest;
nn := NumNodes();
thisNode := MyNode();
myVal := userData[thisNode+1];
printf("Value %a\n", myVal);
b1:= primetest(myVal);
rslt := [ ifactor(myVal), b1];
if thisNode <> 0 then
printf("Sending %a\n", rslt);
Send(0, rslt);
else
timingData := [0, 0];
rply := rslt;
t1 := time[real]();
for i from 1 to (nn-1) do
rslt := Receive(i);
printf("Received %a\n", rslt);
rply := rply, rslt;
t2 := time[real]();
timingData := timingData, [i, t2-t1];
t1 := t2;
end do;
timingData := [timingData];
return [rply];
end if;
end proc:
|
>
|
primetest := proc(qq1) isprime(qq1) end;
|
| (5.2) |
>
|
userData := [ seq(rand(1001..10001)() ,i=1..4) ];
|
| (5.3) |
>
|
result := Grid:-Launch(primeChecker,
numnodes=4,
imports=['primetest', 'userData'],
exports=["timingData"] );
|
Value 4003
Value 8927
Sending [``(4003), true]
Value 1006
Value 9058
Sending [``(2)*``(503), false]
Sending [``(2)*``(7)*``(647), false]
Received [``(2)*``(7)*``(647), false]
Received [``(2)*``(503), false]
Received [``(4003), true]
| |
| (5.4) |
| (5.5) |
|
|