[闲聊] The 64 Core Threshold (Windows)

楼主: hcwang1126 (王小胖)   2020-06-23 18:57:53
The 64 Core Threshold – Processor Groups on Windows
https://bitsum.com/general/the-64-core-threshold-processor-groups-and-windows/
这是软件Process Lasso的文章
买AMD 3990X要注意 (电虾点
Windows上有个64核心的限制
超过会增加processor groups
产生的问题之一
就是不容易把效能用尽
如果应用程式不知道这个限制的话
专业用途还是别用Windows (连server版都别用
拿来数框框就好
知道我英不出多核和关HT的原因了吧(误
延伸阅读:
https://docs.microsoft.com/en-us/windows/win32/procthread/processor-groups
翻译本文(虽然翻译完我更懂了,但是还是建议直接看原文):
TL; DR –微软通过添加processor group, 解决 (原文hacked)了对64个以上logical
CPU cores的支援。除非编写应用程式利用多个processor group(processor group
aware),否则将仅调度到单个处理器组(ex: 128 logical processors = group1 +
group2;单个意谓著只有group1)。请参阅我们新的groupextend项目,以通过调度补充处
理器组的线程来使不知道processor group的应用程式充分利用CPU,Process Lasso现在
也提供了此功能。
随着具有64个以上逻辑CPU核心的系统变得常见,了解Windows的一些基本限制也变得重要
起来。当初设计Windows NT时,使用64位bitmask表示整个系统中的CPU affinities。对
于当时使用的单核CPU来说,这似乎是足够的。现在,64个核心的限制已经不够了。为了
解决这个问题……
Windows 2008 R2导入了processor group,以支持64个以上的逻辑CPU核心。每个组最多
具有64个核心。现有的API和系统功能可以继续接受64位CPU affinity bitmasks,因为它
们隐式地在单个处理器组上运行。这意味着,应用程式在没有相应的处理的情况下,每个
process都限于一个处理器组,最多不超过64个逻辑核心。
因此,您在“Process Lasso”中看到的process(应用程式)CPU affinity是应用程式的
默认处理器组。作业系统就是这样应对的。因此,如果您拥有96个逻辑核心系统,则将看
到多达48个逻辑核心的应用程序CPU affinity。如果应用程式在第一组上,则该CPU
affinity将代表前48个逻辑核心。如果应用程式在第二组中,则CPU affinity将代表后48
个逻辑核心。
默认处理器组是以轮循方式分配的,通常是per-session分配,因为CPU affinity是
继承的,因此session load最终大致分配在处理器组之间。应用程式启动后,将无法更改
其默认的处理器组。
但是,可以将应用程式中的各个threads手动分配给该应用程序的默认组以外的组。
SetThreadGroupAffinity和其它thread API支援处理器组的规范。这样,一个应用程式的
threads可以在多个处理器组上运行,但是必须手动分配它们。理想情况下,这是由应用
程式开发人员实现的,因为了解threads在做什么以及应将threads放置在何处非常重要

将threads分配给应用程式默认设置以外的其它组后,该应用程式将成为一个多组。但是
,新threads将继续使用应用程式启动时分配的默认组。
当应用程式的threads跨越多个处理器组时,由于该应用程式的CPU affinity bitmask仅
适用于应用程序式启动时分配的默认处理器组,因此可能会造成混淆。
处理器组通常由少于64个核心组成,因为它们不能跨越NUMA节点,并且必须平均划分。拥
有不同大小的处理器组是奇怪的,这导致应用程式根据分配给它们的处理器组而获得更多
或更少的核心。
因此,在具有72个逻辑CPU核心,分为两个NUMA节点的系统上,将创建两个处理器组,每
个处理器组具有36个逻辑CPU核心。
这创建了一个有趣的场景,其中具有多达64个核心的Windows系统可能允许应用程式访问
比具有64个以上核心的系统更多的核心。(Ex:64 (64 x 2) > 72(36 x 4), Z > B...原文
后面有个更清楚的例子)
为了演示其影响,我们想像一个不知道处理器组的应用程式,恰当地命名为
UnawareOfGroupsApp.exe。
如您所见,在48核系统上,我们的不知道procssor group的应用程序可以访问48个CPU核
,而在72核系统上只能访问36个!如果这种情况下出现问题,则您的选择如下:
1.禁用超线程/ SMT,以将逻辑核心数减少到64个或更少,从而导致整体计算能力下降
。由于单个处理器组包括所有可用的内核,因此这将允许组不知道的进程使用更多的内核

2.请与应用程式开发人员联系,以使他们对其进行修改以使其能够识别processor
group。
3.与Bitsum联系以了解我们能为您做什么。我们可以适应团体不了解的应用程序。更新
:请参阅下面的groupextend工具。
使用这种设计,用户应该在升级硬件之前检查应用程式的组支持,并尝试选择CPU核心计
数为64的倍数的硬件,因为这将得到最大的处理器组大小。
作者: qweertyui891 (摸鱼厨师)   2020-06-23 19:45:00
还好4c8t没有这个问题

Links booklink

Contact Us: admin [ a t ] ucptt.com