首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >parfeval比parfor慢

parfeval比parfor慢
EN

Stack Overflow用户
提问于 2016-09-20 05:42:56
回答 2查看 1.3K关注 0票数 2

我比较了两个块之间的执行时间,一个使用parfor,另一个通过发出parfeval和获取输出来做同样的事情:

代码语言:javascript
复制
parfor k = 1:N
    a = rand(5000);
    b = inv(a);
end

代码语言:javascript
复制
for k = 1:N
    a = rand(5000);
    F(k) = parfeval(p,'inv',1,a);
end
for k = 1:N
    [completedIdx,value] = fetchNext(F);
    fprintf(1,'%d   ',completedIdx);
end

parfor的速度始终如一。对于为什么会这样,有什么见解吗?我的理解很简单,parfor本质上是将每个循环作为一个并行作业运行。

EN

回答 2

Stack Overflow用户

发布于 2016-09-20 06:16:56

你的理解是正确的。

通过使用parfeval运行循环,您无法利用并行计算工具箱的强大功能。

在第一种情况下,5000x5000矩阵的求逆看起来像是计算密集型的,但是MATLAB针对这些类型的操作(特别是矩阵操作)进行了优化。

众所周知,MATLAB的一个弱点是循环,在您的第二个用例中使用parfeval意味着您将按顺序计算每个矩阵的逆(即使您正在并行化逆函数)。

通过使用parfor,您可以并行化代码中最耗时的部分。

我敢说,只有在size(a) >> N的情况下,您才会看到parforparfeval超越的情况。

编辑 @Adriaan也制作a great point。与大多数inv函数一样,MATLAB也是一个隐式并行化函数。

票数 0
EN

Stack Overflow用户

发布于 2019-05-27 18:39:21

两者之间的任何差异很可能是因为您在第二种情况下没有并行化相反的情况。

对我来说,以下两个选项需要相同的时间。

Init:

代码语言:javascript
复制
p = gcp;
N = p.NumWorkers;

选项A:

代码语言:javascript
复制
tic;
b = zeros( N, 1 );
parfor k = 1 : N;
    b( k ) = max( max( abs( inv( rand( 5000 ) ) ) ) );
end;
toc;

选项B:

代码语言:javascript
复制
tic;
F = repmat(parallel.FevalFuture,N,1);
for k = 1:N;
    F(k) = parfeval( p, @() max( max( abs( inv( rand( 5000 ) ) ) ) ), 1 );
end;
b = fetchOutputs( F );
toc;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39582588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档