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

Matlab 工人数量增加-绩效损失,matlab,cpu,cpu-usage,parfor,Matlab,Cpu,Cpu Usage,Parfor,如果我在命令行中键入lscpu: CPU(s): 4 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 所以我有两个物理核心 我没有并行计算的背景知识,但我需要它。因此,由于我是一名MatLab用户,我对parfor循环感兴趣,但我需要了解到底发生了什么 我从MatLab文档中了解到,默认的工作人员数量是使用单个计算线程的每个物理CPU核心一个,而且这个选择优化了性能。我想了解的是

如果我在命令行中键入
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个工作线程:
%经过的时间为26.534430秒。

有两个工人:
%经过的时间是14.528462秒。

有3个工人:
%经过的时间是14.403359秒。

对于4个工人:
%经过的时间为17.946775秒。

如果我继续和工人们打交道,那需要更多的时间

我有两个问题:

  • 我希望有两名员工的表现最好:为什么有三名员工我的成绩仍然很好?

  • 为什么更多的员工意味着更多的时间?


  • 速度的增加不是线性的(工作人员数量的两倍,因此所需计算时间的一半是错误的)。这是由于(几乎)恒定的开销造成的,在这种开销中,底层调度程序需要在chuncks中解决问题并组织分发--最终再次加入结果。因此,您将获得利润收益。看一看

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

    然而,如果您切换到
    parpool
    ,则(几乎)总会有一个改进——问题是这是否值得

    顺便说一句,超线程没有任何好处,因为MATLAB根本不使用它。如果它占用一个CPU进行计算,那么注册另一个同样希望在此CPU上执行计算的线程没有任何优势


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


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

    N太小,无法测试。parfor的开销很大。尝试N=4000…“我建议始终使用all-1 core作为最大值。”我不明白你的意思。你的意思是使用**1 worker x physical core“,(如MatLab所建议的)?那么,来回答我的第二个问题:“更多的worker=>更多的时间“因为调度程序需要划分工作并将其发送给每个工作人员,这就是速度减慢的原因,对吗?你几乎做到了:调度程序需要更多的时间,如果你使用所有内核,你的操作系统将需要中断MATLAB任务以执行它们自己的任务(响应鼠标移动、安全扫描等)。这就是为什么如果你有4个核心,你应该使用不超过3个工人的原因。这回答了我的第二个问题,实际上也是第一个问题。但你为什么提到4核?我有两个物理核心,而不是四个。那么,我应该选择多少工人?我想只有两个工人,但如果我错了请告诉我对不起我的错。如果您有两个工人,那么将工人数量增加到2人以上绝对没有好处(实际上我认为MATLAB可以防止这种情况发生)。如果您使用并行计算,请不要关闭所有可以关闭的程序,从而使您的计算机和其他程序的CPU时间最小化…我会忘记2个CPU的并行计算