现在的位置: 首页 > 综合 > 正文

Matlab 并行计算工具箱

2018年10月27日 ⁄ 综合 ⁄ 共 6670字 ⁄ 字号 评论关闭

 Matlab 并行计算工具箱

(一)Matlab分布式和并行编程

Distributed and Parallel Programming

11/29/2008 10:31:15 AM

Today's engineers and scientists, faced with the demand to model increasingly complex systems in less time, are pursuing distributed and parallel solutions in high-performance computing (HPC) distributed environments made out of commercial off-the-shelf (COTS) multiprocessor, multicore computers.

 

工程师和科学家们面临着用更少的时间建立复杂系统模型的需求,他们使用分布式和并行计算来解决高性能计算的问题。这些分布式的环境由多处理器和多核计算机来实现。
并行计算工具箱和Matlab分布式计算服务器允许你在Matlab中建模和开发分布式和并行应用,并在多核处理器和多核计算机中执行他们,而且并不离开你的及时开发环境。用这种方法来执行模型,你可以解决更大的问题,覆盖更多的仿真情景并减少桌面资源。
开发分布式应用
分布式应用或者并行应用,包含独立的任务,它可以独立的执行,而并不需要任务间的通信。对于分布式应用来说,你可以使用分布式计算工具箱中的函数来为你的应用定制独立的计算任务,它可以被收集到分布式的任务中并集群的提交执行。
开发并行应用
并行应用包含相互依存的任务,它在应用执行的过程中交换数据。工具箱和引擎包含基于MPI标准的函数,它支持Matlab开发并行应用中的通信。然而,使用这些基于MPI功能的函数包含跟踪消息传递的详细信息,像在处理器和控制处理器间的通信。
并行计算工具箱用两种重要的方式简化了并行应用的开发。首先,工具箱支持分布式矩阵,它在对待分布式处理器的数据时,把它作为一个单独的矩阵,而不是作为在不同处理器上的独立的矩阵。通过分布式矩阵,研究人员可以直接的在矩阵中展示操作,而并不需要处理复杂的信息传递。工具箱为分布式矩阵提供了超过150个的Matlab函数,包括基于ScaLAPACK的线性算数。第二,工具箱包含新的交换的并行执行模型。从而,研究人员可以在许多个处理器和内核中,并行同时的工作。这个模式可用于交互的开发、设计开发和解决问题。
支持调度程序
对于任务调度工作,你可以或者使用MathWorks的工具经理,这个调度程序。它配置在引擎中或者第三方的调度程序。这个工具箱和引擎支持所有的第三方的调度程序,像LSF平台,Microsoft Windows Compute Cluster Server, PBS, 和 Sun Grid Engine。或者直接的,或者通过基因调度接口来实现。这些资源包括安装脚本,在线技术解决和供应商提供的一体化脚本。这些都可以帮助你结合工具箱和引擎到你已经存在的计算环境中。http://www.matlab-download.cn/Article/D-P.html

(二)Matlab分布式计算工具箱使用指南(转载)

使用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内核中处理更大的数据集合.有超过150MATLAB函数支持分布式数组,包括一些基于 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下使用并行数值积分在4labs计算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)

抱歉!评论已关闭.