在不使用parfor循环的情况下运行多个matlab示例

j5fpnvbx  于 2022-11-15  发布在  Matlab
关注(0)|答案(3)|浏览(254)

我想在不运行parfor循环的情况下运行几个matlab示例。我的代码结构如下:

if k == 1
% Set some parameters here
elseif k == 2
% Set some other parameters here 
...
elseif k == 10
%Set some other parameters here
end

有没有一种有效的方法来打开10个MatLab示例,其中每个示例都将运行给定值k
我知道,在使用Slurm的集群中,我可以使用Slurm数组,也就是说,我可以将以下代码添加到MATLAB代码的开头:

k = str2num(getenv('SLURM_ARRAY_TASK_ID'));

然后只需提交一批。有什么我可以在普通电脑上做的类似的事情吗?

ds97pgxw

ds97pgxw1#

在Linux中,您可以让bash脚本编写出可并行执行的matlab脚本。您可以在每次调用后使用与号(&),但GNU parallel软件更好:然后您可以指定将并行运行多少个作业。
此bash脚本

#!/bin/bash

# command line argument: how many scripts (jobs) in parallel?
if [[ ${1} == "" ]]; then
   echo "${0} needs a parameter: N == how many scripts are made 0,1,2 ..."
   exit 1
fi
N=${1}; 
echo "creating and running ${N} scripts ..."

# some constants
c_dir=$(pwd)
ml_ex=$(which matlab)

# create the scripts
for (( i=1; i <= ${N}; i++ )); do
cat << EOF > ${c_dir}/script${i}.m
a = ones (${i}) * $i
EOF
done

# list them, then pass this list to parallel
for f in ${c_dir}/script*.m; do
    echo "${ml_ex} < $f" 
done | parallel -j ${N};

# tidy up
rm -f ${c_dir}/script*.m

生成N MATLAB脚本(N是命令行参数),并在MATLAB中并行执行它们。每个脚本都应该显示一个MM矩阵,其中填充了数字M(对于M=1,2,...N)。因此,命令runsN.sh 5同时运行5个matlab副本。
与脚本中的${ml_ex}不同,${ml_ex} -nodesktop -nosplash更清楚地显示了发生了什么。我有一个别名,可以一直使用这些选项。
如果你有许多耗时、不是很耗费资源、完全独立的工作,这可能值得一试。我曾将其用于图像处理。

ecbunoof

ecbunoof2#

如果您使用GNU parallel,您可以获得类似于在集群上使用Slurm的设置:

parallel -j 4 'export SLURM_ARRAY_TASK_ID={} ; matlab [...] my_script.m' ::: {1..10}
          ^    ^                                ^                             ^
          |    |                                |                             Bashism to express 1, 2, ..., 10
          |    |                                invoke Matlab with its args and the script
          |    create a SLURM_ARRAY_TASK_ID variable to fool the script
          run maximum 4 "jobs" at a time

通过在parallel启动的命令中显式设置SLURM_ARRAY_TASK_ID变量,您可以在集群和本地工作站上使用相同的MatLab脚本。
GNU并行提供了许多选项来管理、限制、限制甚至分派“作业”。

stszievb

stszievb3#

1.You can pass arguments to matlab functions from command line
例如:

function y = myfunc(k)
switch k:
    case 1:
....

从DOS:

matlab /r "myfunc(2)"

1.You can write for loops in windows command line
for /l %x in (1, 1, 100) do echo %x
1.You can run commands "on the background"
START /B your_command
但我不明白你想要这个做什么。运行10个MatLab示例的开销绝对会破坏您认为正在实现的任何“并行化”。你的速度是发动机的10倍。只需观察在不运行任何程序的情况下打开它时,matlab会占用多少内存和处理能力。
请注意,MatLab parfor在并行化方面非常出色,如果允许(即,如果免费),许多MatLab函数将使用所有可用内核来计算结果,从而最大化您的资源。如果在一台PC上运行,我会感到惊讶,如果这几乎是快速的。
所以上面的答案回答了你如何做到这一点,但真正的答案是你不应该这样做。在MatLab中运行代码的多个示例是最糟糕也是最慢的方式。For循环可能会更快。

相关问题