Matlab Parallel(Distributed)Computing Toolbox
简要介绍
工程师和科学家们面临着用更少的时间建立复杂系统模型的需求,他们使用分布式和并行计算来解决高性能计算的问题。这些分布式的环境由多处理器和多核计算机来实现。
Mathworks公司开发的分布式计算工具箱可以在多处理器计算环境中使用 MATLAB 和 Simulink (根据help 文档分布计算对 simulink是不完全支持的)解决计算、数据密集型问题。可以使用该工具箱解决通过装配多个处理器包含几个单独工作单位或单个大型计算的问题。这些处理器可以驻留在一个多处理器计算机上,或者,当工具箱配合MATLAB 分布式计算引擎时,驻留在计算机集群上。
该工具箱提供高级构造,如并行回路、并行算法、基于 MPI 的函数,以及用于作业和任务管理的低级构造。并行命令窗口提供熟悉的用于开发并行应用程序的 MATLAB 交互式环境。也能够在批处理环境中脱机执行分布式和并行应用程序。
Matlab的做法是这样的:在每台参与计算的计算机中启动一个叫Matlab Distributed Computing Engine(mdce)( 分布式计算引擎(服务器))的服务,该服务能启动参与计算的worker的Matlab session和管理各台计算机workers的job manager。Job manager对workers进行管理,给workers分配计算任务,接收workers计算后的结果。而你本人就是client,你要把你的工作分解为多个任务,然后把任务给job manager。job manager就会根据workers的多少和空闲情况,适当地把任务分配给workers去做。workers完成任务后,会把结果返回给job manager。当所有workers都完成任务后,你,即是client,便可以从job manager里取回结果。(其实job manager也可以把指定的 task给特定的worker(在matlab help 文档里也说成是lab))
作业(Job)是在MATLAB中大量的操作运算。一个作业可以分解不同的部分称为任务(Task),客户可以决定如何更好的划分任务,各任务可以相同也可以不同。MALAB中定义并建立作业及其任务的会话(Session)被称为客户端会话,通常这是在你用来编写程序那台机器上进行的。客户端用并行计算工具箱来定义和建立作业及其任务,MDCE通过计算各个任务来执行作业并负责把结果返回客户端。作业管理器(Job Manager)是MDCE的一个组成部分,用来协调各个作业及其任务在各个woker上的执行。
该系统中有三种角色,分别为提交Job(并将Job分割为多个Tasks)的Client,管理Job运行的Job Manager(JM)和进行具体运算的Worker。 Client就是编写程序的机器,可以是任何一台局域网内的机器,Client将写好的程序作为Job提交到JM,然后JM(也可以是任何一台局域网内的机器)按接收到Job的顺序执行这些Job。每个Worker从JM那里接收Task并执行,完成之后将结果返回给JM,接下来接收下一个Task。当前正在运行的Job分配完成之后,JM则开始下一Job的分配。
在一个分布计算系统中通常包括多个Wroker,以便同时执行多个Task,以提高速度。对Client来说,具体哪一个Task由哪一个Worker执行是透明的。也就是说,使用者只需关心如何将Job提交到JM和从JM取回运算结果,而无需管理具体的任务调度。
分布式计算引擎(MDCE)安装及相关操作:
1、首先第一步要做的,就是令每台要参与计算的计算机组成局域网。
2、在局域网的计算机中安装Matlab Distributed Computing Engine(mdce)服务。cmd
到命令行窗口,进入MATLAB\R20xx\toolbox\distcomp\bin目录,运行mdce install命令安装mdce服务。(建议把cmd copy到该目录下,这样以后的操作就不用老cd了,cmd path:\WINDOWS\system 32)
3、去控制台->管理工具->服务,查看Matlab Distributed Computing Engine.如果存在说明安装成功。
4、在start jobmanager之前一定要先start mdce,即在cmd中输入:start mdce。
环境搭建好后,可以利用图形界面admincenter.bat配置hosts,mjs,works.
分布式计算程序样例:
任务级并行:
1) 搜索JM,创建对象: findResource()
% MyJobManager 表示JM(MJS)的名字
% MyJMhost 表示运行该JM(MJS)的主机名或IP地址 (可有可无)
jm = findResource('scheduler','type','jobmanager','Name','MyJobManager','LookupURL','MyJMhost')
(利用findResource() 可以找到局域网所有的MJS,语句:all_managers = findResource('scheduler','type','jobmanager') )
2) 创建Job :createJob()
job = createJob(jm) ; 在名为jm的MJS上创建了一个名为job的Job
3) 分配Task: createTask()
在创建Job之后,使用createTask函数为该Job创建Task。
Task定义了Worker所要执行的函数。
在本例中,每个Task将会生成3*3的随机数矩阵。
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
createTask(job, @rand, 1, {3,3});
4) 提交工作: submit()
使用submit函数提交Job到Job Manager,Job Manager将Task分配到已注册的Worker上并开始执行。
submit(job);
5) 等待: waitForState() waitForState(job, 'finished');
6) 取回计算结果: getAllOutputArguments()
计算结果存储在每个任务对象的OutputArguments属性中,使用getAllOutputArguments取回所有的结果,运算结果以cell数组的形式返回。
results = getAllOutputArguments(job);
/**完整程序:
clear all;
% 寻找资源。
jm = findResource('scheduler', 'type', 'jobmanager', 'name', 'myJM', 'LookupURL', '192.168.0.100');
% 使用刚才找到的资源建立一个工作
job = createJob(jm);
% 设置该工作的文件关联,让所有workers都可以找到原程序文件,需要在Client上设置共享文件夹。
set(job, 'PathDependencies', {'\\192.168.0.101\matlab_code\', '/mnt/'})
% 另一种方法,把用到的原程序文件传给所有workers。
% set(job, 'FileDependencies', {'hm.m'}); N = 5; M = 4;
% 建立4个任务,每任务都是算hp(M, N)。
createTask(job, @hp, 1, {{M, N}, {M, N}, {M, N}, {M, N}});
% 提交工作给jobmanager。
submit(job)
% 等待所有workers都把任务做完。
waitForState(job, 'finished')
% 取出计算结果。
results = getAllOutputArguments(job);
% 销毁Job,释放资源
destroy(job);
注意事项:
1.远程连接时配置防火墙太麻烦可以索性关掉防火墙,否则容易出现 [SC] OpenSCManager 失败 5: 错误