做malloc/memcpy函数在NUMA上独立运行吗?
虽然我试图提高非NUMA /标准PC上应用程序的速度,但我始终发现,瓶颈是对malloc()
的呼吁,因为即使在多核计算机中,它也是在所有核心之间共享/同步的。做malloc/memcpy函数在NUMA上独立运行吗?
我有使用Linux和C和NUMA架构提供一台PC,我有两个问题:
- 在NUMA机器,因为每个核心都设置有其自己的内存,将
malloc()
每个核心独立执行/内存没有阻塞其他内核? - 在这些体系结构中,如何调用
memcpy()
?这可以在每个内核上独立调用,或者一旦内核阻塞其他内核,就可以调用它。我可能错了,但我记得memcpy()
也得到了malloc()
的同样的问题,即当一个内核正在使用它时,其他人必须等待。
NUMA机器是一个共享内存系统,所以来自任何处理器的内存访问都可以不受阻塞地访问内存。如果内存模型是基于消息的,则访问远程内存将需要执行处理器请求本地处理器执行期望的操作。但是,在NUMA系统中,由于使用了内存链接,远程处理器仍可能会影响关闭处理器的性能,但这可能取决于特定的体系结构配置。
至于1,这完全取决于OS和malloc库。操作系统负责将每个内核/每个处理器的内存显示为统一空间或NUMA。 Malloc可能或不可能是NUMA意识的。但从根本上讲,malloc实现可能会或可能不会与其他请求同时执行。 Al(以及相关讨论)的答案更详细地阐述了这一点。
至于2中,作为memcpy的由一系列的加载和存储的,唯一的影响将再次使用其他处理器的存储器控制器的潜在建筑效果等
- 不管您是否在NUMA体系结构中,在独立进程中调用malloc都将独立执行。在同一进程的不同线程中调用malloc不能独立执行,因为返回的内存对进程内的所有线程均可访问。如果您需要特定线程本地的内存,请阅读线程本地存储。我一直无法找到有关Linux VM和调度程序是否能够优化内核,线程,本地内存和线程本地存储之间的相关性的明确文档。
“调用在不同的线程对malloc同样的过程不能独立执行“ - 在非NUMA上,他们可以使用每线程内存池,尽管在不同线程中调用”free“可能不是独立的,因为当然你可以从不同的线程中释放内存你分配它。 – 2011-03-29 11:39:23
但这完全取决于malloc的实现。人们通常使用3. party malloc库(例如tcmalloc)来提高多线程应用程序的性能(尽管tcmalloc和glibc malloc都不考虑NUMA) – nos 2011-03-29 14:10:16
您好Steve。据我所知,内存池只是不断释放的内存块,不会被释放(至少这是我们在非NUMA体系结构中使用的方式)。在我看来,你提出的更多的解决方案是基于某个库做两件事的解决方案:A =创建一个每线程内存池B =重新定义malloc行为。我是正确的还是在操作系统级别为这种硬件指定的东西? – 2011-03-29 15:11:30
嗨,布赖恩。非常感谢。你知道任何NUMA知道的malloc库吗?我搜索了一下,我发现MPC ...在你看来这很好吗? – 2011-03-29 17:04:36
在我写作NUMA知道的东西的罕见时候,我使用VirtualAllocExNuma(Windows)或libnuma(linux)直接从操作系统分配内存。 – Brian 2011-03-30 03:11:25
非常感谢,我会试一试。 – 2011-03-30 14:20:39