将 B 组中的线程绑定到它们在 A 组上运行的相同核心比您需要的限制更多。现代处理器为每个内核使用专用的 1 级缓存 (L1) 和 2 级缓存 (L2),因此将线程绑定到特定内核仅对获取这些缓存中仍然“热”的数据才有意义。您可能的意思是将 B 组线程绑定到与 A 组中的线程相同的 numa 节点,以便大型数组位于同一本地内存中。
也就是说,您有两个选择:
- 您将组 A 的亲和性设置为特定的 numa 节点,并使用同一个 numa 节点来设置组 B 的亲和性,或者
- 您找出您的 malloc 数组位于哪个 numa 节点,然后将组 B 的亲和性设置为该 numa 节点。
方案(1)比较简单,下面说说方案(2)如何实现。
以下 SO 答案描述了如何在给定进程中的虚拟地址的情况下找出哪个 numa 节点具有本地内存:
我可以从指针地址(在 Linux 上的 C 中)获取 NUMA 节点吗?
-lnuma 中有一个 move_pages 函数:http://linux.die.net/man/2/move_pages可以将地址(页面)的当前状态报告给节点映射:
nodes 也可以为 NULL,在这种情况下 move_pages() 不会移动任何页面,而是会在状态数组中返回每个页面当前所在的节点。可能需要获取每个页面的状态以确定需要移动的页面。
有了这些信息,您希望将 B 组线程的亲和性设置为该 numa 节点,如何做到这一点,我们去这个 SO 答案
如何确保在多核中创建 std::thread?
对于具有 POSIX 线程的 GNU/linux,您将需要 pthread_setaffinity_np()、FreeBSD cpuset_setaffinity()、Windows SetThreadAffinityMask() 等。