微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows SetThreadAffinityMask没有效果

我写了一个小的testing程序,我尝试使用Windows API调用SetThreadAffinityMask将线程locking到单个NUMA节点。 我使用GetNumaNodeProcessorMask API调用检索节点的cpu位掩码,然后将该位掩码与GetCurrentThread返回的线程句柄一起传递给SetThreadAffinityMask。 这是我的代码一个大大简化的版本:

// Inside a function called from a boost::thread unsigned long long nodeMask = 0; GetNumaNodeProcessorMask(1,&nodeMask); HANDLE thread = GetCurrentThread(); SetThreadAffinityMask(thread,nodeMask); DoWork(); // make-work function

我当然要检查我的代码中的API调用是否返回0,并且我还打印出了NUMA节点掩码,这正是我所期望的。 我也遵循其他地方给出的build议,并打印出由第二个相同的调用SetThreadAffinityMask返回的掩码,它与节点掩码相匹配。

但是,从DoWork函数执行时看资源监视器,工作被拆分到所有内核中,而不是仅仅被看作是绑定的那些内核。 使用SetThreadAffinityMask时,有没有可能错过的旅程? 我正在运行Windows 7 Professional 64位,DoWork函数包含一个与OpenMP并行的循环,它对三个非常大的数组(这些数组合仍然能够适应节点)的元素执行操作。

编辑:为了扩展David Schwartz给出的答案,在Windows上,OpenMP生成的任何线程都不会inheritance产生它们的线程的亲和性。 问题在于,不是SetThreadAffinityMask。

使用Ruby自动化SSH到Windows

FOR / F循环中的虚假“system cmd.exe”

Windows 8应用在线数据

在哪里写日志的Windows应用程序

有什么好的(function)neural network模拟器的Windows?

Python,Windows – 在启动信息中用wShowWindow打开Popen不影响显示

graphviz /点崩溃(原来是由于错误的安装引起的)

将操作系统/ 2系统function移植到Microsoft Windows粗略等效

IIS程序化pipe理的架构参考

Visual C#(Visual Studio)和Mono C#GUI之间的区别

您是否确认亲和性掩码在另一个numa节点的核心上运行的特定线程? 否则,它按预期工作。 您在一个线程上设置处理器掩码,然后观察一组线程的行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