【问题标题】:do malloc/memcpy function run independently on NUMA?malloc/memcpy 函数在 NUMA 上独立运行吗?
【发布时间】:2011-07-25 04:02:49
【问题描述】:

在尝试提高我的应用程序在非 NUMA/标准 PC 上的速度时,我总是发现瓶颈是对 malloc() 的调用,因为即使在多核机器中,它也是在所有内核之间共享/同步的。

我有一台使用 Linux 和 C 的 NUMA 架构的 PC,我有两个问题:

  1. 在 NUMA 机器中,由于每个内核都有自己的内存,malloc() 是否会在每个内核/内存上独立执行而不会阻塞其他内核?
  2. 在这些架构中,如何调用memcpy()?可以在每个核心上独立调用它,还是在一个核心中调用它会阻塞其他核心?我可能错了,但我记得memcpy() 也遇到了与malloc() 相同的问题,即当一个核心正在使用它时,其他核心必须等待。

【问题讨论】:

    标签: c memory malloc memcpy numa


    【解决方案1】:
    1. 无论您是否在 NUMA 架构上,对单独进程中的 malloc 的调用都将独立执行。在同一进程的不同线程中对 malloc 的调用不能独立执行,因为返回的内存对进程内的所有线程都是平等的。如果您想要特定线程的本地内存,请阅读线程本地存储。我还没有找到任何关于 Linux VM 和调度程序是否能够优化内核、线程、本地内存和线程本地存储之间的关联性的明确文档。

    【讨论】:

    • "在同一进程的不同线程中调用 malloc 不能独立执行" - 在非 NUMA 上,它们可以使用每个线程的内存池,但在不同线程中调用 free 可能不会独立的,因为您当然可以在分配内存的不同线程中释放内存。
    • 但这完全取决于 malloc 的实现。人们通常使用 3.party malloc 库(例如 tcmalloc)来提高多线程应用程序的性能(尽管 tcmalloc 和 glibc malloc 都没有考虑 NUMA)
    • 嗨史蒂夫。据我所知,内存池只是连续预分配的内存块,永远不会被释放(..至少我在非 NUMA 架构中是这样使用的)。在我看来,您提出的更多是基于某些库做两件事的解决方案: A=为每个线程创建一个内存池 B=重新定义 malloc 行为。我是正确的,还是真的在操作系统级别为这种硬件指定了一些东西?
    • @Abruzzo:我认为“池”在不同的上下文中用于不同的事物。池并不一定意味着无法释放单个分配的东西,是的,我的意思是malloc 实现可以做到这一点。我添加了评论,因为我不确定 Al 在这句话中是在谈论 NUMA 还是非 NUMA 架构(或两者),我只是想说明这取决于 malloc 内存实际来自的实现,并且通常 Linux 允许您选择一个分配器,它可以避免malloc 上的大多数争用。
    • 附注我还发现了 libnuma 和 TCMalloc,但它似乎不够好(至少 TCMalloc 似乎只适用于非 NUMA)。
    【解决方案2】:

    NUMA 机器是共享内存系统,因此来自任何处理器的内存访问都可以到达内存而不会阻塞。如果内存模型是基于消息的,那么访问远程内存将需要执行处理器请求本地处理器执行所需的操作。但是,在 NUMA 系统中,由于使用了内存链接,远程处理器仍可能影响关闭处理器的性能,但这可能取决于特定的架构配置。

    至于1,这完全取决于操作系统和malloc库。操作系统负责将每个核心/每个处理器的内存呈现为统一空间或 NUMA。 Malloc 可能知道也可能不知道 NUMA。但从根本上说,malloc 实现可能会也可能不会与其他请求同时执行。 Al 的回答(以及相关讨论)更详细地说明了这一点。

    至于 2,由于 memcpy 由一系列加载和存储组成,唯一的影响将再次是使用其他处理器的内存控制器等的潜在架构影响。

    【讨论】:

    • 嗨,布莱恩。非常感谢。您是否知道任何支持 NUMA 的良好 malloc 库?我用谷歌搜索,我发现了 MPC……你认为它好吗?
    • 在极少数情况下,我正在编写一些支持 NUMA 的内容,我会使用 VirtualAllocExNuma (Windows) 或 libnuma (linux) 直接从操作系统分配内存。
    • 非常感谢,我会试一试的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2016-06-19
    • 1970-01-01
    • 2017-11-29
    • 2014-10-21
    • 2016-12-07
    • 2013-05-22
    相关资源
    最近更新 更多