首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【高性能】Matlab的并行计算之parfor

  • 25-03-03 23:03
  • 2111
  • 9307
blog.csdn.net

当matlab计算量很大,重复独立的循环计算很多的时候,我们可以使用matlab的并行计算,这里我先试验了parfor并行计算。以下代码仅适合新版的matlab,改编自《实战matlab之并行程序设计》。

启动代码:

function [pool] = startmatlabpool(size)
pool=[];
isstart = 0;
if isempty(gcp('nocreate'))==1
    isstart = 1;
end
if isstart==1
    if nargin==0
        pool=parpool('local');
    else
        try
            pool=parpool('local',size);%matlabpool('open','local',size);
        catch ce
            pool=parpool('local');%matlabpool('open','local');
            size = pool.NumWorkers;
            display(ce.message);
            display(strcat('restart. wrong  size=',num2str(size)));
        end
    end
else
    display('matlabpool has started');
    if nargin==1
        closematlabpool;
        startmatlabpool(size);
    else
        startmatlabpool();
    end
end


关闭代码:

function [] = closematlabpool
if isempty(gcp('nocreate'))==0
    delete(gcp('nocreate'));
end

测试代码:

pool = startmatlabpool(4);
N=1000;
M=100;
data = cell(1,N);
for kk = 1:N
   data{kk} = rand(M);
end
display(strcat('datasize:',num2str(N*M*M/1024/1024),'M doubles'));
tic;
parfor ii = 1:N
     c1(:,ii) = eig(data{ii});
end
t1 = toc; 
display(strcat('parafor:',num2str(t1),'seconds'));
 
tic;
for ii = 1:N
     c2(:,ii) = eig(data{ii});
end
t2 = toc; 
display(strcat('for:',num2str(t2),'seconds'));
 
closematlabpool;


结果:

datasize:9.5367M doubles
parafor:1.6411seconds
for:3.908seconds
Parallel pool using the 'local' profile is shutting down.

可以看出parfor计算速度快了一半。

 

问答1:能否汇总各个线程的数据?

在openMP中也有这个问答:

for i = 1 : 1000

sum = sum + i;

end

 

如果是并行的话,每个A在线程中都有自己的一份拷贝,那么最后得到的A是不可预计的。

openMP的解决方法是增加了reduction子句:

#pragma omp parallel for reduction(+: sum)

for ( i = 1; i < 1001; i++ )

{

        sum += i;

}

这样sum就是1-1000的和。

在matlab中,matlab自己会默认把sum的加法设置为reduction加法,称为简约/规约操作,反正不进行这个操作的话也没有其他意义。ORZ

代码:

startmatlabpool(4)
sum = 0;
parfor i = 1:1000
    sum = sum + i;
end
sum
closematlabpool;


结果:sum=500500


事实上可以进行连续操作的操作符都支持简约操作,比如*,.*,+,-,&,|,[,expr]等等。

不过简约操作有很多陷阱,所以简化并行操作和增加一致性是非常必要的。

 

问答2:parfor的变量有什么讲究?

其实没什么讲究,比起openMP来parfor要简单的多,好用说不上,但是方便简单的并行操作。所有的变量直接用就行了,书上的各种变量种类都是唬人的,不过请注意非简约操作情况下答案是否正确,以及不要随便修改输入变量(修改后的结果无法预计)。

 

问答3:parfor语句作用域能用break吗?

答案是不能。这个不能在特定情况下直接退出,就是说一旦运行就要执行下去。另外parfor是最低端的并行语句,在作用域内部也不能使用spmd,parfor嵌套,不过可以使用含有parfor的函数。

 

问答4:什么时候使用parfor

其实用了一下感觉他的作用并不大,各种并行控制手段都没有……如果数据量特别大,各个循环域之间相对独立,就可以用parfor。另外matlab启动并行环境也比较慢。


注:本文转载自blog.csdn.net的artzers的文章"https://blog.csdn.net/lpsl1882/article/details/50781288"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top