当我尝试启动不同的线程时,如何避免重复的作业(每个核心一个)?

时间:2013-08-16 15:05:38

标签: multithreading perl parallel-processing multicore slurm

我正在处理多个大的独立文件(每个文件的进程相同,进程之间没有通信)。因此,对于并行多核处理,我的情况似乎很好。而且,事实上,我可以使用具有多个内核的漂亮服务器(Scientific Linux -Red Hat Enterprise-)。

我正在尝试用Perl编写一些脚本,以便从中获利。我尝试了threads模块和Parallel::ForkManager。我使用sbatch将服务启动到服务器,在那里我可以定义我将使用的任务(核心)的数量(以及我将采用的内存等)。然而,当我启动一个选择X个任务的作业时,作业不是在核心之间划分,而是总是重复执行(X次,每个核心一次)。我确定我错过了一些重要的东西(基本!)但是经过一周的指导后,我并没有意识到它是什么。出了什么问题???

以下是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

输出(正如我所说,似乎整个过程在每个核心中重复了一次):

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)

1 个答案:

答案 0 :(得分:3)

使用--ntasks=4,srun将启动4个相同的Perl进程。您想要的是--ntasks=1--cpu-per-task=4,以便Slurm在一个节点上为您的工作分配四个核心。