【问题标题】:How to run a simulink model in batch (multiple jobs) on multiple cores?如何在多个内核上批量(多个作业)运行 simulink 模型?
【发布时间】:2013-06-14 14:08:13
【问题描述】:

我有一个 Simulink 模型,在开始之前,执行一个脚本(在回调中)(让我们调用脚本constants.m)来设置基础工作区中的各种常量和参数。现在,我希望 Simulink 模型使用各种常量和参数集(即有多个文件,constants1.mconstants2.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 窗口可以保持关闭而不在屏幕上弹出,那就太好了。

【问题讨论】:

    标签: matlab batch-file parallel-processing simulink


    【解决方案1】:

    这是一个经常出现的需求,需要在没有 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 建议。 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
    

    蝙蝠档案:

    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
    

    享受吧!

    【讨论】:

    • 这是一个好的开始,但是如何将批处理命令start发送到特定的核心?
    • 从您的示例中,我意识到传递给我的函数的参数未正确写入批处理文件。现在一切正常,我的 XEON 使用率为 100%,非常棒。
    • @m_power,如果这回答了您的问题,请随时将其标记为已回答。 :-)
    【解决方案2】:

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

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

    如果您要运行的进程多于处理器数量,并且您希望并行运行它们,但在运行下一个进程之前等待处理器空闲,请查看我对 Parallel execution of shell processes 的回答

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我想在没有并行计算工具箱的情况下执行此操作。
      • 对不起,我读你的帖子太快了,理解的是“有”而不是“没有”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多