Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1

摘要:
3 MATLAB2009之后,并行计算工具箱和并行计算服务退出。通过PCT和DCS,用户可以实现基于多核平台、多处理器平台和集群平台的多个并行计算任务。除了支持上述通用功能外,PCT还增加了对GPU单元的支持。现在来看彼此已经太晚了:用parfor并行化for循环。在编程中,使计算量最小化的代码总是一个循环。7 parpool命令在不启动并行池的情况下配置并行计算池8。直接执行parfor程序不起作用。因为MATLAB是一种解释性语言,它封装了并行计算的细节。

1  更高级的算法牵扯到更多重的循环和复杂的计算,尤其是现在人工智能的算法尤其如此。有些历史知识的人能够了解到,人工智能的很多基本算法其实近百年之前就有了,但是当时的计算机技术达不到去实现这些算法的要求,因此当今计算机的技术和当时已经不是在一个量级上面,因此人工智能等方案才有被重新提上日程,获得飞速的发展。也就是说,当人的思想超越当今的技术的时候我们只能等待,但是当当今的技术已经能够赶上人的思想,我们将会无所不能。

2  这一部分的内容主要是充分调用计算机的性能甚至是调用n台计算机形成集群形式使得算法能够快速的运算和提升整个程序的运行效能。

3  MATLAB2009之后,退出了并行计算工具箱(Parallel Computing Toolbox,PCT)和并行计算服务(Distibuted Computing Server,DCS),通过PCT和DCS用户可以实现基于多核平台、多处理器平台和集群平台的多种并行计算任务。PCT除了支持通用的上述功能之外还增加了GPU单元的支持。在MATLAB中,可以通过PCT、MEX文件等多种方式利用GPU来完成数据处理功能。

  首先要考虑的几个问题:

  1)并行计算的平台:

  单计算机MATLAB支持8个worker(2010b)版本、如果需要多台计算机组成集群,需要利用PCT和DCS共同完成,如果需要GPU运算,利用PCT、MEX文件技术来完成。

  2)并行计算的复杂程度:

  当然MATLAB来进行并行计算省去了很多繁琐的底层工作,相对快捷和简单。

  比如利用parfor循环,可以对for循环进行并行处理,利用SPMD可以对单个程序多组数据情况进行并行处理。这里要尽量选择MATLAB并行计算工具箱内置的并行结构。

  3)并行计算的数据通信问题:

  并行计算的两个目的:第一是提高计算效率,第二是提高计算机的利用率。第一个问题比较绒里理解就是比如单个问题CPU计算需要10个小时,那么采用10个CPU进行计算可能只需要1.5小时就可以完成。

相见恨晚的功能:profiler 代码分析器

4  profiler viewer,就会弹出代码分析器的窗口,然后再窗口输入想要测试的脚步等。就能得出段脚步那些地方用时最多

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第1张

  可以据此来修正代码,改进代码

5  提升代码运算效率在代码编写上注意的几个问题:

  1)尽量用向量化来替代for和while循环的运算。

  Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第2张Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第3张

  采用向量化,对于大型的运算,时间要快于for循环或者while循环。

   2)还有一些经过优化的向量运算函数:

  all,判断数值阵列是否全部非零

  any,判断数值阵列是否有非零元素

  reshape,变化数值阵列的各维元素数据

  find,返回非零元素在阵列中的位置和其值

  sort,将数组按照升序排列

  sum,求数组的和

  repmat,扩展阵列

  is等函数。。。。 

相见恨晚的功能:利用parfor对for循环进行并行(PCT工具箱中的函数)

 6  在程序设计中,往往最小化计算量的代码都是循环。循环分为两种:一种是固定次数的循环,另一种叫非固定次数的循环(while),在MATLAB程序中,提高循环计算效率往往是提高程序计算效率的关键。对于固定次数的循环,一般有两种类型:一种是循环次数较大,单词循环的计算量较小;另一种是循环次数较小,单词循环计算量较大。采用MATLAB提供的parfor关键字就可以对这两种类型的循环实现多核或多处理器并行执行。

7  parpool 命令配置并行计算池(在2010版本之前的命令是matlabpool,后面版本都用这个命令来替代原先的命令)

8  不启动并行池,直接执行parfor程序不起作用。

