我正在处理多个独立的大文件(每个文件都有相同的进程,进程之间没有通信)。所以,我有一种情况似乎很适合并行多核处理。而且,事实上,我可以访问一台具有多核的漂亮服务器(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)
使用--ntasks=4
,srun将启动4个相同的Perl进程。您想要的是--ntasks=1
和--cpu-per-task=4
,以便Slurm在一个节点上为您的作业分配四个核心。