本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行。分为以下几个板块:

1. 怎么并行?

2. parfor vs. SPMD

3. 注意事项及经验总结

-----------------------------------------------------------

1. 如何并行?

1. Request a number of workers;
2. Issue the normal command to run the program. The client program will call on the workers as needed;
3. Release the workers;

具体到代码:

[plain] view plain copy  
  1. matlabpool local 2;
  2. %parallel program
  3. matlabpool close

其中2是core数目,注意2是core数。你的电脑如果是双核四线程的,那么只能申两个(而非4个)matlab local pool。

具体实现parallel program呢,主要是通过parfor(parallel for)和SPMD(single program, multiple data)完成的。

-----------------------------------------------------------

2. parfor vs. SPMD

2.1 什么时候用parfor

parfor只用于matlab并行循环。当你需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor循环就很有用。parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代。

注意当循环中有迭代依赖其他迭代的结果时不应该使用parfor循环。每个迭代都必须不依赖其他迭代。由于parfor循环内有通信消耗,当只有小数量的简单计算时使用parfor可能得不到什么好处。

[plain] view plain copy  
  1. c = 1:10;
  2. a = ones(10,1);
  3. tic
  4. parfor i = 1:length(c)
  5. a(i)= a(i)+ c(i);
  6. end
  7. toc
  8. fprintf('%d\n',a);

2.2 什么时候用SPMD(Single Program/Multiple Data)单程序多任务进行任务并行

Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。 “Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。一下是我总结的SPMD使用的两个场景:

The "single program" aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

[plain] view plain copy  
  1. %% SPMD
  2. %example 1
  3. spmd
  4. A = rand(3,2); %generate a matrix A for each lab(worker)
  5. end
  6. for i = 1:length(A)
  7. figure; imagesc(A{i});
  8. end
  9. %example 2
  10. a = 3;
  11. b = 4;
  12. spmd
  13. c = labindex();
  14. d = c+a;
  15. end
  16. c{2} = 5;
  17. spmd
  18. f = c*b;
  19. end
  20. for i = 1:length(f)
  21. fprintf('%d\t',f{i});%access the value of each lab
  22. end

另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作。它们都可以用parfor代替,对吧,这里我就不写了,相信大家的能力。。

[plain] view plain copy  
  1. %example3 - deal with same Data by different parameters
  2. %add different values to same array Data
  3. Data = 1:100;
  4. spmd
  5. switch labindex
  6. case 1
  7. Data = Data+1;
  8. case 2
  9. Data = Data+2;
  10. end
  11. end
  12. % print Data{1} & Data{2} for checking
  13. %example4
  14. %add different values for different parts of array Data
  15. % [1:50]+1
  16. % [51:100]+2
  17. spmd
  18. if labindex == 1
  19. Data(1:50) = Data(1:50)+1;
  20. else
  21. Data(51:100) = Data(51:100)+2;
  22. end
  23. end

以上是我对spmd和parfor的理解,欢迎补充指正,其他关于spmd vs. parfor的可以参考这个帖子。

2.3 Composite类型

spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。

>>  f = Composite(2);

-----------------------------------------------------------

4. 注意事项及经验总结

注意事项:

1. parfor中慎用(最好勿用)eval幅值。

一个程序并行时要共享内存,而eval语句可能使程序进入错误的workspace,因此不要用eval,改用不同index赋值。

[plain] view plain copy  
  1. matlabpool local 2;
  2. c = 1:5;
  3. parfor i = 1:length(c)
  4. a(i) = c(i);
  5. end

2. parfor循环不能很好利用所有处理器怎么办?

是这样,

[python] view plain copy  
  1. parfor i = 1:4
  2. ........
  3. end

就只能用4个处理器,而如果不加这个parfor可能matlab自身的负载均衡能够更好地利用CPU。这里我是开起来3个matlab,比如服务器上有12个核。我就给每个matlab分配4个core(>>matlabpool local 4),每个程序里有一个parfor i = 1:4. 这样就可以用起来12个核。我知道这样好暴力……囧,有人知道正解的话指条明路吧。。

3. parfor,spmd不可以相互或者自身嵌套。

4. parfor使用有很多约束,比如for循环内的表达式需要显式表达(透明性),不依赖前项。如

parfor i = 3:10

f(i) = f(i-1)+f(i-2);

end

是不行滴。。

