matlab并行计算之parfor

原文:http://blog.sina.com.cn/s/blog_866e7fa70101cv08.html

提高matlab代码的执行效率,是很多码农们的迫切愿望和需求。最重要的当然是好的代码结构,向量化的语言的高效性是for循环拍马也赶不上的。但是,现实中很多时候我们是需要使用到for循环的,为此可以使用matlab的并行计算来提高代码执行效率。

并行计算的原理就是将代码分配到多个处理器中进行运算。例如8核的机器,就可以同时调动8个处理器来运算。不过为了在运算时你不至于太无聊,还是留下一个给自己做其他事情用吧。

1、启动和关闭并行计算功能
启动:
CoreNum=7; %调用的处理器个数
if matlabpool('size')<=0   %之前没有打开
    matlabpool('open','local',CoreNum);
else   %之前已经打开
    disp('matlab pool already started');
end
关闭:
matlabpool close
如果代码还在调试阶段,可以暂时不关闭matlabpool,反复开关浪费时间得很。另外,matlab关闭后,matlabpool也会自动关闭,所以如果不是海量代码,可以不用关闭的(个人意见,没有实测影响)。

2、parfor的使用
将传统的for循环改为parfor循环,就会将循环体作为整体分到到一个个处理器中,从而一次性进行多组运算。在使用parfor时,代码的编写有一些注意事项,最主要的是其中变量的处理。matlab的帮助文档中有详细的描述。
matlab并行计算之parfor

在此,我将摘取一部分重要的加以说明并举例。
在parfor中,变量不再是随心所欲的使用,有着其自己的分类。在parfor运行时,我们经常会遇到这样的错误“  Error: The variable xxx in a parfor cannot be classified.”说的就是变量xxx不能被正常划分到正确的类别中。
matlab并行计算之parfor
parfor变量一共分为5类,每一类的定义和用途就不说了,看一眼就明白。需要注意的是以下几点
(1)循环变量
循环变量在循环体中的使用一定要具有独立性,循环体之间不相关。例
a(i)=a(i-1)*temp;是不行的。
(2)sliced 变量(一般是数组,被各个处理器分割成一个个slice)
slice变量在一个循环体内只能出现一个slice,简单说就是一个循环体内只能出现slice数组的一个元素。例
a(i)=temp1;
a(i+1)=temp2;
是不行的。
另外,slice变量的下标一定要连续,例
a(2*i)=temp;
是不行的。
(3)临时变量
matlab使用变量的一个好处是不需要预定义。但是在使用parfor时,这会弄混sliced变量和临时变量。由于临时变量不需要有sliced变量的限制,使用更自由,因此一定要区分开。方法是在parfor中对临时变量进行预定义。例
parfor i=1:10
    b=zeros(1,4);
    for j=1:4
        b(i)=i+1;
    end
    a(i)=b;   %a是sliced变量
end
基本上注意到这几个问题就能正常运行parfor了。
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值