越来越多的工人——表现不佳



如果我在命令行中键入lscpu

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

所以我有两个物理核心。

我没有并行计算的背景,但出于我的目的,我需要它。因此,由于我是MatLab的用户,我对parfor循环很感兴趣,但我需要了解到底发生了什么

我从MatLab文档中了解到,默认的工作者数量是使用单个计算线程的每个物理CPU核心一个,而且这种选择优化了性能。我想了解的是员工数量如何影响绩效:

为此,我尝试运行(受此启发(以下标准代码,更改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

我用tic-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. 为什么更多的员工意味着更多的时间

速度的增益不是线性的(是工人数量的两倍,因此所需的一半计算时间是错误的(。这是由于(几乎(恒定的开销,在这种开销中,底层调度器需要在chunck中分解问题并组织分发,最终再次加入结果。因此,您将获得边际收益。看看古斯塔夫森在维基百科上的定律。

如果问题不是独立的,那么情况会变得更糟,因此各个工人需要相互沟通。最慢的工人放慢速度,其他工人会吃掉你的整体速度。

然而,如果你切换到parpool,(几乎(总是有改进的——问题是它是否值得…

顺便说一句,超线程没有任何好处,因为MATLAB根本不使用它。如果它占用了一个CPU进行计算,那么注册第二个线程也要在这个CPU上执行计算就没有任何好处。。。

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

这完全独立于这样一个问题,即这是否是一个合理的测试数量来从统计上支持你的结果。

最新更新