- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{category Perl}}
*Parallel::MPI::Simpleによる並列処理
Parallel::MPI::SimpleモジュールからMPIを用いることでPerlスクリプトをPCクラスタ上で並列に走らせることができる。詳しくは[CPANのドキュメント|http://search.cpan.org/~ajgough/Parallel-MPI-Simple/Simple.pm]を参照。
*コード例
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秒以上かかるはずである。
この例では、並列プロセスのそれぞれに同一の配列を与えて処理をさせるが、処理中or処理済みであればスキップする。4CPUマシンで4並列で走らせた場合、25秒程度で終わるが、非並列処理の場合は100秒以上かかるはずである。また、mkdir()によるロックをしているため、このスクリプトを走らせるクラスタは分散ロックに対応した共有ディスクを持っている必要がある。分散ロックに対応していない共有ディスクや非共有ディスクでは、ノードをまたがったプロセス間ではロックが効かない。非共有ディスクに対応するためには、各プロセスで出力したファイルはMPI_Sendでルートプロセスに送信してファイルは削除し、ルートプロセスは受け取った情報を元にしてファイルを作成するという手順を踏む必要がある。