用于测试驱动程序是否支持多个处理器组的启动参数

Windows 7 和 Windows Server 2008 R2 为处理器超过 64 的计算机提供支持。 通过引入 处理器组可以实现此支持。 出于测试目的,可以通过限制组大小,将具有多个逻辑处理器的任何计算机配置为具有多个处理器组。 这意味着,可以在逻辑处理器数不超过 64 的计算机上测试驱动程序和组件,以确保多处理器组兼容性。

注意 Windows 7 中引入的 处理器组概念允许现有 API 和 DDI 继续在具有 64 个以上逻辑处理器的计算机上运行。 通常,组的处理器由关联掩码表示,该掩码长度为 64 位。 具有 64 个以上逻辑处理器的任何计算机都必须具有多个组。 创建进程时,会将进程分配给特定组。 默认情况下,尽管可以显式更改线程相关性,但进程的线程可以在同一组的所有逻辑处理器上运行。 对以关联掩码或处理器编号(而不是组编号)作为参数的任何 API 或 DDI 的调用仅限于影响或报告调用线程组中的这些处理器。 返回关联掩码或处理器编号的 API 或 DDI 也是如此,如 GetSystemInfo

从 Windows 7 开始,应用程序或驱动程序可以使用扩展旧 API 的函数。 这些新的组感知函数接受组号参数来明确限定处理器编号或关联掩码,因此可以操作调用线程组外部的处理器。 当涉及旧 API 或 DDI 时,在计算机的不同组中运行的驱动程序和组件之间的交互可能会引入 bug。 可以在 Windows 7 和 Windows Server 2008 R2 上使用旧的非组感知 API。 但是,驱动程序要求更为严格。 对于具有多个处理器组的计算机上的驱动程序的功能正确性,必须替换任何接受处理器编号或掩码作为参数且没有附带处理器组或返回处理器编号或掩码的 DDI。 这些旧的非组感知 DDI 可能会在具有多个进程组的计算机上执行不正常,因为推断的组可能与调用线程的预期不同。 因此,必须更新使用这些旧版 DDI 并面向 Windows Server 2008 R2 的驱动程序,以使用接口的新扩展版本。 不调用任何使用处理器关联掩码或处理器编号的函数的驱动程序将正常运行,而不考虑处理器的数量。 调用新 DDI 的驱动程序可以在早期版本的 Windows 上运行,方法是包括 procgrp.h 标头、调用 WdmlibProcgrpInitialize,以及针对 处理器组兼容性库 (procgrp.lib) 进行链接。

有关新的组感知 API 和 DDI 的详细信息,请下载白皮书 支持具有 64 个以上逻辑处理器的系统:开发人员指南

若要帮助识别驱动程序和组件中潜在的处理器组相关问题,可以使用 BCDEdit /set 选项。 两个 BCD 启动配置设置 (groupsizemaxgroup)可以将具有多个逻辑处理器的任何计算机配置为支持多个处理器组。 groupaware 选项修改某些 DDI 的行为,并出于测试目的操作组环境。

通过更改组大小创建多个处理器组

groupsize 选项指定组中逻辑处理器的最大数目。 默认情况下,未设置 groupsize 选项,并且任何具有 64 个或更少逻辑处理器的计算机都有一个组,即组 0。

注意 物理处理器或处理器包可以有一个或多个核心或处理器单元,每个核心可以包含一个或多个逻辑处理器。 操作系统将逻辑处理器视为一个逻辑计算引擎。

若要创建多个处理器组,请在提升的命令提示符窗口中运行 BCDEdit /set,并为大小指定小于逻辑处理器总数的新 maxsize 值。 请注意,组大小设置用于测试,不应使用此设置配置发货系统。 maxsize 值可以设置为介于 1 和 64 之间的任意 2 幂(含 1 到 64)。 命令使用以下语法:

bcdedit.exe /set groupsize maxsize

例如,以下命令将组中的最大处理器数设置为 2。

bcdedit.exe /set groupsize 2

如果非 NUMA 计算机具有 8 个逻辑处理器,将 “组大小 ”设置为 2 将创建 4 个处理器组,每个组具有 2 个逻辑处理器。

组 0:1 个 NUMA 节点,包含 1 个包含 2 个逻辑处理器的包

