在NUMA上独立运行malloc / memcpy函数吗?

时间:2011-03-29 10:21:54

标签: c memory malloc memcpy numa

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

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

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

2 个答案:

答案 0 :(得分:6)

NUMA机器是一个共享内存系统,因此任何处理器的内存访问都可以在不阻塞的情况下到达内存。如果存储器模型是基于消息的,则访问远程存储器将要求执行处理器请求本地处理器执行期望的操作。但是,在NUMA系统中,由于使用内存链接,远程处理器仍可能影响关闭处理器的性能,但这可能取决于特定的体系结构配置。

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

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

答案 1 :(得分:2)

  1. 无论您是否使用NUMA架构,在单独进程中调用malloc都将独立执行。在同一进程的不同线程中调用malloc不能独立执行,因为返回的内存对进程内的所有线程同样可访问。如果您想要特定线程的本地内存,请阅读线程本地存储。我无法找到关于Linux VM和调度程序是否能够优化内核,线程,本地内存和线程本地存储之间的关联的任何明确文档。