我想在不运行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'));
然后只需提交一批。有什么我可以在普通电脑上做的类似的事情吗?
3条答案
按热度按时间ds97pgxw1#
在Linux中,您可以让bash脚本编写出可并行执行的matlab脚本。您可以在每次调用后使用与号(
&
),但GNU parallel软件更好:然后您可以指定将并行运行多少个作业。此bash脚本
生成
N
MATLAB脚本(N
是命令行参数),并在MATLAB中并行执行它们。每个脚本都应该显示一个M
M
矩阵,其中填充了数字M
(对于M
=1,2,...N
)。因此,命令runsN.sh 5
同时运行5个matlab副本。与脚本中的
${ml_ex}
不同,${ml_ex} -nodesktop -nosplash
更清楚地显示了发生了什么。我有一个别名,可以一直使用这些选项。如果你有许多耗时、不是很耗费资源、完全独立的工作,这可能值得一试。我曾将其用于图像处理。
ecbunoof2#
如果您使用GNU parallel,您可以获得类似于在集群上使用Slurm的设置:
通过在
parallel
启动的命令中显式设置SLURM_ARRAY_TASK_ID
变量,您可以在集群和本地工作站上使用相同的MatLab脚本。GNU并行提供了许多选项来管理、限制、限制甚至分派“作业”。
stszievb3#
1.You can pass arguments to matlab functions from command line。
例如:
从DOS:
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循环可能会更快。