关于Matlab多线程计算和多核心计算 关于多线程计算 Matlab是基于单

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于Matlab多线程计算和多核心计算

1.关于多线程计算

Matlab是基于单线程单核心的一款软件,在近几年多核心,多线程处理器大规模部署后,其程序设计师才逐步改善matlab内核,让某些常用函数逐步支持多线程运算。

在matlab6.5-matlab 2007b这些版本中,fft, fft2, fftn, ifft, ifft2, ifftn是默认支持多线程运算的,即只要调用这些函数,系统在运算时会开启多线程(计算机硬件须支持)

在matlab 2008a-matlab 2009a这些版本中,增加了prod, sum, max, min这几个函数的多线程运算功能,但是matlab内核版本不同会导致这些函数在多线程执行时效率不同。

按照其官方文档的说法,在支持多线程计算的matlab版本中,同样的fft运算可以提速50%。

但是多线程运算有一个缺点:在函数体或程序内部需要调用其他非多线程运算的函数时,执行效率会比较低,基本和不开启多线程运算差不多,也就是说,使用这些支持多线程的函数时,最好不要进行嵌套。

结论:matlab中多线程计算受限于版本以及特定的函数,在运算指定函数时效率较高,建议拥有多核心处理器的机器开启。

开启多线程方法:在命令行下输入:maxNumCompThreads(),括号内为需要开启的线程个数

2.关于多核心计算(并行计算和分布式计算)

2.1并行计算功能(Parallel Computing Toolbox)

Parallel Computing Toolbox是matlab 2008 a开始拥有的新功能,之前的版

本仅拥有Distributed Computing Toolbox。

并行计算工具箱里面包含了parfor,spmd,pmode,下面一一介绍(这些功能在分布式计算的应用暂不涉及)

2.1.1 Parfor

这个是matlab提供的并行计算的for循环,需要matlab pool 的支持。在matlab 2008a以后的版本可以通过输入matlabpool local

命令开启,双核心处理器可以开启2个pool,在计算时会将任务分

解为两个并发线程计算,经验证可以缩短for循环的时间一半左右。

Parfor 不能用于循环的嵌套,即在parfor循环体内不能调用for 或者while,否则会出错。Matlab官方建议parfor循环中不要在循

环体内调用上一步循环的结果,否则会导致执行可能出错。

错误程序实例:

f = zeros(1,50);

f(1) = 1;

f(2) = 2;

parfor n = 3:50

f(n) = f(n-1) + f(n-2);%循环嵌套

end

串行程序示例:

clear A

for i = 1:8

A(i) = i;

end

并行程序示例:

clear A

parfor i = 1:8

A(i) = i;

end

可以看出,执行串行和并行循环后得到的A矩阵是一致的,但是parfor循环体外部的值在循环后不会改变,如下例:

clear A

d = 0; i = 0;

for i = 1:4

d = i*2;

A(i) = d;

End

执行后,A=[2,4,6,8],d=8,i=4

但是将程序换为并行:

clear A

d = 0; i = 0;

parfor i = 1:4

d = i*2;%注意:如果这句换为d=d+i,则d值和for循环一致

A(i) = d;

end

执行后A=[2,4,6,8],d=0,i=0

即循环体外部值不随循环而改变,但串行执行时程序是顺序执行的,因此循环前的数据值在循环后会保留循环后最后状态的数据,而并行循环时因循环并行执行,故只保存循环体前面的状态。

此外,预分配空间对于并行for循环的提速作用也是很明显的。

看下面两个程序:

tic;

n = 200;

M = magic(n);

R = rand(n);%循环体外部分配空间

parfor i = 1:n

A(i) = sum(M(i,:).*R(n+1-i,:));

end

toc

Elapsed time is 0.169305 seconds.%程序执行时间

tic;

n = 200;

parfor i = 1:n

M = magic(n);

R = rand(n);%循环体内部分配空间

A(i) = sum(M(i,:).*R(n+1-i,:));

end

toc

Elapsed time is 0.877587 seconds.%多消耗5倍时间

2.1.2 Spmd(single program multiple data)

单程序多数据功能允许对程序进行注释,使得在分布式计算和使用matlab 多labs计算的机器上对同一个程序同时运行。在注释

之前,matlab并不知道哪部分程序独立于其他程序,可以提前进行并行处理,所以仅仅在某些函数进行并行计算,在进行注释后,matlab可以提前利用多核心计算互不相关的子程序或者程序的某些部分以提高效率。这个功能需要对现有程序进行小范围修改。

如下例:

spmd

End

在statements字段的程序将利用所有的lab进行并行执行

如:

spmd

R = rand(4,4);

End

注:如果spmd语句内的程序存在嵌套,或者说数据之间不能独立存在,则仍会以串行方式执行或者报错

其他用法:

Spmd (n)%使用n个labs计算

R = rand(4,4);

End

Spmd(m,n)%使用至少m,至多n个lab计算

R = rand(4,4);

End

相关文档
最新文档