首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

matlab中的并行方法

  • 25-03-03 23:03
  • 3393
  • 7069
blog.csdn.net

//

文件转载自: http://blog.csdn.net/abcjennifer/article/details/17610705

///

本文讲一下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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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.   
  10. %example 2  
  11. a = 3;  
  12. b = 4;  
  13. spmd  
  14.     c = labindex();  
  15.     d = c+a;  
  16. end  
  17. c{2} = 5;  
  18. spmd  
  19.     f = c*b;  
  20. end  
  21. for i = 1:length(f)  
  22.     fprintf('%d\t',f{i});%access the value of each lab  
  23. end  

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.               
  14. %example4   
  15. %add different values for different parts of array Data  
  16. % [1:50]+1  
  17. % [51:100]+2  
  18. spmd  
  19.     if labindex == 1  
  20.         Data(1:50) = Data(1:50)+1;  
  21.     else  
  22.         Data(51:100) = Data(51:100)+2;  
  23.     end  
  24. 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 在CODE上查看代码片 派生到我的代码片
  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 在CODE上查看代码片 派生到我的代码片
  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




注意一点,从R2013b开始,parpool命令取代了matlabpool命令





注:本文转载自blog.csdn.net的夜空划过的流星的文章"https://blog.csdn.net/xgx198831/article/details/41104291"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top