文档章节

Matlab并行编程方法

SVD
 SVD
发布于 2016/04/09 21:56
字数 1199
阅读 365
收藏 3

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

具体到代码:

matlabpool local 2;  
    %parallel program  
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可能得不到什么好处。

c = 1:10;  
a = ones(10,1);  
tic  
parfor i = 1:length(c)  
    a(i)= a(i)+ c(i);  
end  
toc  
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. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如

%% SPMD  
%example 1  
spmd   
A = rand(3,2); %generate a matrix A for each lab(worker)  
end  
for i = 1:length(A)  
    figure; imagesc(A{i});   
end  
  
%example 2  
a = 3;  
b = 4;  
spmd  
    c = labindex();  
    d = c+a;  
end  
c{2} = 5;  
spmd  
    f = c*b;  
end  
for i = 1:length(f)  
    fprintf('%d\t',f{i});%access the value of each lab  
end

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

以上是我对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. 注意事项及经验总结

注意事项:

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

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

matlabpool local 2;  
c = 1:5;  
parfor i = 1:length(c)  
    a(i) = c(i);  
end

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

是这样,

parfor i = 1:4  
........  
end

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


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


4.4 parfor使用有很多约束

比如for循环内的表达式需要显式表达(透明性),不依赖前项。如

parfor i = 3:10

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

end

是不行滴。。


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


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

SVD

SVD

粉丝 34
博文 228
码字总数 118729
作品 0
海淀
私信 提问
加载中

评论(12)

SVD
SVD 博主
>> ex2_4
Starting matlabpool using the 'local' profile ... connected to 4 workers.
matlabpool 已经启动
for:
1
2
3
4
5
6
7
8
parfor:
5
4
3
2
1
7
8
6
>>
SVD
SVD 博主
function []=ex2_4()
%ex2_4.m
startmatlabpool;
N=8;
display('for:');
for i=1:N
display(num2str(i));
end
display('parfor:');
parfor i=1:N
display(num2str(i));
end
SVD
SVD 博主
At the lowest level, many modern processors have special hardware that allows
a single instruction to cause multiple operations to be performed in parallel,
a mode known as single-instruction, multiple-data, or “SIMD” parallelism. For
example, recent generations of Intel and AMD processors have instructions that
can add four pairs of single-precision floating-point numbers (C data type float)
in parallel.
These SIMD instructions are provided mostly to speed up applications that
process image, sound, and video data. Although some compilers attempt to auto-
matically extract SIMD parallelism from C programs, a more reliable method is to
write programs using special vector data types supported in compilers such as gcc.
SVD
SVD 博主
Elapsed time is 564.136927 seconds.貌似并行更慢了。
SVD
SVD 博主
Starting matlabpool using the 'local' profile ... connected to 2 workers.
Sending a stop signal to all the workers ... stopped.
Elapsed time is 617.084461 seconds.
SVD
SVD 博主
>> Test5
Starting matlabpool using the 'local' profile ... connected to 2 workers.
Elapsed time is 10.814885 seconds.
Sending a stop signal to all the workers ... stopped.
SVD
SVD 博主
并行计算为了更快得到结果,消耗更多的内存进行通信和运算的处理;
串行计算则相对节省了内存,但是程序运行很慢;
时间和空间有着如此不可调和的矛盾。
SVD
SVD 博主
linux下打不开MATLAB图形化界面,ps -u ....看看是不是有同一个进程在运行,可能上一次没完全退出,找到把它杀掉就可以了
SVD
SVD 博主
并行本意是利用计算机上的双核,但是任务分配和通讯就会占用一些内存资源。
SVD
SVD 博主
当使用完core,第二次向系统申请core资源的时候,一定要释放之前使用的core资源;
因此在每个并行程序块中matlabpool local2;与matlabpool close一定是成对出现的。
MATLAB vs. Python | 选择 MATLAB 用犹豫吗?

基于矩阵的 MATLAB 语言让数学直观易读。 工程师和科学家需要能够直观表达矩阵和数组数学运算的编程语言,而非通过通用编程实现的编程语言。 Python 中的矩阵数学需要执行函数调用,而非自然...

技术小能手
2018/08/01
0
0
MATLAB入门基础

预定义变量 >> format short e>> RMAd = realmax('double') %双精度类型默认最大实数 RMAd = 1.7977e+308 RMAs = realmax('single') %单精度类型最大实数 RMAs = 3.4028e+38>> IMA64 = intm......

SVD
2016/01/26
192
0
机器人系统--Urbi SDK

Urbi SDK 是一个用于机器人技术及复杂系统的通用软件平台,基于一个强大的并行脚本语言“urbiScript”,并结合了UObject组件的体系结构,该 结构可以灵活便捷地控制软、硬件。 同时,Urbi也完...

匿名
2011/04/24
2.6K
0
Matlab集群搭建及使用指南

http://www.mathworks.cn/support/product/DM/installation/vercurrent/?scid=pidcpiR2012b installing and Configuring Parallel Computing Toolbox and MATLAB Distributed Computing Serv......

AlphaJay
2013/01/15
8.5K
0
编程语言新宠儿 — Julia 诞生记

导读:本文作者Stefan Karpinski是一名数据科学家和应用数学家。曾就职于Akamai, Citrix Online和Etsy;Viral Shah爱好对高性能计算机研究工作,曾就职于微软Star-P部门;Alan Edelman是一名...

被风遗忘
2012/02/26
12.3K
26

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部