【问题标题】:parfeval slower than parforparfeval 比 parfor 慢
【发布时间】:2017-01-27 16:46:47
【问题描述】:

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

parfor k = 1:N
    a = rand(5000);
    b = inv(a);
end

对比

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 基本上将每个循环作为并行作业运行。

【问题讨论】:

  • 相关阅读:stackoverflow.com/questions/32146555/… inv 操作确实是隐式多线程的,因此在上面使用 parfor 并不能让它更快(参见我链接的帖子)。
  • 非常有意义。我在多线程函数中查看但没有找到 inv 但我相信你。我仍然不确定这是否解释了与 parfor 相比更慢的 parfeval

标签: matlab parallel-processing distributed


【解决方案1】:

你的理解是正确的。

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

在第一种情况下,5000 x 5000 矩阵的逆矩阵似乎需要大量计算,但 MATLAB 针对这些类型的运算(尤其是矩阵运算)进行了优化。

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

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

我敢冒险,只有在size(a) >> N 的情况下,您才会看到parfor 的表现优于parfeval 的情况。

编辑 @Adriaan 也制作了 a great pointinv 也是一个隐式并行函数,就像大多数 MATLAB 函数一样。

【讨论】:

  • 我想我不太理解你的回答:“在你的第二个用例中使用 parfeval 意味着你正在按顺序评估每个矩阵的逆(即使你正在并行化逆函数)”我想我正在通过调用 parfeval 进行并行化,它仍然没有并行化?
  • 我不会说大多数 MATLAB 函数都是并行的;我宁愿说大多数在您尝试edit <functionname> 时不显示代码的函数都是预编译函数(在 C++ afaik 中),并且它们已经在速度方面进行了优化。可以找到隐式多线程函数的完整列表here
  • 这是完全错误的。 parfeval 正在并行化逆。
【解决方案2】:

两者之间的任何差异都可能是由于您没有在第二种情况下并行化逆。

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

初始化:

p = gcp;
N = p.NumWorkers;

选项 A:

tic;
b = zeros( N, 1 );
parfor k = 1 : N;
    b( k ) = max( max( abs( inv( rand( 5000 ) ) ) ) );
end;
toc;

选项 B:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2021-07-06
    • 2012-09-05
    相关资源
    最近更新 更多