【问题标题】:Binding two threads in subsequent groups of threads to the same core将后续线程组中的两个线程绑定到同一个核心
【发布时间】:2014-05-13 16:16:40
【问题描述】:

在这个应用程序中,我有一组 N (POSIX) 线程。第一组开始,创建一个对象 A,然后结束。稍后,一个具有 N 个线程的新组启动,使用 A 创建一个类似的对象 B,然后结束。这种模式是重复的。该应用程序是高度内存密集型的(A 和 B 有大量 malloc'ed 数组)。我希望尽可能地在本地访问内存。我可以使用numactl --localalloc 来实现这一点,但为了让它工作,我还需要确保第一组和第二组中处理相同数据的线程绑定到同一个NUMA 节点。我研究了sched_setaffinity,但想知道是否存在更好的方法。

应用程序的逻辑使得没有单独线程组的解决方案会破坏程序逻辑。也就是说,单组线程管理第一个对象 A 和后来的对象 B(中间没有结束)的解决方案将是非常人为的,并且会消除代码的面向对象布局。

【问题讨论】:

    标签: multithreading memory-management pthreads numactl


    【解决方案1】:

    将 B 组中的线程绑定到它们在 A 组上运行的相同内核比您需要的限制更多。现代处理器对每个内核使用专用的 1 级缓存 (L1) 和 2 级缓存 (L2),因此将线程绑定到特定内核仅对获取这些缓存中仍然“热”的数据才有意义。您可能的意思是将 B 组线程绑定到与 A 组中的线程相同的 numa 节点,以便大型数组位于同一本地内存中。

    也就是说,你有两个选择:

    1. 您将 A 组的亲和性设置为特定的 numa 节点,然后使用同一 numa 节点设置 B 组的亲和性,或者
    2. 您找出您的 malloc 数组位于哪个 numa 节点,然后将组 B 的关联设置到该 numa 节点。

    选项(1)比较简单,下面说说选项(2)如何实现。

    以下 SO 答案描述了如何在给定进程中的虚拟地址的情况下找出哪个 numa 节点具有本地内存:

    Can I get the NUMA node from a pointer address (in C on Linux)?

    -lnuma 中有一个 move_pages 函数:http://linux.die.net/man/2/move_pages 可以将地址(页面)的当前状态报告给节点映射:

    nodes 也可以为 NULL,在这种情况下 move_pages() 不会移动任何页面,而是会在状态数组中返回每个页面当前所在的节点。可能需要获取每个页面的状态以确定需要移动的页面。

    有了这些信息,您想将 B 组线程的亲和性设置为该 numa 节点,如何做到这一点,我们去这个 SO 答案

    How to ensure that std::thread are created in multi core?

    对于具有 POSIX 线程的 GNU/linux,您将需要 pthread_setaffinity_np()、FreeBSD 中的 cpuset_setaffinity()、Windows SetThreadAffinityMask() 等。

    【讨论】:

    • 谢谢 - 绝对是指 numa 节点,有点草率且不熟悉术语。非常有用的信息。恐怕我只需要 1) - 所以我应该选择 sched_setaffinity - 对吗?我有点担心将有关可用 CPU 集的信息传递给程序——这似乎是必要的要求。我已经寻找一种方法来自动确定程序可用的 CPU 集,如果这有意义的话(这样每个线程都知道它需要绑定到哪个 CPU 集)。这可能吗,还是不是正确的问题?
    • 另一种可能性是在进程启动之前将进程中的线程限制到特定节点。这样,除了numactl --localalloc 从本地节点请求内存之外,将确保 A 组和 B 组中的线程始终在内存所在的节点中运行。您可以使用--cpunodebind 选项来做到这一点。请注意,这样做会将您的应用程序限制在单个节点上,因此,如果您的应用程序是该节点上唯一的应用程序,并且您的应用程序不会从更多线程中受益,那么这是一个胜利。
    • 目的是跨多个 NUMA 节点进行扩展。我目前的理解是我可以使用numactl --localalloc --cpunodebind=cpus。为了获得跨组的一致性,我希望可以使用pthread_attr_getaffinity_nppthread_attr_setaffinity_np。首先,我至少可以开始报告线程与集合的绑定。缺点是这些是不可移植 (np) 扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多