C++中SetProcessAffinityMask的示例用法
Example usage of SetProcessAffinityMask in C++?
我需要将各种c/c++进程固定到机器上的特定核心,以便仅在Windows 7 64位上进行基准测试。我的机器有16个核心(2x8)。我试图通过在给定进程的代码中调用SetProcessAffinityMask来实现这一点。假设这是正确的,我不确定如何使用这个函数。我看过文档,但无法理解它对第二个论点的描述。我也没有在SO或谷歌上搜索到任何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
如前所述,它是一个位掩码。您可能需要使用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;
}
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法