在尝试提高我在非NUMA /标准PC上的应用程序的速度时,我总是发现瓶颈是对malloc()
的调用,因为即使在多核机器中它也是所有内核之间的共享/同步
我有一台使用Linux和C的NUMA架构的PC,我有两个问题:
malloc()
是否会在每个内核/内存上独立执行而不会阻塞其他内核?memcpy()
?这可以在每个核心上独立调用,或者在核心中调用它会阻止其他核心吗?我可能错了,但我记得memcpy()
也遇到malloc()
同样的问题,即当一个核心正在使用它时,其他核心必须等待。答案 0 :(得分:6)
NUMA机器是一个共享内存系统,因此任何处理器的内存访问都可以在不阻塞的情况下到达内存。如果存储器模型是基于消息的,则访问远程存储器将要求执行处理器请求本地处理器执行期望的操作。但是,在NUMA系统中,由于使用内存链接,远程处理器仍可能影响关闭处理器的性能,但这可能取决于特定的体系结构配置。
对于1,这完全取决于OS和malloc库。操作系统负责将每核/每处理器内存呈现为统一空间或NUMA。 Malloc可能是也可能不是NUMA感知的。但从根本上说,malloc实现可能或可能不能与其他请求同时执行。 Al(以及相关讨论)的答案更详细地阐述了这一点。
对于2,由于memcpy由一系列加载和存储组成,唯一的影响将是使用其他处理器的内存控制器等的潜在架构效应。
答案 1 :(得分:2)