我需要将各种c / c ++进程固定到计算机上的特定内核,以便仅在Windows 7 64位上进行基准testing。 我的机器有16个核心(2×8)。 我试图通过调用给定进程的代码内的SetProcessAffinityMask来做到这一点。 假设这是正确的,我不确定如何使用此function。 我已经看过文档,但无法理解第二个参数需要的描述。 我也没有find任何示例c / c + +使用或者在SO或谷歌search。
问题1:以16核心机器(2cpux8)和ac / c ++项目为例,如何使用SetProcessAffinityMask来挑选16个内核,并解释第二个参数以便理解? 我如何将0-15的核心ID转换为等效的位掩码?
问题2:如果在一个CPU上有2个8核而不是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
如前所述,这是一个位掩码。 您可能想要使用GetProcessAffinityMask的结果,因为您的进程或系统已无法访问所有核心。 这是我想出来的。
#include <Windows.h> #include <iostream> using namespace std; int main () { HANDLE process = GetCurrentProcess(); DWORD_PTR processAffinityMask; DWORD_PTR systemAffinityMask; if (!GetProcessAffinityMask(process, &processAffinityMask, &systemAffinityMask)) return -1; int core = 2; /* set this to the core you want your process to run on */ DWORD_PTR mask=0x1; for (int bit=0, currentCore=1; bit < 64; bit++) { if (mask & processAffinityMask) { if (currentCore != core) { processAffinityMask &= ~mask; } currentCore++; } mask = mask << 1; } BOOL success = SetProcessAffinityMask(process, processAffinityMask); cout << success << endl; return 0; }