增加的工人数量-绩效损失

问题描述 投票:1回答:1

如果我在命令行中输入lscpu

CPU(s):              4
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1

所以我有2个物理核心。

我没有并行计算的背景,但是出于我的目的,我需要它。因此,由于我是MatLab用户,所以我对parfor循环感兴趣,但是我需要了解实际情况。

我从MatLab文档中摘录,默认工人数是使用单个计算线程的每个物理CPU内核的工人数,并且该选择还优化了性能。我想了解的是工人数量如何影响绩效:

[为此,我尝试运行(受this启发)以下标准代码,更改了parpool行中的工作程序数量。

m = 500;
A = randn(m);
N  = 200;
parpool(1); 
tic
x = zeros(1,N);
parfor i=1:N
    x(i) = max(abs(eig(A)));
end
toc

我用井字线测量时间。

[有1个工人:% Elapsed time is 26.534430 seconds.

[有2个工人:% Elapsed time is 14.528462 seconds.

[有3个工人:% Elapsed time is 14.403359 seconds.

[有4个工人:% Elapsed time is 17.946775 seconds.

如果我继续与工人一起工作,则需要更多时间。

我有两个问题:

  1. [我希望有2名工人时表现最佳:为什么有3名工人时我仍然有不错的成绩?

  2. 为什么更多的工人意味着更多的时间?

matlab cpu cpu-usage parfor
1个回答
0
投票

速度的提高不是线性的(工人数量的两倍,因此需要一半的计算时间 错误)。这是由于(几乎)恒定的开销,其中底层的调度程序需要以小块的方式分解问题并组织分发-并最终再次加入结果。这样您将获得保证金收益。看看Gustafson's law on wikipedia

如果问题不是独立的,则变得更糟,以至于每个工人都需要相互沟通。最慢的工人会减慢其他工人的速度,从而使您的整体速度提高。

但是,如果您切换到parpool,(几乎)总会有所改善-问题是是否值得...

BTW,超线程没有任何好处,因为MATLAB根本不使用它。如果它占用计算的CPU,则注册另一个也要在该CPU上执行计算的线程是没有好处的。]

现在,在您的特定情况下:您最多有四个工人。但是,如果同时使用全部四个,则系统可能会冻结。另外,没有办法可以使优先级较高的系统后台任务绕过费用核心的计算,因此计算将被中断。因此,这不太可能是parpool的最佳设置-我建议始终始终使用全1核。

这全都独立于这样一个问题,即这是否是合理数量的测试,以统计地备份您的结果。

© www.soinside.com 2019 - 2024. All rights reserved.