複数の大きな独立したファイルを処理しています (各ファイルに対して同じプロセス、プロセス間の通信はありません)。したがって、並列マルチコア処理に適していると思われる状況があります。実際、複数のコアを備えた優れたサーバー (Scientific Linux -Red Hat Enterprise-) にアクセスできます。
これらのコアを活用するために、Perl でいくつかのスクリプトを作成しようとしています。threads
モジュールとの両方を試しましたParallel::ForkManager
。を使用してサーバーに作品を起動しますsbatch
。ここで、使用するタスク (コア) の数 (および使用するメモリなど) を定義できます。それにもかかわらず、X 個のタスクを選択してジョブを起動すると、ジョブはコア間で分割されず、常に繰り返し (X 回、各コアで 1 回) 実行されます。何か大きなもの (そして基本的なもの) が欠けていることは確かですが、1 週間すべての方向に進んだ後では、それが何であるかわかりません。何がうまくいかないのですか?
Perl スクリプトの例を次に示します ( test.pl
)。
#!/usr/bin/perl -w
use strict;
use threads;
use Benchmark qw(:hireswallclock);
my $starttime = Benchmark->new;
my $finishtime;
my $timespent;
my $num_of_threads = 4;
my @threads = initThreads();
foreach(@threads){
$_ = threads->create(\&doOperation);
}
foreach(@threads){
$_->join();
}
$finishtime = Benchmark->new;
$timespent = timediff($finishtime,$starttime);
print "\nDone!\nSpent ". timestr($timespent);
sub initThreads{
my @initThreads;
for(my $i = 1;$i<=$num_of_threads;$i++){
push(@initThreads,$i);
}
return @initThreads;
}
sub doOperation{
# Get the thread id. Allows each thread to be identified.
my $id = threads->tid();
my $i = 0;
while($i < 100000000){
$i++
}
print "Thread $id done!\n";
# Exit the thread
threads->exit();
}
そして、sbatch
これを起動するために使用されるスクリプトの例:
#!/bin/bash -x
#SBATCH --job-name=prueba
#SBATCH -e slurm-%j.out
#SBATCH --ntasks=4
#SBATCH --mem=12G
srun perl -w test.pl
出力 (先ほど言ったように、プロセス全体が各コアで 1 回繰り返されたようです):
Thread 4 done!
Thread 1 done!
Thread 1 done!
Thread 4 done!
Thread 3 done!
Thread 3 done!
Thread 1 done!
Thread 3 done!
Thread 1 done!
Thread 4 done!
Thread 4 done!
Thread 3 done!
Thread 2 done!
Thread 2 done!
Thread 2 done!
Thread 2 done!
Done!
Spent 36.1026 wallclock secs (36.02 usr + 0.00 sys = 36.02 CPU)