组 1:1 个 NUMA 节点,包含 1 个包含 2 个逻辑处理器的包

组 2:1 个 NUMA 节点,包含 1 个包含 2 个逻辑处理器的包

组 3:1 个 NUMA 节点,包含 1 个包含 2 个逻辑处理器的包

根据设计,非 NUMA 计算机被视为具有一个 NUMA 节点。 由于 NUMA 节点不能跨组,因此重启计算机后,系统会为每个组创建一个节点。

如果将 groupsize 设置为小于物理处理器包中逻辑处理器数的值, (套接字) ,则系统会在重启时重新定义包的概念,以便包不跨组。 这意味着处理器拓扑 API 将报告比实际存在的包更多的包。 这也意味着 Windows (包级别) 处理器许可限制可能会阻止某些处理器包在设置 组大小 时启动。

如果处理器包中定义了多个 NUMA 节点,并且系统将这些节点分配给不同的组,则处理器包可以跨组。

Windows 限制支持的组数。 此数字可能会随着新版本的 Windows 或 Service Pack 版本而更改。 驱动程序或组件不应依赖于 Windows 支持的组数作为常量。 组数限制可能会限制在将小值用于 groupsize 启动选项时允许启动的逻辑处理器数。

若要删除用于测试的 groupsize 设置并返回到每个组 64 个逻辑处理器的默认设置,请使用以下 BCDEdit 命令。

bcdedit.exe /deletevalue groupsize

此命令等效于将 groupsize 设置为 64。

最大化处理器组数

maxgroup 选项是在具有多个逻辑处理器和 NUMA 节点的计算机上创建处理器组的另一种方法。 maxgroup 启动选项对非 NUMA 计算机没有影响。

若要最大化组数,请在提升的命令提示符窗口中运行 BCDEdit /set 命令。 命令使用以下语法:

bcdedit.exe /set maxgroup on

例如,假设一台计算机有 2 个 NUMA 节点,每个节点 1 个处理器包,每个包有 4 个处理器核心,总共有 8 个逻辑处理器。

默认组配置为:

组 0:8 个逻辑处理器、2 个包、2 个 NUMA 节点

如果输入 bcdedt.exe /set maxgroup on 命令,然后重新启动,该命令将生成以下组配置:

组 0:4 个逻辑处理器、1 个包、1 个 NUMA 节点

组 1:4 个逻辑处理器、1 个包、1 个 NUMA 节点

请注意,NUMA 节点以最大化组数的方式分配给组。

若要更改回默认设置,请使用以下 BCDEdit 命令。

bcdedit.exe /set maxgroup off

通过设置组感知启动选项测试Multiple-Group兼容性

Windows 7 和 Windows Server 2008 R2 (groupaware) 引入了新的 BCD 选项,该选项强制驱动程序和组件注意多处理器组环境中的多个组。 groupaware 选项更改一组设备驱动程序函数的行为,以帮助暴露驱动程序和组件中的跨组不兼容性。 当计算机具有 64 个或更少的活动逻辑处理器时,可以使用 groupaware 启动选项以及 groupsizemaxgroup 选项来测试驱动程序与多个组的兼容性。

设置 groupaware 启动选项后,操作系统可确保进程在组 0 以外的组中启动。 这增加了驱动程序和组件之间跨组交互的机会。 选项还修改非组感知的旧函数 KeSetTargetProcessorDpcKeSetSystemAffinityThreadExKeRevertToUserAffinityThreadEx 的行为,以便它们始终在包含活动逻辑处理器的最高编号组上运行。 调用这些旧函数中的任何一个的驱动程序应更改为调用其组感知的对应项 (KeSetTargetProcessorDpcExKeSetSystemGroupAffinityThreadKeRevertToUserGroupAffinityThread) ,

若要测试兼容性,请使用以下 BCDEdit /set 命令。

bcdedit.exe /set groupaware on
旧版非组感知函数 Windows 7 组感知替换

KeSetTargetProcessorDpc

KeSetTargetProcessorDpcEx

KeSetSystemAffinityThreadEx

KeSetSystemGroupAffinityThread

KeRevertToUserAffinityThreadEx

KeRevertToUserGroupAffinityThread

若要将计算机重置为默认设置,请使用以下 BCDEdit 命令。

bcdedit.exe /set groupaware off