目前,新购置的电脑大部分都是多核的了,使用Matlab进行大量计算时如何有效利用多核呢?Matlab目前版本已经比较好的支持多核并行运算了。是用的Matlab版本是R2007b。电脑是双核的。
先简单试试:
>> matlabpool local 2
Submitted parallel job to the scheduler, waiting for it to start.
Connected to a matlabpool session with 2 labs.
显示正在进行多核配置,然后,提示连接到2个“实验室”(labs)。我这也理解的:本地虚拟出2台可以运行matlab的工作站,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的)。
>> testParallel
Elapsed time is 7.750534 seconds.
这里运行testParallel函数,已经开辟了2个labs,为了进行多核并行运算,testParallel中,要用parfor代替原来的for循环。
在运行这个时,观察windows任务管理器,可以发现一共有3个MATLAB.exe进程。其中一个占内存较多的,应该是主控的,他基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,剩下两个进程专门用来计算的,跑起来各占cpu 49%左右。看上去还是每个matlab进程单核运算,但是一下开2个进程,所以能把cpu用满。当运行完testParallel后,三个进程的cpu都立刻降为1%左右了。
>> matlabpool close
Sending a stop signal to all the labs...
Waiting for parallel job to finish...
Performing parallel job cleanup...
Done.
当要关闭开辟的2个labs时,使用matlabpool close关闭即可。
代码及使用时间对比如下表:
function testParallel
%非并行
% matlabpool local 2
tic
total=10^5;
for (i=1:total)
ss(i)=inSum;
end
plot(ss);
toc
% matlabpool close
function [s]=inSum
x=abs(round(normrnd(50,40,1,1000)));
s=sum(x);
function testParallel
%并行
matlabpool local 2
tic
total=10^5;
parfor (i=1:total)
ss(i)=inSum;
end
plot(ss);
toc
matlabpool close
function [s]=inSum
x=abs(round(normrnd(50,40,1,1000)));
s=sum(x);
70.471469/7.750534 = 9.0925,并行与否的时间比竟然是9倍,足以表明,在Matlab中使用多核并行运算给我们带来很多好处。
转载请注明出处http://hi.baidu.com/webas/item/438ed30e364e28cf905718d8。
先简单试试:
>> matlabpool local 2
Submitted parallel job to the scheduler, waiting for it to start.
Connected to a matlabpool session with 2 labs.
显示正在进行多核配置,然后,提示连接到2个“实验室”(labs)。我这也理解的:本地虚拟出2台可以运行matlab的工作站,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的)。
>> testParallel
Elapsed time is 7.750534 seconds.
这里运行testParallel函数,已经开辟了2个labs,为了进行多核并行运算,testParallel中,要用parfor代替原来的for循环。
在运行这个时,观察windows任务管理器,可以发现一共有3个MATLAB.exe进程。其中一个占内存较多的,应该是主控的,他基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,剩下两个进程专门用来计算的,跑起来各占cpu 49%左右。看上去还是每个matlab进程单核运算,但是一下开2个进程,所以能把cpu用满。当运行完testParallel后,三个进程的cpu都立刻降为1%左右了。
>> matlabpool close
Sending a stop signal to all the labs...
Waiting for parallel job to finish...
Performing parallel job cleanup...
Done.
当要关闭开辟的2个labs时,使用matlabpool close关闭即可。
代码及使用时间对比如下表:
function testParallel %非并行 % matlabpool local 2 tic % matlabpool close function [s]=inSum | function testParallel %并行 matlabpool local 2 tic matlabpool close function [s]=inSum |
Elapsed time is 70.471469 seconds. | Elapsed time is 7.750534 seconds. |
70.471469/7.750534 = 9.0925,并行与否的时间比竟然是9倍,足以表明,在Matlab中使用多核并行运算给我们带来很多好处。
首先,LZ要搞清楚自己的电脑是几个核的。如果不是多核的,那就没有办法进行多核运算了。现在大多数电脑是双核的,也有一些高级一些的是四核。
如果是双核的,进行多核运算前,写上代码:
matlabpool local 2;
四核的话写上代码:
matlabpool local 4;
依此类推。
多核运算完以后,要记得关闭多核运算。写上代码:
matlabpool close;
要记住使用matlabpool和parfor缺一不可。开启了matlabpool,还是用for做循环的话,是无法回快速度的。
我没有让你把所有的for循环都改成parfor循环.我的意思是多核运算只能加速parfor的部分.
刚才试了一下,我使用的MATLAB2010可以多核运行的。需要多核多线程跑的算法,在之前要让matlab在本地建立4个“实验室”(我的机器是4核,所以是4个)>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
显示正在进行多核配置,一会说,连接到4个“实验室”。我理解就是在本地虚拟出4台可以运行matlab的工作站,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的)。观察windows任务管理器,可以发现一共有5个MATLAB.exe进程。其中一个占内存较多的,我理解是主控的,他基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,剩下四个进程专门用来计算的,跑起来各占cpu 25%左右。看上去还是每个matlab进程单核运算,但是一下开4个进程,所以能把cpu用满。
如果后续还需要多核运算,就直接用parfor好了,不用每次都用matlabpool命令。那个配置一次就好。
算完了,不再跑了,临退出时关闭配置就行。
>> matlabpool close
Sending a stop signal to all the labs ... stopped.
下面是我一个M文件的程序,测测4核并行计算和单核计算的差距,很简单。
function testtime
runtimes = 1e9;
dummy1
dummy2
%matlabpool local 4
tic
%for x= 1:runtimes;
parfor x= 1:runtimes;
end
toc
plot([1 2], [dummy1, dummy2]);
第一次用普通for语句,单核跑,6.09秒
>> testtime
Elapsed time is 6.094267 seconds.
第二次用parfor语句,4核跑,1.63秒
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
>> testtime
Elapsed time is 1.631350 seconds.
>> matlabpool close
加速比 6.09 / 1.63 = 3.736,将近4倍(还有开销吧),还比较可观。
由于处理器时钟频率的限制,增加核并不意味着是计算性能的提高。为了充分利用新的多核硬件在性能上的优势,软件的基层结构需要向并行计算转换。MATLAB并行计算工具箱就是这种需求的产物,它能很好地实现在多核系统上进行并行运算。文章以典型的数值计算问题为例描述如何使用基本的两种并行运算方式:线程和并行for循环。
典型数值计算问题
N = 1000;
plot(eig(randn(N)) / sqrt(N), ‘.’);
这段代码运行后得到图1,图上每个点代表复平面上一个特征值。注意所有的特征值都位于半径为1 ,圆心在轴的原点的圆内,特别指出的是结果与Girko圆定律是一致的,特征值的幅值没有超过矩阵维数的平方根。
图1 大小为1000的随机矩阵的特征值在半径为sqrt(1000)的圆内
y = zeros(1000,1);
for n = 1:1000
end
plot(y);
使用线程
线程个数 | 运行循环所需时间 | 加速倍数 | 效率 |
1 | 902.6 | 1.00 | 100% |
2 | 867.2 | 1.04 | 52% |
3 | 842.3 | 1.07 | 35% |
4 | 862.3 | 1.05 | |
图2 不同线程数量对应的代码性能
使用并行for循环
y for n = 1:1000 end plot(y); | y = zeros(1000,1); parfor n = 1:1000 end plot(y); |
图3 左边:原来的代码
Labs数量 | 运行循环所需时间 | 加速倍数 | 效率 |
1 | 870.1 | 1.00 | 100% |
2 | 487.0 | 1.79 | 89% |
3 | 346.2 | 2.51 | 83% |
4 | 273.9 | 3.17 | 79% |
图4 不同的lab数量对应的代码性能
total = 0;
A = zeros(1000, 1);
parfor i = 1:100
end
利用parfor很容易计算total的表达式,但是对于第二个表达式,由于A(i+1)依赖于前一次循环得到的A(i),所以用parfor计算会产生问题。
让我们来更进一步地看看每次循环发生了什么:
Iteration 1: i = 1
Iteration 2: i = 2
Iteration 3: i = 3
通过以上分析我们可以用下面的parfor循环的代码得到跟前面同样结果的代码:
parfor i = 1:10
end
扩展并行计算
________________________________________
所需产品
-
MATLAB
-
Parallel Computing Toolbox
资源与示例
-
Using parfor to Run Loops in Parallel
-
Parallel Programming in MATLAB
文章
-
Eigenvalues and Condition Numbers of Random Matrices. Alan Edelman. Ph.D. thesis, Massachusetts Institute of Technology, May 1989.
-
Language Design for an Uncertain Hardware Future. Roy Lurie. HPCwire, September 28, 2007
-
Multiple Processors and Multiple Cores. Cleve Moler. The MathWorks News & Notes, June 2007