matlab并行计算之parfor

在运行MATLAB程序的时候,当循环较多和计算量较大时,程序运行时间会非常长。经过查阅MATLAB文档发现,使用parfor循环,可以进行多线程并行运算,大大提高计算的速度,但是对该parfor循环的方式不是很清楚。经过查阅相关文献,发现该博主写的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也会自动关闭,所以如果不是海量代码,可以不用关闭的(个人意见,没有实测影响)。           

                                                     matlab并行计算之parfor

2、parfor的使用

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

 

在此,我将摘取一部分重要的加以说明并举例。

在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了。