您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

matlab代做highspeedlogic★Matlab并行编程方法

时间:2018-11-28 20:27:50 点击:

  核心提示:matlab代做,FPGA代做,淘宝,专业代做MATLAB、FPGA博士/硕士/本科毕业设计、项目仿真、Coursework、Assignment...
matlab代做FPGA代做淘宝专业代做MATLABFPGA博士/硕士/本科毕业设计项目仿真CourseworkAssignment

 

本文讲一下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.   
  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
 
  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
 
  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

是不行滴。。


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

作者:不详 来源:网络
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment