3

複数の大きな独立したファイルを処理しています (各ファイルに対して同じプロセス、プロセス間の通信はありません)。したがって、並列マルチコア処理に適していると思われる状況があります。実際、複数のコアを備えた優れたサーバー (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)
4

1 に答える 1

3

を使用--ntasks=4すると、srun は 4 つの同一の Perl プロセスを起動します。あなたが望むのは--ntasks=1--cpu-per-task=4Slurm がジョブのために 1 つのノードに 4 つのコアを割り当てるようにすることです。

于 2013-10-04T19:06:41.033 に答える