Matlab 并行计算工具箱
(一)Matlab分布式和并行编程
Distributed and Parallel Programming
11/29/2008 10:31:15 AM
(二)Matlab分布式计算工具箱使用指南(转载)
1、分布式计算工具箱(Distributed Computing Toolbox)
2、Matlab分布计算引擎MDCE(Matlab Distributed Computer Engine)
MDCE主要用于执行Clinet Session中定义的job和task
一、安装MDCE
MDCE安装在D:/Program Files/MATLAB/R2008a/toolbox/distcomp/bin目录下:
在Matlab的command windows中执行
代码:
mdce install %安装引擎
mdce start %启动引擎
执行上面两条命令后,分布式计算引擎服务程序就安装完毕了。MDCE就是一个服务进程,在使用MDCE 之前需要首先启动它。
二、启动一个Job Manager
代码:
startjobmanager -name matlabsky -v %启动一个名为matlabsky的作业管理进程
jm = findResource('scheduler','type','jobmanager', 'Name', 'matlabsky'); %找出PC上有效的分布计算资源
三、启动Worker
代码:
startworker -name worker1
out = findResource('worker')
waitForState(job, 'finished',1000)
jm=findResource('scheduler','type','jobmanager','name','default_jobmanager');
四、分布式计算工具箱示例
在运行示例之前,必须先安装 MDCE,然后启动一个Job Manager 和若干个 Worker,并且在Job Manager中注册Worker。要查看MDCE进程的状态,可以用nodestatus.bat批处理文件来查看。如果在Job Manager中没有注册Worker,那么Job Manager就没有办法把任务分配给Worker计算,当调用waitForState(job, 'finished')命令时,就会发生死锁。
1、Programming a Basic Job with a Job Manager
代码:
jm=findResource('scheduler','type','jobmanager','name','ccy');
j = createJob(jm);
createTask(j, @sum, 1, {[1 1]});
createTask(j, @sum, 1, {[2 2]});
createTask(j, @sum, 1, {[3 3]});
submit(j);
waitForState(j)
results = getAllOutputArguments(j)
destroy(j)
2、使用分布式计算工具箱来计算Pi的值
代码:
jm=findResource('scheduler','type','jobmanager','name','ccy');
j = createJob(jm);
fun=inline('4./(1+x.^2)','x');
worker_number=20;
for i=1:worker_number
createTask(j,@quad,1,{fun,(i-1)/worker_number,i/worker_number});
end
submit(j);
waitForState(j);
results = getAllOutputArguments(j);
val_pi=0;
for i=1:worker_number
val_pi=val_pi+results{i};
end
destroy(j);
str=sprintf('PI=%e,Error=%e',val_pi,val_pi-pi);
disp(str);
val_pi
(三)MATLAB中的并行程序开发
3.3.3.1编写分布式应用程序
分布式应用程序适用于解决可以被分割为在几个处理器上独立执行的完全独立工作或任务单的问题.如 Monte Carlo 模拟和其它粗粒(coarse-grained)或易并行(embarrassingly parallel)应用程序。分布式计算工具箱提供的功能可以将应用程序分割为能在多个 worker(从客户会话中单独运行的 MATLAB 计算引擎)上独立执行的任务。在一个应用程序中,这些任务可以包含一个或多个 MATLAB 功能,或涵盖多组参数的完整 Simulink 模型。
分布式应用程序的工作流程一般是:
1.寻找一个作业管理器(或者作业调度程序(scheduler))——你的网络上可能有一个或多个作业管理器(但是通常只有一个scheduler);用来寻找一个作业管理器或者作业调度程序的函数findResource()在当前MATLAB内核中创建一个对象,用来表示将要运行作业的作业管理器或者作业调度程序.
2.创建一个作业——创建作业用以产生一个任务集合.作业存在于作业管理器中,而一个在本地MATLAB内核中的作业对象代表相应的作业.
3.创建任务——创建任务添加到作业中去,可以用本地MATLAB内核中的任务对象表示作业中的每一个任务.
4.提交作业到待执行的任务队列——当作业的每一个任务都被定义之后,将它提交到作业管理器或者作业调度程序.它们将任务分配到各个节点执行.当各节点的所有任务执行完毕后,作业将被标记为完成状态.
5.返还作业结果
6.销毁作业——当所有作业完成,结果收集回来后,需要销毁作业以释放内存.
下面这段程序创建了三个独立的任务,产生3个不同维度的随机数矩阵.
% 寻找一个作业管理器并创建一个作业
jm = findResource(‘scheduler’, ‘type’, ‘jobmanager’);
job = createJob(jm);
% 为作业创建独立的任务
task1 = createTask(job, @rand, 1, {1});
task2 = createTask(job, @rand, 1, {2});
task3 = createTask(job, @rand, 1, {3});
% 提交任务,等待完成
submit(job);
waitForState(job, ‘finished’);
%得到结果并显示
results = getAllOutputArguments(job);
for i = 1 : 3
disp(results{i})
end
3.3.3.2设计开发并行应用程序
并行应用程序适用于解决那些可以被分割为在整个应用程序生命周期中的特定时间交换数据和同步化的独立任务的问题。分布式计算工具箱支持用于设计开发并行应用程序的特定方法:使用并行 for循环和分布式数组,或使用消息传递构造。这些构造使得我们可以对并行应用程序有很好的控制。可以将任何串行 MATLAB 算法转换成使用这些构造的并行算法。但是,单独 Simulink 模型不能被分割为跨多个 worker 并行运行。
分布式计算工具箱支持分布式数组,这些数组是在所有参与并行计算的所有 worker 中分配的任何数据类型的矩阵。并行算法配合分布式数组使用,可以使执行数值运算,如矩阵乘法,分解并直接在分布式数组上转换。工具箱中提供了 150 多个用于分布式数组的重载 MATLAB 函数,包括基于 ScaLAPACK 的线性代数实例。
在解释分布式数组之前,先说明一个专用词汇:lab.当MATLAB工作进程开始工作时,它们在默认情况下是独立工作,也可以相互通信协同工作.这时他们被称为labs. 分布式数组是存储一组labs中分割后各部分数据的特殊数组. 你可以进行各种操作,如变换,直接分解分布式阵列, 就像使用常用数组一样.
因为分布式数组在多个labs中存储数据,所以你可以在一个MATLAB内核中处理更大的数据集合.有超过150个MATLAB函数支持分布式数组,包括一些基于 ScaLAPACK的函数, 使得我们可以快速的设计开发并行程序,而不需要去处理低层次的消息传递的细节问题.
分布式数组的创建有多种方法,直接使用创建函数如rand, ones, zeros, 和 true; 并置变量数组 (在每个lab中有相同的名字,却有不同的值,如labindex); 或者使用分布式复制数组(在所有labs中有相同的名字和值). 你可以控制这些数组中的值按照何种方式分布到不同的lab中去.
下面的MATLAB M-code 例子演示如何产生分布式数组.
%% 直接使用创建函数
% 分布式全0矩阵
z = zeros(100, 100, darray());
%按列分割的分布式稀疏随机矩阵
sr = sprand(100, 100, 0.1, darray('1d', 2))
%% 使用变量数组
% L是一个在不同lab中有不同的值的变量数组
L = [1:250; 251:500; 501:750; 751:1000] + 250 * (labindex - 1);
%% Distribute a replicated array
%A在所有lab中都一样
A = [1:250; 251:500; 501:750; 751:1000];
总的来说,只需要很少的改动就可以将串行程序转换成并行程序. 程序处理分布式数组与处理非分布式数组相同。通过使用分布式数组和相关函数,将串行应用程序转换为并行应用程序的过程被简化了
该工具箱也支持并行 for 循环,该循环自动将循环体中包含的工作处理分配给参与并行计算的 worker。唯一要求是,在一个并行循环重复期间执行的计算独立于在其它重复期间执行的计算。在循环执行过程中不能在labs之间有通信.可以在一个并行for循环中使用分布式数组,只要labs之间不相互使用对方的数据就可以了.下面给出了一个使用parfor处理几个类似数据文件的例子.
parfor ctr = 1 : numDataSets
% 每个lab处理数据集合中的一个子集
load(['//central/myData/dataSet' int2str(ctr) '.mat'])
results(ctr) = processDataSet(ctr);
end
并行for 循环可以对分布式数组使用同样的基数,我们甚至可以分布式数组向量作为循环变量,控制在每一个lab上执行块的大小.下面是一个小例子.
在parfor中使用不平均的分布式向量作为循环变量
numDataSets = 12;
%%%假定 numlabs == 4 %%%
distVector = distribute(1:numDataSets, darray('1d', 2, [2 3 3 4]));
parfor ctr = distVector
% 现在每个lab处理一个指定的数据集合的子集.
% lab 1 处理 1:2, lab 2 3:5, lab 3 6:8 lab 4处理9:12
load(['//central/myData/dataSet' int2str(ctr) '.mat'])
results(ctr) = processDataSet(ctr);
End
3.3.3.3交互式开发环境Pmode
分布式计算工具箱延伸了 MATLAB 交互式环境,使用熟悉的 MATLAB 环境原型开发分布式和并行应用程序。在并行命令窗口中,我们可以像在 MATLAB 会话中一样,交互式处理计算机集群。该工具箱使应用程序原型能够使用一个工具箱许可证在工作站上运行最多四个本地 worker。
可以在交互式环境中配合所支持的分布式阵列函数和基于 MPI 的函数,使用任何 MATLAB 函数来开发多处理器解决方案。可以在此环境中执行单独的命令和函数。来自所有处理器中的结果立即可用,就像在任何 MATLAB 交互式会话中一样,从而可以在每一步中跟踪多处理器系统上的应用程序行为。这会使调试过程原型开发更快、对其控制更强。
在这种模式下,MATLAB客户端直接与参与交互式内核的labs相互作用。在pmode命令行提示符下的命令被立即在所有labs上执行,结果直接返回到客户端内核中去.
在这种模式下,你可以使用分布式数组(和相关函数)和MPI函数. 事实上,在命令提示符下键入的命令可以打包到一个M文件中去作为一个并行作业提交.
你可以将M文件中定义了并行任务的单独执行.这样可以监视每一步的执行结果和labs之间的交互.使程序的调试更加容易
下面我们给出一个在pmode下使用并行数值积分在4个labs计算PI的示例,每个lab的输出可以即时显示.
P>> F = @(x) 4./(1 + x.^2)
P>> a = (labindex - 1)/numlabs;
P>> b = labindex/numlabs;
P>> [a, b]
P>> myIntegral = quadl(F, a, b)
P>> %Add local results across all labs
P>> piApprox = gplus(myIntegral)
P>> %Check accuracy
P>> abs(pi - piApprox)