在哪些情况下 GetSystemInfo/GetLogicalProcessorInformationEx returns 同一程序中的不同处理器计数 运行?
In which cases GetSystemInfo/GetLogicalProcessorInformationEx returns different processor count within the same program run?
有WindowsAPI函数获取CPU和CPU缓存拓扑。
GetSystemInfo
用 dwActiveProcessorMask
和 dwNumberOfProcessors
.
填充 SYSTEM_INFO
GetLogicalProcessorInformationEx
can be used to have more precise information about each processor, like cache size, cache line size, cache associativity, etc. Some of this information can be obtained by _cpuidex
也是。
我想问的是在哪些情况下一次调用获得的值与另一次调用获得的值不一致,如果两次调用都是在没有程序重新启动的情况下进行的。
具体可以CPU算出变化:
- 用户应该休眠、安装新处理器并唤醒系统吗?或者连这个都行不通?
- 或者操作系统/硬件可以动态决定插入另一个处理器?
- 或者用虚拟机可以实现,但在真实硬件上不行?
能否更改缓存行大小和缓存大小:
- 对于
GetLogicalProcessorInformationEx
,因为处理器在运行时被替换
- 对于
_cpuid
只是因为系统包含具有不同缓存属性的处理器,并且后续调用在不同的处理器上
这些问题的实际原因是我只想获取一次这些信息,并缓存它:
- 我将用它来调整分配器,因此更改已分配内存的分配策略可能会导致内存损坏。
- 这些函数可能很昂贵,它们可能是我想避免的内核调用
如果一个线程被调度到 运行 一个属于不同处理器组且处理器数量不同的内核上,GetSystemInfo
和 GetLogicalProcessorInformation
将 return不同数量的处理器,即核心所属组中的处理器数量。
在支持 hot-adding CPU 的 server-grade 系统上,处理器数量可以按如下方式更改:
- Hot-adding 一个 CPU 这样有一个处理器组少于 64 个处理器并且该组上的线程 运行ning 将改变 [=报告的处理器数量=10=]、
GetLogicalProcessorInformation
和
GetLogicalProcessorInformationEx
.
- 处理器组的最大大小为 64,Windows 始终以最小化组总数的方式创建组。因此,组数是逻辑核心总数的上限除以 64。Hot-adding a CPU 可能会导致创建新组。这不仅会改变处理器总数,还会改变组数,只能通过
GetLogicalProcessorInformationEx
. 获得
在虚拟机上,处理器数量也可以动态增加,无需hot-plugging。
您可以使用 PNPCPU 工具模拟 hot-adding 处理器。这对于测试一段取决于处理器数量的代码的正确性很有用。
通过编写设备驱动程序并注册 synchronous or asynchronous 驱动程序通知,可以在添加新处理器时从系统接收通知。如果没有设备驱动程序,我认为这是不可能的。
我认为,在当前系统上,由 GetLogicalProcessorInformationEx
编辑的缓存属性 return 只能在线程迁移到另一个核心时发生变化,或者 CPU 其中一个或多个属性不同.例如,在 Intel Lakefield 处理器上,L2 缓存的属性取决于线程在哪个核心 运行ning,因为不同的核心具有不同属性的不同 L2 缓存。
有WindowsAPI函数获取CPU和CPU缓存拓扑。
GetSystemInfo
用 dwActiveProcessorMask
和 dwNumberOfProcessors
.
SYSTEM_INFO
GetLogicalProcessorInformationEx
can be used to have more precise information about each processor, like cache size, cache line size, cache associativity, etc. Some of this information can be obtained by _cpuidex
也是。
我想问的是在哪些情况下一次调用获得的值与另一次调用获得的值不一致,如果两次调用都是在没有程序重新启动的情况下进行的。
具体可以CPU算出变化:
- 用户应该休眠、安装新处理器并唤醒系统吗?或者连这个都行不通?
- 或者操作系统/硬件可以动态决定插入另一个处理器?
- 或者用虚拟机可以实现,但在真实硬件上不行?
能否更改缓存行大小和缓存大小:
- 对于
GetLogicalProcessorInformationEx
,因为处理器在运行时被替换 - 对于
_cpuid
只是因为系统包含具有不同缓存属性的处理器,并且后续调用在不同的处理器上
这些问题的实际原因是我只想获取一次这些信息,并缓存它:
- 我将用它来调整分配器,因此更改已分配内存的分配策略可能会导致内存损坏。
- 这些函数可能很昂贵,它们可能是我想避免的内核调用
如果一个线程被调度到 运行 一个属于不同处理器组且处理器数量不同的内核上,GetSystemInfo
和 GetLogicalProcessorInformation
将 return不同数量的处理器,即核心所属组中的处理器数量。
在支持 hot-adding CPU 的 server-grade 系统上,处理器数量可以按如下方式更改:
- Hot-adding 一个 CPU 这样有一个处理器组少于 64 个处理器并且该组上的线程 运行ning 将改变 [=报告的处理器数量=10=]、
GetLogicalProcessorInformation
和GetLogicalProcessorInformationEx
. - 处理器组的最大大小为 64,Windows 始终以最小化组总数的方式创建组。因此,组数是逻辑核心总数的上限除以 64。Hot-adding a CPU 可能会导致创建新组。这不仅会改变处理器总数,还会改变组数,只能通过
GetLogicalProcessorInformationEx
. 获得
在虚拟机上,处理器数量也可以动态增加,无需hot-plugging。
您可以使用 PNPCPU 工具模拟 hot-adding 处理器。这对于测试一段取决于处理器数量的代码的正确性很有用。
通过编写设备驱动程序并注册 synchronous or asynchronous 驱动程序通知,可以在添加新处理器时从系统接收通知。如果没有设备驱动程序,我认为这是不可能的。
我认为,在当前系统上,由 GetLogicalProcessorInformationEx
编辑的缓存属性 return 只能在线程迁移到另一个核心时发生变化,或者 CPU 其中一个或多个属性不同.例如,在 Intel Lakefield 处理器上,L2 缓存的属性取决于线程在哪个核心 运行ning,因为不同的核心具有不同属性的不同 L2 缓存。