15

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

问题1:以16核机器(2cpux8)和ac / 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;

}
4

2 回答 2

16

第二个参数是位掩码,其中设置的位意味着进程可以在该处理器上运行,而明确的位意味着它不能。

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

#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
于 2012-10-09T15:45:46.427 回答
3

如前所述,它是一个位掩码。您可能想要使用 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;
            } else
            {
                if ( !(systemAffinityMask & mask) )
                {
                    cerr << "Core " << core << " not enabled in system." << endl;
                }
            }
            currentCore++;
        }
        mask = mask << 1;
    }

    BOOL success = SetProcessAffinityMask(process, processAffinityMask & systemAffinityMask); 
 
    cout << success << endl; 
 
    return 0; 
 
} 
于 2012-10-09T16:05:02.607 回答