在MATLAB中加速批处理作业执行

时间:2017-05-20 01:48:29

标签: matlab parallel-processing

我是MATLAB中批量作业执行的新手。我正在玩下面的代码:

clear 
a = rand(10,1);
job = batch('l_beta');
wait(job)
load(job,'b')

l_beta只是一行代码:

b = sum(a);

虽然所有操作都很简单,但令人惊讶的是,在第一个块中执行代码需要12秒。我在以下链接中查看了讨论

https://www.mathworks.com/matlabcentral/answers/166757-why-is-batch-so-slow

似乎有很多与启动批处理作业相关的开销。我想知道是否有简单的方法来减少这种开销。比方说,如果我进行一次配置/预热,那么只要MATLAB正在运行就不用担心它。

1 个答案:

答案 0 :(得分:1)

您可以使用tic / toc和job属性轻松地调试它。见下面的例子

clc; close all; clear;
a = 10;

tic;
c = parcluster();
fprintf('Creating the cluster: %.2f sec\n', toc);

tic;
job = createJob(c);
fprintf('Creating a job: %.2f sec\n', toc);

tic;
createTask(job, @exp, 1, {a});
createTask(job, @sin, 1, {a});
fprintf('Creating the tasks: %.2f sec\n', toc);

tic;
submit(job);
fprintf('Submitting the job: %.2f sec\n', toc);

% Most of the time goes on scheduling the job here
% pause(10);

tic;
wait(job)
fprintf('Waiting time: %.2f sec\n', toc);

tic;
results = fetchOutputs(job);
fprintf('Fetching Results: %.2f sec\n\n', toc);

fprintf('Job Properties\n');
fprintf('Create Time: %s \n', job.CreateTime);
fprintf('Submit Time: %s \n', job.SubmitTime);
fprintf('Start Time: %s \n', job.StartTime);
fprintf('Finish Time: %s \n', job.FinishTime);

delete(job);

如果我运行这个,我得到以下

Creating the cluster: 0.01 sec
Creating a job: 0.02 sec
Creating the tasks: 0.04 sec
Submitting the job: 0.19 sec
Waiting time: 4.13 sec
Fetching Results: 0.02 sec

Job Properties
Create Time: Mon May 22 10:30:23 BST 2017 
Submit Time: Mon May 22 10:30:23 BST 2017 
Start Time: Mon May 22 10:30:26 BST 2017 
Finish Time: Mon May 22 10:30:27 BST 2017 

您会发现提交和开始之间大部分时间都丢失了。执行本身很快。如果您通过从pause(10)删除评论来引入暂停,则会收到以下内容

Creating the cluster: 0.01 sec
Creating a job: 0.02 sec
Creating the tasks: 0.04 sec
Submitting the job: 0.19 sec
Waiting time: 0.06 sec
Fetching Results: 0.02 sec

Job Properties
Create Time: Mon May 22 10:31:44 BST 2017 
Submit Time: Mon May 22 10:31:44 BST 2017 
Start Time: Mon May 22 10:31:47 BST 2017 
Finish Time: Mon May 22 10:31:48 BST 2017 

因此,您可以考虑在代码的早期提交作业,在计划和运行作业时执行其他操作,然后在代码中进一步提取结果。我希望这有用。