11

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

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

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

2 回答 2

6

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

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

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

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