【发布时间】:2018-03-15 10:57:35
【问题描述】:
我有一个用 Matlab 编写的复杂模型。该模型不是由我们编写的,最好将其视为“黑匣子”,即为了从内部解决相关问题,需要重写整个模型,这需要数年时间。
如果我有一个“令人尴尬的并行”问题,我可以使用一个数组来提交同一个模拟的 X 个变体,并带有选项 #SBATCH --array=1-X。但是,集群通常对最大数组大小有一个(令人沮丧的小)限制。
在使用 PBS/TORQUE 集群时,我通过强制 Matlab 在单个线程上运行、请求多个 CPU,然后在后台运行多个 Matlab 实例来解决这个问题。一个示例提交脚本是:
#!/bin/bash
<OTHER PBS COMMANDS>
#PBS -l nodes=1:ppn=5,walltime=30:00:00
#PBS -t 1-600
<GATHER DYNAMIC ARGUMENTS FOR MATLAB FUNCTION CALLS BASED ON ARRAY NUMBER>
# define Matlab options
options="-nodesktop -noFigureWindows -nosplash -singleCompThread"
for sub_job in {1..5}
do
<GATHER DYNAMIC ARGUMENTS FOR MATLAB FUNCTION CALLS BASED ON LOOP NUMBER (i.e. sub_job)>
matlab ${options} -r "run_model(${arg1}, ${arg2}, ..., ${argN}); exit" &
done
wait
<TIDY UP AND FINISH COMMANDS>
谁能帮我在 SLURM 集群上做同样的事情?
-
par函数不会在 Matlab 的并行循环中运行我的模型。 - PBS/TORQUE 语言非常直观,但 SLURM 让我感到困惑。假设我的 PBS 示例具有类似结构的提交脚本,这就是我认为某些命令会导致的结果。
- --ncpus-per-task=5 对我来说似乎是最明显的一个。我是将 srun 放在循环中的 matlab 命令前面还是将其保留在 PBS 脚本循环中?
- --ntasks=5 我想会请求 5 个 CPU,但会以串行方式运行,除非程序特别请求它们(即 MPI 或 Python 多线程等)。在这种情况下,我需要将 srun 放在 Matlab 命令前面吗?
【问题讨论】: