在C ++中使用SetProcessAffinityMask的示例?

时间:2012-10-09 15:36:25

标签: c++ windows

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

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

}

2 个答案:

答案 0 :(得分:12)

第二个参数是一个位掩码,其中一个位设置意味着该进程可以在该进程上运行,而一个清楚意味着它不能运行。

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

#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

答案 1 :(得分:2)

如前所述,它是一个位掩码。您可能希望使用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; 

}