Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题

摘要:
2) parpool;%这是直接打开并行池的方法。第二步:parfor函数的问题:1)许多简单的低纬度操作。建议您只使用普通函数和关键字。parfor函数无法提高性能。p=parpool;ticn=200;A=500;a=零;parfori=1:na=最大值;Endtocdelete当然,在这个循环中可以有不同的计算队列。我们将这个队列封装成一个函数,如下所示:函数[a]=sample=max;然后用parpool调用End,如下所示:p=parpool;清楚的ticn=200;A=500;a=零;parfori=1:nb=样本;a=b;endclearb;tocdelete;时间已过28.838599秒。MATLAB中并行计算的有限改进与MATLAB语言的效率、处理的数据量和计算复杂性有关。

1  我们知道MATLAB支持并行运行一般有四种模式:

  第一种模式:本机调用多核CPU性能并行运算

  第二种模式:本机调用GPU性能并行运算

  第三种模式:多计算机组成集群,调用集群CPU性能并行运算

  第四种模式:运用MATLAB提供的云计算服务。

2  在第一种并行运算模式中

  标准模式为:

      第一步:打开并行池parpool

      第二步:parfor等相关PCT,并行计算工具箱中函数

      第三步:关闭并行池

3  第一步:打开并行池的方式:

  1)p = parpool('local',2);   % 在知道有几个本地核的情况下,选择调用几个核进行并行运算。

  2)parpool; % 这是直接打开并行池的方式。

  备注:建议采用第一种,方便关闭和更改参数。

  

  第二步:parfor函数的问题

  1)很多简单的低纬度运算,建议只需要用普通函数和关键字即可,用parfor函数进行运算并不能提升性能。

  2)MATLAB利用多核心的计算能力来加速计算时非常有必要的,因为目前所有的电脑最少都双核心了。

  3)循环并行使用parfor循环代替for循环,但是很多时候parfor很不好用,当parfor循环体内的代码比较多时,非常不容易满足循环条件而失败。因此我们首先要分析代码,另一种方式用profiler打开代码分析器来分析代码那一部分耗时较大,进行代码分析。

  3)通用格式

     parfor ss = 1:100

     XXX

     ......

       ......

     end

  4)通用并行计算模板:其基本思路就是将循环体内代码打包为函数!

    parfor ss=1:100
    func(ss,...,...);
    end

    函数如下所示:
    function func(ss,...,...)
    xxx
    .....
    .....
    end

  备注:该函数不应该有返回值,当parfor循环体内计算结果需要返回主函数时(绝大多数情况是这样的),那么将结果在循环体内保存为文件,文件名与循环变量ss有关。当parfor的并行运行完之后,将保存的临时文件读取进来即可,保存和读取计算结果相比于大型的计算耗时来讲应该小很多,从而体现出并行的优势。所提供的该方法可以用于任何一维、二维或者多维循环的加速计算,采用这种方法,规避了学习parofr规则的所有难点,非常具有通用性。

  第三步:删除并行池参数关闭

  delete(p)

  

  举个例子:比如有这么一段并行计算代码,其中绿色标注的位置为循环体。

p = parpool('local',2);
tic n = 200; A = 500; a = zeros(n); parfor i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
delete(p)

  当然这个循环体内可以有不同的计算队列,我们把这个队列封装成为一个函数,如下:

function [a] = sample(A)
a = max(abs(eig(rand(A))));
end

  然后再用parpool调用,如下:

p = parpool('local',2);
clear;
tic
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
    b = sample(A);
    a(i) = b;
end
clear b;
toc
delete(p);
时间已过 28.838599 秒。

  对比原先的代码:

tic
n = 200;
A = 500;
a = zeros(n);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc
时间已过 42.570194 秒。

4  MATLAB并行计算的提升有限和MATLAB语言的效率有关,并且和处理的数据量和计算复杂度有关。

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

上篇Windows Server 2012 和Windows 8 中的PowerShell ISE初学者:ACE学习下篇

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

相关文章

用Python实现多核心并行计算

平常写的程序,无论是单线程还是多线程,大多只有一个进程,而且只能在一个核心里工作。所以很多应用程序即使正在满载运行,在任务管理器中CPU使用量还是只有50%(双核CPU)或25%(四核CPU) 如果能让一个程序自己建立出多个进程,并且让它们并行运行,那么就可以在不同cpu核心上同时运行,进而实现并行计算啦。 Python的并行计算就是这么做的。 之前的理解...

matlab中plot使用方法

MATLAB有非常强的图形功能,能够方便地实现数据的视觉化。强大的计算功能与图形功能相结合为MATLAB在科学技术和教学方面的应用提供了更加广阔的天地。以下着重介绍二维图形的画法,对三维图形仅仅作简单叙述。 5.1 二维图形的绘制 5.1.1 基本形式 二维图形的绘制是MATLAB语言图形处理的基础,MATLAB最经常使用的画二维图形的命令是p...

【MATLAB】matlab 中去掉向量中重复数字并且不改变原顺序

1、首先我们可以使用 unique 去掉向量中的重复数字。 a = [374 3 375 41 1 415 3 208 41 373 415 1 208 2 373 206 2]; b = unique(a); 其中: b = [1 2 3 41 206 208 373 374 375 415] 我们发现,matlab 中的 unique 函数对去重后...

MATLAB

总原则:能用向量矩阵解决的就不用for循环。 1.匿名函数  @定义一个函数或变量,用括号里的字母作为变量名字。 标准格式是: fhandle=@(arglist)express (1)express是一个matlab变量表达式,比如:x+x.^2,sin(x)等(2)argilst是参数列表;(3)符号@是matlab创建函数句柄的操作符,表示创建由参数...

matlab从fig文件中提取数据

如果你的fig文件中图像是由多条曲线绘制而成,比如说plot命令生成的,通过以下方式输出横坐标,纵坐标的取值 open('figname.fig'); lh = findall(gca, 'type', 'line');% 如果图中有多条曲线,lh为一个数组 xc = get(lh, 'xdata');            % 取出x轴数据,xc是一个元...

面向对象:MATLAB的自定义类 [MATLAB]

  这几天刚刚开始学习MATLAB的面向对象编程。以前做的事情都是用MATLAB写一些简单的脚本或者函数,这方面MATLAB成熟的函数和直截了当的矩阵运算方法和语法都很容易上手,方便人专注于算法本身。前几天写代码的时候想到,在实际用MATLAB进行数值计算时,将数据和函数用一些方法组织起来也会带来很大的便利,否则零散的数据和函数总归看着不舒服。比如,我恰好...