2

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

我能够设置一个脚本 ( batchProcessing.m) 来多次加载、执行和关闭模型。但是,我想让所有作业在不同的内核上同时运行(我有一个 12 核的 Xeon CPU)。如果没有并行工具箱,是否可以做到这一点?可以使用批处理脚本(.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 窗口可以保持关闭而不在屏幕上弹出,那就太好了。

4

3 回答 3

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。根据我的经验,当一个新进程启动时,它会分发到每个核心,因此我总是只运行与核心数量一样多的进程。这非常有效,但是如果您需要更精细的粒度控制,您应该考虑有关 PSEXEC 等的 dbenham 建议。!

编辑

您需要将脚本放在启动目录中,即 Matlab 启动的目录中,请参阅此链接。我尝试了以下方法,就像快速而肮脏的检查一样,我在 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

蝙蝠档案:

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

享受!

于 2013-06-14T14:24:50.793 回答
1

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

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

如果您要运行的进程多于处理器,并且您希望并行运行它们,但在运行下一个进程之前等待处理器空闲,然后看看我对并行执行 shell 进程的 回答

于 2013-06-14T14:50:17.503 回答
0

是的,可以使用 Parallel Computing Toolbox,请参阅视频和示例,“使用 Simulink 进行并行计算”部分。您必须小心如何为每个模型实例设置数据,以便它可用于每个工作。

于 2013-06-14T14:16:50.533 回答