我最典型的用例是在多个目录(通常是R或Matlab)上运行单个脚本。我可以访问高性能计算环境(基于SLURM)。到目前为止,从我的研究来看,我尚不清楚哪种方式可以更有效地利用可用的CPU /内核。我还想确保我不会不必要地占用系统资源,所以我想仔细检查以下两种方法中哪一种最合适。
方法1:
方法2:
我对此还是很陌生,所以如果我在这里混淆了一些东西,或者您需要更多详细信息来回答这个问题,请告诉我。
答案 0 :(得分:1)
对我来说,答案是显而易见的,假设获得良好的并行性通常很困难。
在第一种方法中,您要求SLURM提供一组资源,但是如果您要求使用许多CPU,则可能会浪费很多资源(如果您要求使用32个CPU,而加速仅为4倍,那是在浪费您的资源) 28个CPU)。这样一来,集群中的一小部分将处理一个文件夹,另一个文件夹处理。
在第二种方法中,您将要求SLURM为每个文件夹运行一个作业。将有许多作业同时运行,他们可以要求更少的资源。假设您要为每个作业请求4个CPU(加速是3倍,这意味着每个作业浪费1 cpu)。同时运行8个作业将采用与第一种方法相同的32个CPU,但是只会浪费8个CPU,同时会处理8个文件夹。
最后,必须在确定哪个是CPU数量不同的情况下进行加速后才能做出决定,但是我的感觉是通常会首选第二种方法,除非您获得了很好的加速效果,在这种情况下,两种方法都是等效的。
答案 1 :(得分:1)
如果您未在原始R或Matlab脚本中明确使用MPI,建议您完全避免使用MPI,而应使用job arrays。
假设您有一个脚本<div class="container-fluid d-flex flex-column" style="height: 100vh;">
<div class="row d-flex flex-column no-gutters">
<app-top class="col"></app-top>
<div class="row flex-row no-gutters" style="margin-top: 38px;">
<app-left class="col flex-shrink-0"></app-left>
<div class="col">
<router-outlet></router-outlet>
</div>
<app-right class="col flex-shrink-0"></app-right>
</div>
</div>
</div>
和一组子目录myscript.R
,data01
,...,data02
,并且这些脚本将目录的名称设为输入参数,您可以执行以下操作。
在数据目录的父目录中创建提交脚本:
data10
此脚本将创建一个作业数组,其中每个作业将以数据目录之一作为参数运行#!/bin/bash
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 1
#SBATCH --mem-per-cpu=2G
#SBATCH --time 1-0
#SBATCH --array=1-10
DIRS=(data*/) # Create a Bash array with all data directories
module load R
Rscript myscript.R ${DIRS[$SLURM_ARRAY_TASK_ID]} # Feed the script with the data directory
# corresponding to the task ID in the array
。
当然,您需要调整内存和时间的值,并调查每个作业使用一个以上的CPU是否对您有利。并根据您的情况将myscript.R
参数调整为实际的目录数。