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语言的效率有关,并且和处理的数据量和计算复杂度有关。

最新文章

  1. Hibernate-list()与iterate()方法的区别
  2. Win7 64位 VS2015环境使用qt-msvc2015-5.6.0
  3. 手机号码js正则验证
  4. 单机redis多端口实例+keepalived高可用
  5. 安装Docker和下载images镜像和常用Docker命令
  6. Matlab安装记录 - LED Control Activex控件安装
  7. JSP 页面传参和接受参数
  8. CSS规则整理
  9. part 4 AngularJS ng src directive
  10. leetcode 字符串分割对称
  11. avalon1.5+中组件的定义方式
  12. DPM,DEM,DDPM的区别
  13. springMVC中@RequestParam和@RequestBody注解的用法
  14. 情景linux--如何摆脱深路径的频繁切换烦恼?
  15. [Swift]LeetCode900. RLE 迭代器 | RLE Iterator
  16. 003.Docker容器管理
  17. Vue组成和第3方插件
  18. Django内置模版过滤器
  19. 30分钟新手git教程
  20. Nginx(一)安装及启停

热门文章

  1. .Net实现发送邮件功能
  2. Learning Combinatorial Embedding Networks for Deep Graph Matching(基于图嵌入的深度图匹配)
  3. C++ DirectShow读取摄像头后然后保存图像数据
  4. 阿里云服务器搭建详解——Ubuntu
  5. clion之CMakeLists的学习
  6. Windb实践之Script Command
  7. Git 小课堂 002——别名
  8. python期末考试复习
  9. Windows安装使用SonarQube7.4 对java项目进行代码质量扫描
  10. jenkins job 杀进程不成功解决办法