如何在多个核心上批量运行simulink模型(多个作业)?

时间:2013-06-14 14:08:14

标签: matlab batch-file parallel-processing simulink

我有一个Simulink模型,在开始之前,执行一个脚本(在回调中)(让我们调用脚本constants.m)在基础工作区中设置各种常量和参数。现在,我希望Simulink模型能够使用各种常量和参数(即具有多个文件,constants1.mconstants2.m等)执行。这将消除手动更改相同脚本的需要每次运行Simulink模型之前。

我能够设置一个脚本(batchProcessing.m),可以多次加载,执行和关闭模型。但是,我想让所有作业同时在各种内核上运行(我有一个12核的Xeon CPU)。没有Parallel Toolbox可以做到这一点吗?是否可以使用批处理脚本(.bat)?

更新

这是我在macduff回答的帮助下尝试的:

我的测试功能:

function test3(n, ii)
A = rand(n);
B = rand(n);
tic; C=A*B; 
tableTitle = {'Resultat'};
fileID = fopen(strcat('D:\Documents\MATLAB', '\', 'batchResults', num2str(ii), '.txt'),'w');
fprintf(fileID, '%12s\n', tableTitle{1});
fprintf(fileID, '%12.5f\n',C(1:10));
fclose(fileID);
toc
end

.bat文件:

set MATLAB_EXE_PATH = "C:\MATLAB\R2010a\bin\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('%100%','%1');"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('%100%','%2');"

没有任何反应,并且未创建.txt。如果我直接在Matlab中运行test3函数,它可以正常工作。所以问题在于批处理文件。

使用正确答案进行更新

再次,在macduff回答的帮助下,我在这里做了什么:

set MATLAB_EXE_PATH=C:\MATLAB\R2010a\bin\matlab.exe
set arg1=5000
set arg2=1
start /MIN /LOW %MATLAB_EXE_PATH% -nodesktop -nosplash -r "cd('D:\Documents\MATLAB\'); test3(%arg1%,%arg2%); exit;"
set arg2=2
start /MIN /LOW %MATLAB_EXE_PATH% -nodesktop -nosplash -r "cd('D:\Documents\MATLAB\'); test3(%arg1%,%arg2%); exit;"

现在,如果Matlab窗口可以保持关闭而不在屏幕上弹出,那将会很棒。

3 个答案:

答案 0 :(得分:2)

这需要经常出现,需要在没有Parallel Toolbox的情况下运行多个Matlab会话。这确实是可能的。我相信你建议的方法很有可能,而且可能是最简单的方法,尽管有很多方法可以解决这个问题。

set MATLAB_EXE_PATH = "C:\MATLAB\2009b\win32\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%stringArgumentsToThisFunction%',...)"

您可以使用不同参数重复上面的start命令进行初始函数调用,以进行批处理作业。

修改

猜猜我不是很清楚,抱歉。以下是批处理文件的示例:

rem In a file like, runMe.bat on the Desktop that you double click
set MATLAB_EXE_PATH = "C:\MATLAB\2009b\win32\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%stringArgumentsToThisFunction%',...)"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%differentStringArgumentsToThisFunction%',...)"

我从来不需要指定运行Matlab的核心。根据我的经验,当一个新的进程假脱机时,它被分配到每个核心,所以我总是运行尽可能多的进程,就像我有核心一样。这非常有效,但如果您需要更精细的谷物控制,您应该考虑dbenham关于PSEXEC等的建议。 HTH!

修改

您需要将脚本放在启动目录中,即Matlab启动的目录see this link。我尝试了下面这个,就像一个快速和脏的检查,我在C:\ Data中有test3.m。

set V=100
set K=2
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"

有效!但我没有调出MATLAB版本,仅使用PATH。

这是我的最后一次发售。 : - )

m文件:

function test3(n, ii)
  A = rand(n);
  B = rand(n);
  tic; C=A*B; 
  tableTitle = {'Resultat'};
  fileID = fopen(strcat('C:\', 'batchResults', num2str(ii), '.txt'),'w');
  fprintf(fileID, '%12s\n', tableTitle{1});
  fprintf(fileID, '%12.5f\n',C(1:10));
  fclose(fileID);
  toc
  exit;
end

Bat文件:

set MATLAB_EXE_PATH=C:\MATLAB\R2009bSP1\bin\win32\matlab.exe
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('100','1');"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('100','2');"

set V=100
set K=2
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"
set V=100
set K=3
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"

示例输出:

Resultat
26.90660
25.58899
23.75740
23.83745
23.75160
27.37161
23.52786
28.48510
27.30217
22.07751

享受!

答案 1 :(得分:1)

您可以简单地编写一个使用多个START命令的主批处理脚本,每个所需的进程一个。操作系统应自动平衡处理器的使用。

或者,如果您想确保给定流程针对特定处理器,请下载并使用Microsoft的PSEXEC

如果你有比运行处理器更多的进程,并且你想并行运行它们,但是在运行下一个进程之前等待处理器空闲,那么看看我对Parallel execution of shell processes 的回答

答案 2 :(得分:0)

是的,可以使用Parallel Computing Toolbox,参见Videos & examples,“使用Simulink进行并行计算”部分。您必须小心,但是如何为每个模型实例设置数据,以便每个模型都可用。