欢迎留言其他并行技巧和方法,谢谢!

Reference:

1. MATLAB官网——Parallel Computing Toolbox

2. 详细讲解并行用法(貌似阿拉伯人写的……o(╯□╰)o)

3. 详细并行代码

4. 多核计算平台中MATLAB并行计算

5. Parallel Computing Toolbox User's Guide

from: http://blog.csdn.net/abcjennifer/article/details/17610705#comments

Matlab并行编程方法相关推荐

  1. matlab linux 并行,Matlab并行编程方法

    Matlab并行编程方法 本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 1. 怎么并行? 2. parfor vs. SPM ...

  2. matlab算例并行教程,Matlab并行编程方法

    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 怎么并行? parfor vs. SPMD 注意事项及经验总结 如何并行? R ...

  3. Matlab并行编程方法1

    相信很多朋友在利用matlab进行计算时,会遇到循环次数过大,或者是单次计算量过大的问题,比如需要计算的数值阵列数据量过大,利用传统的编程方式,跑一次程序几个小时,都要等的急死了是不是呢?如果遇到这种 ...

  4. Matlab并行编程函数cellfun arrayfun

    本篇blog针对两个函数cellfun和arrayfun对程序的加速写一些东西,方便大家调的一手好参数.之前的一篇blog<Matlab并行编程方法>在具体实现时可能有问题(下面会讲),而 ...

  5. linux开启多个matlab_Matlab并行编程方法

    本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行.分为以下几个板块: 1. 怎么并行? 2. parfor vs. SPMD 3. 注意事项及经验总 ...

  6. matlab开启并行计算 核数_[续] Matlab 并行编程——多核 多线程

    刚开始接触matlab并行计算,以前旧电脑从不考虑这些的 小本i7四核八线程16G内存,64位win7和matlab 2012b,任务管理器显示有8个框 当用普通for循环,只有一个框接近100%,c ...

  7. matlab充分利用性能,Matlab高性能编程——代码优化和并行计算

    Jeremy Lin  @HQU Update: 2014/4/29 Matlab代码优化 Matlab是一种高级计算机语言,同时也是一个用于算法开发,数据可视化,数据分析和数值计算的交互式工作环境. ...

  8. matlab经典编程题,matlab

    时间:2019-05-12 12:56:56 作者:admin MATLAB 编程题总结LY 1.输出x,y两个中值较大的一个值. x=input('x='); y=input('y='); if x ...

  9. 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

    一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...

最新文章

  1. 揭秘鸿蒙系统中的 JS 开发框架
  2. python axis 0 1_python pandas 中axis值0 1怎么分行还是列
  3. STM32使用LWIP库新建tcp_sever
  4. C# WinForm WebBrowser (三) 编辑模式
  5. 移动端键盘弹起导致底部按钮上浮解决方案
  6. html的toggle属性,HTML ontoggle事件属性
  7. 1个已知CVE,7步,找到一个高质量RCE并获奖金
  8. React 源码剖析系列 - 不可思议的 react diff
  9. touchend与click顺序
  10. jvm初体验:堆溢出处理
  11. 循环神经网络--RNN GRU LSTM 对比分析
  12. 企业战略规划书籍推荐
  13. 从零开始学习Java设计模式 | 软件设计原则篇:依赖倒转原则
  14. centos7.5安装snipe-it v5.1.2版本开源资产管理软件
  15. 【Magicavoxel简易入门教程】(二) 第二章 · 自制一个NPC导出模型优化工具使用(附下载)
  16. XXXXXXXXXXX学校“专家问诊课”活动方案
  17. 微信小程序,学习笔记(三)微信小计算器
  18. 【数据分析】指标体系
  19. 英辞流——坚若金刚与穿行无碍:物质的三态
  20. Python小案例(六)通过熵权法计算指标权重

热门文章

  1. pipe()函数精解
  2. 顶象深度画像亮相GMIC,用AI提升金融反欺诈
  3. java面向对象思想如何理解
  4. Java8 - 自定义实现体会CompletableFuture的原理
  5. Netty - I/O模型之BIO
  6. Spring Cloud【Finchley】实战-04将订单微服务与商品微服务分别拆分为多模块
  7. Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块
  8. php语言中 类的关键词是,c语言中的关键字有哪些类型?
  9. python 装饰器 生成器 迭代器和闭包
  10. Kotlin优雅的使用sp(SharedPreferences)