トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Parallel::MPI::Simpleによる並列処理

[Perl]

Parallel::MPI::Simpleによる並列処理

Parallel::MPI::SimpleモジュールからMPIを用いることでPerlスクリプトをPCクラスタ上で並列に走らせることができる。詳しくはCPANのドキュメントを参照。

コード例

use strict;
use Parallel::MPI::Simple;
MPI_Init();
my $rank = MPI_Comm_rank(MPI_COMM_WORLD);
if ($rank == 0) {
	my @work = 1..100;
	MPI_Bcast(\@work, 0, MPI_COMM_WORLD);
	&echo(\@work, $rank);
}
else {
	my $work = MPI_Bcast(undef, 0, MPI_COMM_WORLD);
	&echo($work, $rank);
}
MPI_Finalize();
sub echo {
	my $work = shift;
	my $rank = shift;
	foreach (@{$work}) {
		if (mkdir(".lock_$_", 0755)) {
			unless (-e "echo_$_") {
				system("echo $rank > echo_$_");
				sleep(1);
			}
			rmdir(".lock_$_");
		}
	}
}

起動するには以下のコマンドを実行する。

mpirun -np 並列数 perl スクリプトファイル名

この例では、並列プロセスのそれぞれに同一の配列を与えて処理をさせるが、処理中or処理済みであればスキップする。4CPUマシンで4並列で走らせた場合、25秒程度で終わるが、非並列処理の場合は100秒以上かかるはずである。また、mkdir()によるロックをしているため、このスクリプトを走らせるクラスタは分散ロックに対応した共有ディスクを持っている必要がある。分散ロックに対応していない共有ディスクや非共有ディスクでは、ノードをまたがったプロセス間ではロックが効かない。非共有ディスクに対応するためには、各プロセスで出力したファイルはMPI_Sendでルートプロセスに送信してファイルは削除し、ルートプロセスは受け取った情報を元にしてファイルを作成するという手順を踏む必要がある。

最終更新時間:2009年07月07日 09時21分27秒