9  当新欢次数设为100 000时,parfor执行的时间反而远远高于for循环的执行时间。这说明当循环次数较小的时候,通过parfor关键字对for循环体进行并行的效率很低。原因比较复杂,这里试着增加循环次数,观察parfor关键字对for循环体进行的效率变化,随着循环次数的增加,parfor关键字对for循环并行金酸的效率开始提高。在实际应用中,如果根据循环次数选择parfor关键字或者选择for关键字完成简单循环计算?由于MATLAB是解释型语言,而且已经封装了对选好进行并行计算的细节。很难通过分析和推导得到比较准确的结果。另外,不同的计算机对应的计算单元有很大差异,例如CPU个数和类型等,因此在parfor循环并行计算分析中,采用测试程序进行测试是十分必要的,这一点在前面已经得到充分的说明。这里,仍然沿用绘制并执行时间曲线的方法进行分析,通过测试程序绘制parfor的执行时间和for的执行时间随时间次数变化的曲线,人后对比两个时间曲线分析确定parfor关键字执行效率高于for关键字的临界点,即临街循环次数。

10  parfor的正确用法

  1)简约变量只能出现在简约赋值操作的表达式中

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第4张

  2) 在同一个parfor循环内,对简约变量的操作一致

 Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第5张

  3)如果简约变量的操作是相乘或者链接【】,变量X或出在操作符前面,或处在操作符后面,但是X的位置必须恒定不变。

  4)简约变量赋值应当满足结合律和交换律

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1第6张

11  parfor程序设计需要考虑的其他问题

  1)变量名称(函数优先)

  在MATLAB parfor循环代码块中,如果变量在循环之外没有定义或初始化,则MATLAB采用函数优先的原则,即MATLAB假定次变量为一函数名。

 比如执行:

clear
N = 100
a = 1
parfor kk = 1:N
a = a+f(kk)
end

会报错。

  2)显式使用变量

  3)parfor中使用函数句柄

  在parfor中调用函数句柄时,需要注意只能采用feval函数调用。如果在parfor循环中使用函数句柄,则代码MATLAB提示报错。

比如只能执行

N = 10

B = @sin;

parfor ii = 1:100

  A2(ii) = feval(B,ii);

end

   4)在parfor中调用递归函数

相见恨晚的功能:parpool常用的命令

1)parpool('local',2); % 在已知worker数列的情况下,打开几个worker

2)parpool;  % 在默认条件下启动并行池,有几个worker打开几个workder

3)c = parcluster % 用句柄的形式条用并行池

>> c = parcluster
c = 
 Local Cluster

    Properties: 

                          Profile: local
                         Modified: false
                             Host: PC-201709010031
                       NumWorkers: 2
                       NumThreads: 1

               JobStorageLocation: C:UsersAdministratorAppDataRoamingMathWorksMATLABlocal_cluster_jobsR2016b
 RequiresMathWorksHostedLicensing: false

    Associated Jobs: 

                   Number Pending: 0
                    Number Queued: 0
                   Number Running: 0
                  Number Finished: 0
>> parpool(c)
Starting parallel pool (parpool) using the 'local' profile ... 

4)poolobj = parpool;

    delete(poolobj) %删除并行池

5)启动和关闭并行池的一组组合方式

>> poolobj = parpool('local',2);
Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers.
>> delete(poolobj)
Parallel pool using the 'local' profile is shutting down.

>> poolobj = parpool;  % 默认打开全部worker
Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers.
>> delete(poolobj)
Parallel pool using the 'local' profile is shutting down.

  其中注意到,句柄poolobj有很多参数,当然这个也可以在MATLAB预设里面找到相关设置。但是这里对这些设置都是写啥东西,进行一下解释。当然可以用poolobj.内容,进行修改。

NumWorkers  组成并行池的workder个数

AttachedFiles 被发送到workers的文件和文件夹

Idle Timeout  闲置的并行池关闭前分钟表示的时间范围

Cluster 群集启动池,指定为群集对象 因为我们可以用集群化并行运算,如果没有集群,内容会显示本地

Connected 并行池中运行的族群

FevalQueue 要在并行池中运行FevalFutures队列

SpmdEnabled  是否可以运行SPMD代码

 相见恨晚的功能:SPMD并行结构

