gpt4 book ai didi

c++ - Windows SetThreadAffinityMask 无效

转载 作者:可可西里 更新时间:2023-11-01 10:27:55 26 4
gpt4 key购买 nike

我编写了一个小测试程序,我在其中尝试使用 Windows API 调用 SetThreadAffinityMask 将线程锁定到单个 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 节点掩码,这正是我所期望的。我还遵循了其他地方给出的建议,并打印出由对 SetThreadAffinityMask 的第二次相同调用返回的掩码,它与节点掩码匹配。

但是,通过观察 DoWork 函数执行时的资源监视器,工作被分配给所有核心,而不是仅仅分配给它表面上绑定(bind)的那些。使用 SetThreadAffinityMask 时是否有任何我可能错过的错误?我正在运行 Windows 7 Professional 64 位,DoWork 函数包含一个与 OpenMP 并行的循环,它对三个非常大的数组的元素执行操作(它们组合起来仍然能够适合节点)。

编辑:为了扩展 David Schwartz 给出的答案,在 Windows 上,使用 OpenMP 生成的任何线程都不会继承生成它们的线程的关联性。问题在于此,而不是 SetThreadAffinityMask。

最佳答案

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

关于c++ - Windows SetThreadAffinityMask 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8980393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com