如果我在命令行中输入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.
如果我继续与工人一起工作,则需要更多时间。
我有两个问题:
[我希望有2名工人时表现最佳:为什么有3名工人时我仍然有不错的成绩?
为什么更多的工人意味着更多的时间?
速度的提高不是线性的(工人数量的两倍,因此需要一半的计算时间 错误)。这是由于(几乎)恒定的开销,其中底层的调度程序需要以小块的方式分解问题并组织分发-并最终再次加入结果。这样您将获得保证金收益。看看Gustafson's law on wikipedia。
如果问题不是独立的,则变得更糟,以至于每个工人都需要相互沟通。最慢的工人会减慢其他工人的速度,从而使您的整体速度提高。
但是,如果您切换到parpool
,(几乎)总会有所改善-问题是是否值得...
BTW,超线程没有任何好处,因为MATLAB根本不使用它。如果它占用计算的CPU,则注册另一个也要在该CPU上执行计算的线程是没有好处的。]
现在,在您的特定情况下:您最多有四个工人。但是,如果同时使用全部四个,则系统可能会冻结。另外,没有办法可以使优先级较高的系统后台任务绕过费用核心的计算,因此计算将被中断。因此,这不太可能是parpool
的最佳设置-我建议始终始终使用全1核。
这全都独立于这样一个问题,即这是否是合理数量的测试,以统计地备份您的结果。