先上图,图中求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 版权协议,转载请附上原文出处链接和本声明。