我有一个可执行文件foo.exe
,需要在多处理器设置上同时运行 6 次,其中前 3 个实例将分配给第 0 组中的核心,后 3 个实例将分配给第 1 组中的核心。
foo.exe
我的桌面上有 6 个该程序的快捷方式。每个快捷方式都为该foo.exe
程序提供了一组不同的运行参数。
我只需单击快捷方式即可运行这 6 个程序实例foo.exe
。它们全部启动,但是我必须进入任务管理器,通过设置它们的组亲和性,确保 3 个程序分配给第 0 组中的 CPU,3 个程序分配给第 1 组中的 CPU。
有没有什么方法可以修改我桌面上的快捷方式,以确保其中 3 个foo.exe
程序使用组 0,另外 3 个程序使用组 1?
答案1
您可以使用命令/affinity
中的标志start
来指定进程应使用的核心。
用法
start /affinity n foo.exe -arguments
因此,你的快捷方式将是这样的:
c:\windows\system32\cmd.exe /C start /affinity n foo.exe -arguments
其中 n 是 CPU 核心编号 +1。
因此要在 Core 0 上运行它将是:
c:\windows\system32\cmd.exe /C start /affinity 1 foo.exe -arguments
。
指定多个核心
假设 CPU 有 4 个核心。要指定要使用的核心:
将核心可视化为一个数组,数组长度等于核心数量。核心将按从右到左的降序排列:
[CPU3, CPU2, CPU1, CPU0]
现在,将您希望您的进程使用的核心替换为 1,将您不想使用的核心替换为 0。假设我希望我的进程使用核心 3 和 1,我的数组将如下所示:
[0,1,0,1]
将数组元素“弹出”为字符串。现在它将被表示为
0101
。假设字符串是二进制的,将其转换为十六进制。现在它将是
0x5
现在使用相同的命令
start /affinity n foo.exe -arguments
,但现在n
将是0x5
,给予start /affinity 0x5 foo.exe -arguments
- 源代码将可视化解释为二进制字符串,而不是数组(请查看)。我觉得这有点令人困惑,所以我使用数组来解释。
- 源文件未指定必须
0x
在命令中加上前缀以显示其十六进制。阅读start /?
指定它是十六进制。
答案2
我不知道是否可以在命令行上分配处理器组,但您可以使用 start /node <node_number> /affinity <affinity_value> 设置所需的 NUMA 节点号。Windows 向您承诺整个节点将包含在单个处理器组中。如果节点处理器数量高于 64 个处理器,则 Windows 会将其划分为多个虚拟节点。因此,如果您使用节点,您基本上会将进程设置为在节点的处理器组上运行...