我需要将各种c/c ++进程固定到计算机上的特定核心,以便仅在Windows 7 64位上进行基准测试.我的机器有16个核心(2x8).我试图通过从给定进程的代码中调用SetProcessAffinityMask来做到这一点.假设这是正确的我不确定如何使用此功能.我已经看过文档,但我无法理解它对第二个参数需要的描述.我也没有在搜索过的SO或Google上找到任何c/c ++用例.
问题1:以16核机器(2cpux8)和ac/c ++项目为例,请您提供一个说明性示例,说明如何使用SetProcessAffinityMask来挑选16个核心中的每一个,以及对我理解的第二个参数的解释?如何将核心ID从0-15转换为等效的位掩码?
问题2:如果有2x8内核而不是一个cpu上的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;
}
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 13
第二个参数是一个位掩码,其中一个位设置意味着该进程可以在该进程上运行,而一个清楚的位意味着它不能.
在您的情况下,要使每个进程在单独的核心上运行,您可以(对于一种可能性)传递命令行参数,为每个进程提供一个数字,并在进程内使用该数字来确定要使用的处理器:
#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;
}
Run Code Online (Sandbox Code Playgroud)
然后你用以下的方式运行它:
for %c in (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) do test %c
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13519 次 |
| 最近记录: |