matlab的分布式计算可以理解为一台机器作为client(主控机),其他的机器分别作为计算的结点,要由client进行控制和操作。如果把单机上的.m文件直接放到client运行,是不会产生分布式计算的效果的,只相当于在主控机进行了计算,而其他的结点都还处于闲置状态。要想使用所有的结点或者部分结点进行计算,必须使用findResource()找到可利用的闲置cpu,使用createJob()创建工作,再使用createTask()为工作分配一个或多个任务,最后提交工作,这样,计算任务才分配到各个结点上。
分布式计算的环境是需要配置的,但是我使用的环境是学院的刀片机,已经被配置好了,运行的时候直接用ssh或者xmanager 登陆,所以对这一部分不了解。假设环境已经配置好了,想要进行分布式计算,一般写一个主函数,进行分布式计算的资源分配下发任务。
举例来说,如果要调用FunA和FunB(一般FunA和FunB是相互独立的),并且FunA要调用目录下的sub_floderA文件夹,FunB要调用目录下的sub_floderB文件夹,则把FunA、FUnB、sub_floderA、sub_floderB都拷贝到主控机的matlab的工作目录下,在这个目录下再建立main.m(当然也可以是其他名字),假设当前控制机的matlab的工作目录是 ”/hpc/home/myTask“,则main.m应如所示:
clear;clc;
sched = findResource();
%findResource默认可以无参,让matlab自己去找可用的资源,但最好自己分配一下,
%也可以调用已有的配置文件
job=createJob(sched);
%将当前工作所需要的目录及文件拷贝至各个结点,如果想调用自定义的函数,这一步几乎是必须的。
set(job,'FileDependencies',{'/hpc/home/myTask/sub_floderA' '/hpc/home/myTask/sub_floderB' 'Fun_A.m' 'Fun_B.m'});
%也可以用下面这个将所有需要的路径共享给各个计算结点,但我用这个没有成功,好像要先设置文件共享才行
%set(job,'pathDependencies',{'...' '...'})
%用FileDependencies的方法虽然麻烦一点,但拷贝的方法可能会稳定些
job,%这里可以让job显示一下,以确认工作目录等是否都分配正确了。
createTask(job,@FunA,2,{});%2表示FunA的返回参数个数,{}里是FunA的参数,如果无参,就写{}
createTask(job,@FunB,3,{para1,para2}); %3表示FunB的返回参数个数,{}里是FunB的参数
submit(job);
waitForState(job,'finished');
results = getAllOutputArguments(job);
save('result.mat','results');
%因为分布式计算一般都是远程登录控制机,所以最好把结果保存下来,再用FTP等工具传回本地查看。
%还有一个好的习惯是FunA和FunB中也写下save语句,将计算结果保存下来,
%此时的save应该是控制节点%的绝对地址,
%如要在FunA中写下保存FunA的运算结果,则应写如下语句:
%save('/hpc/home/myTask/resultOfFunA.mat','result');
%将结果保存到控制节点的工作目录下
destroy(job);
此时,执行main,便可在分布环境下执行FunA和FunB。