gpt4 book ai didi

c++ - C++ 中 SetProcessAffinityMask 的示例用法?

转载 作者:可可西里 更新时间:2023-11-01 12:41:08 31 4
gpt4 key购买 nike

我需要将各种 c/c++ 进程固定到机器上的特定内核,以便仅在 Windows 7 64 位上进行基准测试。我的机器有 16 个内核 (2x8)。我试图通过从给定进程的代码中调用 SetProcessAffinityMask 来实现这一点。假设这是正确的,我不确定如何使用这个函数。我看过文档,但无法理解它对第二个参数的描述。我也没有在 SO 或 Google 上搜索过任何示例 c/c++ 用法。

问题 1:以 16 核机器(2cpux8)为例和一个 c/c++ 项目,请您提供一个说明性示例,说明如何使用 SetProcessAffinityMask 来选择 16 个核中的每一个,并解释第二个参数,以便我理解?我如何将核心 ID 从 0-15 转换为其等效的位掩码?

问题 2:如果一个 cpu 上有 2x8 个内核而不是 16 个内核,这对使用有影响吗?还是一样的用法?

非常感谢。这是我目前所拥有的。

#include <Windows.h>
#include <iostream>

using namespace std;

int main () {

HANDLE process = GetCurrentProcess();

DWORD_PTR processAffinityMask = 0; /// What to do here?

BOOL success = SetProcessAffinityMask(process, processAffinityMask);

cout << success << endl;

return 0;

}

最佳答案

第二个参数是位掩码,设置的位表示进程可以在该处理器上运行,清除的位表示不能。

在您的情况下,要让每个进程在单独的核心上运行,您可以(一种可能性)传递一个命令行参数,为每个进程提供一个数字,并在进程内使用该数字来确定要使用的处理器:

#include <Windows.h>
#include <iostream>

using namespace std;

int main (int argc, char **argv) {
HANDLE process = GetCurrentProcess();
DWORD_PTR processAffinityMask = 1 << atoi(argv[1]);

BOOL success = SetProcessAffinityMask(process, processAffinityMask);

cout << success << endl;
return 0;
}

然后你会用类似的东西运行它:

for %c in (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) do test %c

关于c++ - C++ 中 SetProcessAffinityMask 的示例用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12803585/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com