12  SPMD(Single Program,Multiple Data)是MATLAB支持的另外一种并行结构。其对应的使用方式即相同程序、不同数据。SPMD并行结构比parfor并行解耦股更加灵活,但也引入更加复杂的数据类型和操作方法。

13  假定用户有一批数据文件需要处理,而且每个文件的处理程序相同,在这种情况下可应用SPMD并行结构。在SPMD并行结构中,用户可以获得每个worker的编号labindex和总的worker数据numlabs。这两项信息在parfor并行结构中是无法获取的。通过labindex和numlabs用户可以控制每个worker执行的计算任务。因此SPMD并行结构给用户提供了更大的自由度,用户可以控制更多的并行计算的细节。

14  SPMD并行结构需要依赖MATLAB并行计算池执行,因此SPMD并行结构执行之前,用户必须配置和启动MATLAB并行计算池。和parfor一样,用户既可以启动本地并行计算池,也可以启动集群并行计算池。本地并行计算池管理的workder与MATLAB client在同一计算节点中执行,集群并行计算池管理的worker与MATLAB client一般不再同一计算节点中执行。

15  SPMD并行结构通过spmd关键字启动,如下:

spmd
    a = rand(labindex);
end

>> a
a =
   Lab 1: class = double, size = [1  1]
   Lab 2: class = double, size = [2  2]
>> class(a)
ans =
Composite

  可以看出a的形式比较奇怪,并不属于数值阵列,而是一种称之为composite的变量,关于composite变量,在后面会有详细结构。读者暂时可以认为a是一个元组阵列。

  在MATLAB并行程序设计中,worker有时也被成为lab。二者区别在于,lab是一个中特殊的worker,各个lab之间可以相互通信和同步。而各个worker之间一般是独立的。执行SPMD的工作单元成为lab,这也是labindex和numlabs命名的由来。

16  SPMD的使用方法

  spmd

    需要并行的主体

  end

免责声明:文章转载自《Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法前端chrome浏览器调试总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

《C#并发编程经典实例》笔记

1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期研读了不少书籍,其中《C#并发编程经典实例》给我的印象还是比较深刻的。当然,这可能是由于近段日子看的书大多嘴炮大于实际,如《Head First设计...

Jsoup爬取数据设置代理IP

最近,使用Jsoup爬取数据发现有的网站当你用自己的电脑爬取数据,次数多的时候就会发现本地的电脑就会连不上,原因是本地IP被限制或者拦截了。 因此,自己也找了一些资料,发现爬取数据的时候可以设置代理Ip,这样就不会发生本地Ip被封掉的危险了。代码如下:   //设置代理Ip System. getProperties(). setProperty("...

自然语言处理(nlp)比计算机视觉(cv)发展缓慢,而且更难!

https://mp.weixin.qq.com/s/kWw0xce4kdCx62AflY6AzQ 1.抢跑的nlp nlp发展的历史非常早,因为人从计算机发明开始,就有对语言处理的需求。各种字符串算法都贯穿于计算机的发展历史中。伟大的乔姆斯基提出了生成文法,人类拥有的处理语言的最基本框架,自动机(正则表达式),随机上下文无关分析树,字符串匹配算法KMP,...

【Ubuntu】无法挂载磁盘

我的电脑分了三个分区,A,B,C,其中A和B是Windows盘,C是ubuntu系统盘 某日发现A ,B盘没法进入了,在文件管理器中点一下,没有反应。于是右击盘符,点击挂载,跳出错误信息: (划重点) 于是输入: sudo ntfsfix /dev/nvme0n1p3   然后可以访问了。 于是同样方法对于装Windows的系统盘,但是不成功! 上网查了...

React之JSX循环遍历方法对比

JSX支持遍历语法,如下 除了上面数组遍历方式,还有另一种,如下所示 结合for循环(外部) 注意: 主流循环写法是 map,jsx里面不能用for循环,因为for循环不是表达式。可以用Array::map方法,注意给返回的每一个组件设置一个唯一的key。 ....

【python系统学习09】while循环

while循环和for一样,while也是实现循环代码的一种。 伪代码 先来看一段while的伪代码,了解下其语法格式。 1#伪代码2while条件语句:3条件成立执行的[while子句],位于缩进后边4else:5循环完毕执行的代码块,位于缩进后边 学过js的能从上边的代码中看出来,这和js的while基本无差。 将代码直译过来都是:当XXX条件成立的...