首先要区分一下并行计算与多线程的区别。并行计算是指 开启多核来进行同一个任务的计算。多线程是指调用资源来分别执行多个不同的任务。
Matlab 并行计算是在2012版本之后就从 matlabpool 命令改成了 parpool命令,网上有关并行计算的的资料还是挺多的。这里就不再说了。
Matlab在多线程方面用的就不多了。这里仅仅提供一个小的例子,一些更多的细节还是要去看官方文档的。
利用 Matlab 进行并行计算时,还需要说明几个概念:
- job : 即Matlab待完成的任务,job由一组 task(作业)组成。
- task : 并行计算的基本单元,分配到Matlab worker执行
- scheduler :负责管理Matlab 提交的job, 分配 task 到每一个 worker
- worker: 是指工作单元,数目一般小于等于 CPU的核数。lab是特殊的一个worker,lab之间可以进行数据通信。
因此,我们如果想要执行不同的程序或代码,方法有: - 开多个Matlab(最直接)
- 把不同的程序写成 function ,分配给不同的task.
这里就试验一下第二个方法,就是同时进行画图与存数两个功能。由于下面的createTask函数的第二个参数只能是function,不支持脚本,所以有写了两个function(mytxt, myplot)。
mytxt.m
function state = mytxt(A)
filename = 'C:\Users\Administrator\Desktop\haha.txt';%文件路径 + 文件名
file_id = fopen(filename,'a+');
for jj = 1:length(A)
fprintf(file_id,'%.4f\r\n',A(jj));
end
fclose(file_id);
state = 1;
end
myplot.m
function state = myplot(x,y)
plot(x,y)
state = 1;
end
主程序:给job1分配三个‘myplot’的task,一个‘mytxt’的task
clc
clear
A = [1:10];
clust = parcluster('local');
job1 = createJob(clust); %开启一个job
createTask(job1,@myplot,1,{{1:10,10:10:100},{1:10,10:10:100},{1:10,10:10:100}});%给job1分配三个‘myplot’的task
createTask(job1,@mytxt,1,{A});%再给job1分配一个‘mytxt’的task
get(job1,'Tasks')
submit(job1);
wait(job1);
result_1 = job1.fetchOutputs;
result_1
delete(job1);
然后我们可以观察到后台运行程序,由五个 MATLAB.exe,就说明由 四个task和 一个 client 在运行。一般情况下,计算量非常大的时候才考虑开启并行,数据量比较小的时候,串行其实更省时间。