使用SetThreadAffinityMask()动态选择要在哪些线程上运行
Using SetThreadAffinityMask() to dynamically choose which threads to run on
我正在编写一个基准测试程序,我想要的是在不同的内核上一个接一个地运行一个线程。因此,例如,它将只在核心0上运行工作,然后在核心0、1、1、2、3上运行,然后在0、1,2、3、4、5、6、7上运行(如果机器有8个核心)。我对需要传递给SetThreadAffinityMask()
的第二个参数感到困惑。
我可以传递一个十进制数,也可以传递一种十六进制数。在十六进制中,我可以通过:
0x0001 for core 0,
0x0003 for cores 0,1,
0x000F for cores 0,1,2,3
但我正在努力找出如何动态地创造这些价值观。本质上,对于任何给定数量的内核,我都需要能够获得十六进制值,以将所有内核的亲和力设置为该数量。任何关于从哪里开始的帮助都将是非常好的。
"所有核到(但不包括)N"需要掩码值2N-1,因此:
(static_cast<DWORD_PTR>(1) << N) - 1;
位值为1 << core_number
。所以,如果你有这样的东西:
vector<int> cpus_to_use = { 1, 3, 9, 11 };
然后你可以通过制作亲和掩模
int mask = 0;
for( i : cpus_to_use)
mask |= 1 << i;
如果您只想设置ALL位,那么(1 << num_cores) - 1
将为您设置num_cores
位。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 如何使线程运行现有类的函数?C++
- 使用 4 个和 8 个线程运行时执行的时间相等
- 在我调用join()之前,std ::线程运行
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 如何确保这部分代码仅由一个线程运行(在 openmp 中)
- 线程连接在另一个线程运行时会导致分段错误
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 如何启动一个 boost::线程运行一个成员函数
- 如果由另一个 OpenMP 程序调用,则外部调用的 OpenMP 程序仅使用一个线程运行
- 线程运行时间最少
- 计算线程运行的次数
- MySQL C API:从不同线程运行查询时出现分段错误
- 使用两个线程运行和中断一个无限循环
- 与icc 14一起使用多线程运行时库时的错误
- 为什么我得到无限循环只有线程# 0后,所有5个线程运行多线程c++用餐哲学家谜语
- 发布配置上的Visual Studio c++多线程运行时问题
- 使用逻辑线程运行程序
- 为什么设置 CPU 关联会使线程运行速度变慢