並列Octaveパッチ 概要 これはOctave(2.1.36)に並列計算用の関数を追加するパッチです.この並列 計算はMPIやPVMなどの並列計算ライブラリーは必要としません.Linuxでの 動作を確認しています.(おそらく他のOSでも動くと思います). 最新版は以下のURLで入手できます 必要な物 1. octave-2.1.36のソースコード( http://www.octave.org/ で入手可能) 2. 2台以上のコンピュータ. このパッチの適用の仕方 1. Octaveのソースを展開したディレクトリに移動する $ cd /path/to/octave-2.1.36 2. パッチを適用する $ gzip -dc octave.2.1.36-parallel_0.6.patch.gz |patch -p0 3. makeする 3. Build Octave $ ./configure $ make # make install 追加されたコマンドラインオプション --server -s : サーバーモードで起動する 使い方 このパッチは一つのマスターと複数のスレーブコンピュータで使うことを 想定しています. まず,octaveを各スレーブノードで"--server"オプションをつけて実行し ます. $ octave --server または $ octave -s 次にマスターノードで"--server"をつけずにoctaveを実行します. $ octave -q -f script.m または $ octave octave:1> スクリプトを実行 コマンドリファレンス connect (hosts) 行列"hosts"で指定したマシン間に双方向のコネクションを生成し,その マシンへのソケットの行列を返す.このコマンドを並列計算をはじめる前 にマスターとなるマシンで実行します.例えば,次のようにマスターとな るマシンで実行する. connect ([ "host1"; "host2"; "host3" ]) => [ 0, 0; 5, 3; 6, 4 ] ここで,host1, host2, host3はホストの名前です. 通常はhost1がマスター,host2とhost3がスレーブになります.ソケット 番号の組み(例えば "5, 3")が各ノードに割り当てられます.スレーブ ノードではソケットの行列は"sockets"という名前の変数に格納されます. send (x, sockets) 行列"sockets"で指定したマシンに変数xを送信する. 例, send ([ 1+2i, 3; 4, 5+6i ],sockets(2:3,:)); recv (socket) 列ベクトル"socket"で指定されたマシンから変数を受信する. 例, recv (sockets(1,:)) => [ 1+2i, 3; 4, 5+6i ] reval (commands, sockets) 行列"sockets"で指定されたスレーブホストで"commands"を実行する. 例, reval ([ "a=[ 1:3 ]"; "a=a'*a" ],socket(2,:)); close (sockets) 行列"sockets"で指定されたsocketを閉じる. 例, close (sockets); 現バージョンでの注意点: * スレーブコンピュータにマスターのカレントディレクトリと同じPATHが 存在しなくてはならない. * スレーブの標準入出力は/dev/nullにリダイレクトされる. サンプルプログラム: 次のスクリプトは1から100までの整数の和を計算しています."host2" と "host3"で半分ずつ計算しています. clear; hosts = [ "host1"; "host2"; "host3" ]; sockets = connect(hosts); psum = zeros(1,2); reval( "send(sum([1:50]),sockets(1,:))", sockets(2,:)); reval( "send(sum([51:100]),sockets(1,:))", sockets(3,:)); psum(1) = recv(sockets(2,:)); psum(2) = recv(sockets(3,:)); sum(psum) reval("close(sockets)",sockets); close(sockets); 次のスクリプトでは,変数 s="Hello, again!" を4ノードで巡回 させています. clear; hosts = [ "host1"; "host2"; "host3"; "host4" ]; sockets = connect(hosts); s="Hello, again!"; send(s,sockets(2,:)); reval( "s=recv(sockets(1,:));",sockets(2,:)); reval( "send(s,sockets(3,:));",sockets(2,:)); reval( "s=recv(sockets(2,:));",sockets(3,:)); reval( "send(s,sockets(4,:));",sockets(3,:)); reval( "s=recv(sockets(3,:));",sockets(4,:)); reval( "send(s,sockets(1,:));",sockets(4,:)); s2=recv(sockets(4,:)) reval("close(sockets)",sockets); close(sockets); ライセンス: このパッチはフリーソフトウェアです; Free Software Foundation 発行の GNU 一般公有使用許諾書 (GPL) バージョン 2 が規定する条件の下での再配布 および改変を許可します; 当ライセンスについては、バージョン 2、あるいは それ以降の (任意の)バージョンとします。 ご意見等は以下のアドレスへ: octave@higuchi.ecei.tohoku.ac.jp