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

问题描述:

虽然我试图提高非NUMA /标准PC上应用程序的速度,但我始终发现,瓶颈是对malloc()的呼吁,因为即使在多核计算机中,它也是在所有核心之间共享/同步的。做malloc/memcpy函数在NUMA上独立运行吗?

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

  1. 在NUMA机器,因为每个核心都设置有其自己的内存,将malloc()每个核心独立执行/内存没有阻塞其他内核?
  2. 在这些体系结构中,如何调用memcpy()?这可以在每个内核上独立调用,或者一旦内核阻塞其他内核,就可以调用它。我可能错了,但我记得memcpy()也得到了malloc()的同样的问题,即当一个内核正在使用它时,其他人必须等待。

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

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

至于2中,作为memcpy的由一系列的加载和存储的,唯一的影响将再次使用其他处理器的存储器控​​制器的潜在建筑效果等

+0

嗨,布赖恩。非常感谢。你知道任何NUMA知道的malloc库吗?我搜索了一下,我发现MPC ...在你看来这很好吗? – 2011-03-29 17:04:36

+0

在我写作NUMA知道的东西的罕见时候,我使用VirtualAllocExNuma(Windows)或libnuma(linux)直接从操作系统分配内存。 – Brian 2011-03-30 03:11:25

+0

非常感谢,我会试一试。 – 2011-03-30 14:20:39

  1. 不管您是否在NUMA体系结构中,在独立进程中调用malloc都将独立执行。在同一进程的不同线程中调用malloc不能独立执行,因为返回的内存对进程内的所有线程均可访问。如果您需要特定线程本地的内存,请阅读线程本地存储。我一直无法找到有关Linux VM和调度程序是否能够优化内核,线程,本地内存和线程本地存储之间的相关性的明确文档。
+0

“调用在不同的线程对malloc同样的过程不能独立执行“ - 在非NUMA上,他们可以使用每线程内存池,尽管在不同线程中调用”free“可能不是独立的,因为当然你可以从不同的线程中释放内存你分配它。 – 2011-03-29 11:39:23

+0

但这完全取决于malloc的实现。人们通常使用3. party malloc库(例如tcmalloc)来提高多线程应用程序的性能(尽管tcmalloc和glibc malloc都不考虑NUMA) – nos 2011-03-29 14:10:16

+0

您好Steve。据我所知,内存池只是不断释放的内存块,不会被释放(至少这是我们在非NUMA体系结构中使用的方式)。在我看来,你提出的更多的解决方案是基于某个库做两件事的解决方案:A =创建一个每线程内存池B =重新定义malloc行为。我是正确的还是在操作系统级别为这种硬件指定的东西? – 2011-03-29 15:11:30