matlab并行运算方法

2023-05-16

matlab并行运算方法

matlab在计算大数据内存以及大矩阵运算时,单核运算显然无法满足高速的运算需求。其实matlab提供多核运算的解决方案,这里先介绍最简单的两种

  • parfor
  • distributed
  • spmd

打开并行运算的方法是parpool(4);或者是左下角的start parallel pool。

  • parfor
    其实,matlab在计算中比较耗时的运算主要是循环与矩阵分解等操作,for循环一般最为耗时,解决方法就是采用parfor代替for,parfor可以自动将循环任务分配到多个核中,现在matlab的命令行窗口运行parpool(4)查看是否可以并行计算,没有报错则并行已打开。parfor运行时就会有多个matlab进程在计算。计算效率明显提升。
    这里写图片描述
    **注意:parfor循环中不能使用迭代或者关联性的赋值语句,因为多个核计算时无法交换数据。**parfor具体可参考help文档,这里只说明一种嵌套循环的解决方法。
    因为parfor只支持一层循环,所以下面这种写法是非并行的,并且可能会出错。
parfor(for) i = 1:100
   parfor(for) j = 1:100
     y(i,j) = i+j;
   end
end

正确的写法是

i = 1:100;
j = 1:100;
[I,J] = meshgrid(i,j);
parfor i = 1:numel(I)
    Y(i) = I(i)+J(i);
end
y = reshape(Y,length(i),length(j));

其实最好的解决for循环计算速度慢的问题是用矩阵运算代替循环。

  • distributed
    对于大矩阵的存储问题以及计算的问题,除了自己分块外,可以使用matlab自带的内存分配解决方法,但需要确保你的电脑内存足够多,计算效率就会大幅提高。不然会有内存溢出的问题。
    具体方式是
tic;
X = randn(10000);
x_dis = distributed(X);
clear(X);
whos
a = svd(x_dis);
a_out = gather(a);%distrituted数据类型变为double
toc;

之后可以采用x_dis代替X进行计算即可。gather函数的作用是把distributed数据类型变为double。

  • spmd
    spmd老实说实际应用场景感觉并不多,大致上是相当于在没一个worker上运行一遍,比如你可以产生好多数据集,每个数据集在不同的worker上运行以此来实现并行,spmd的基本用法是
spmd
    statements
end

spmd中的一个重要的参数是labindex,它是指每个worker的索引,用来表示此时正在工作的是哪一个worker。

此外,matlab的大多数工具箱都开始支持并行计算,所以如果该问题可以用自带工具箱解决的可以使用工具箱自带的并行计算方法。
matlab的Parallel Computing Toolbox工具箱就支持并行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab并行运算方法 的相关文章

随机推荐