MATLAB并行计算

  • Post author:
  • Post category:其他


先上图,图中求500次随机矩阵的特征值,串行14.85s,并行3.63s 。

%% 串行计算
tic
S1=1;
for i = 1:500
    S1 = S1+max(eig(rand(i)));
end
display(strcat('客户端串行计算时间:',num2str(toc),'秒'));

并行化:

%% 开启线程池
if isempty(gcp('nocreate')) %如果之前没有开启parpool则启动
    parpool(maxNumCompThreads);  %设为最大可使用核数
end

%% 并行计算
tic
S2=1;
parfor i = 1:500
    S2 = S2+max(eig(rand(i)));
end
display(strcat('parfor并行计算时间:',num2str(toc),'秒'));

总结下来其实就两步:

1. 开启线程池;

2.把“for”改成“parfor”

求和运算也可以并行完成:

%% 串行计算
tic
S1=1;
for i = 1:500
    S1 = S1+max(eig(rand(i)));
end
display(strcat('客户端串行计算时间:',num2str(toc),'秒'));


%% 开启线程池
if isempty(gcp('nocreate')) %如果之前没有开启parpool则启动
    parpool(maxNumCompThreads);  %设为最大可使用核数
end

%% 并行计算
tic
S2=1;
parfor i = 1:500
    S2 = S2+max(eig(rand(i)));
end
display(strcat('parfor并行计算时间:',num2str(toc),'秒'));

测试下来,特征值,fsolve,数值积分等操作并行比串行快,大矩阵svd分解,大矩阵除法串行更快,可能是这些运算MATLAB中已经有优化了。

另外,第一次开线程池比较慢,需要约30s,如果需要多次使用,就不要关线程池了。



版权声明:本文为u013279723原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。