【问题标题】:Using SetThreadAffinityMask() to dynamically choose which threads to run on使用 SetThreadAffinityMask() 动态选择要在哪些线程上运行
【发布时间】:2013-07-26 13:27:48
【问题描述】:

我正在编写一个基准测试程序,我想要的是一个接一个地在不同的内核上运行一个线程。例如,它将仅在核心 0 上运行工作,然后在核心 0,1 上,然后在核心 0,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

但我正在努力研究如何动态创建这些值。基本上对于任何给定数量的核心,我需要能够获得十六进制值以将所有核心的亲和力设置为该数量。任何关于从哪里开始的帮助都会很棒。

【问题讨论】:

    标签: c++ windows winapi visual-c++


    【解决方案1】:

    “所有的内核达到(但不包括)N”需要掩码值 2N - 1,所以:

    (static_cast<DWORD_PTR>(1) << N) - 1;
    

    【讨论】:

      【解决方案2】:

      位值为1 &lt;&lt; core_number。所以如果你有这样的事情:

      vector<int> cpus_to_use = { 1, 3, 9, 11 }; 
      

      然后您可以通过以下方式制作亲和掩码:

      int mask = 0;
      for( i : cpus_to_use) 
          mask |= 1 << i; 
      

      如果您只想设置所有位,那么(1 &lt;&lt; num_cores) - 1 将为您提供num_cores 位设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多