我有一台带有2个CPU的服务器,每个CPU有6个核心。每个CPU都连接到4 GB的RAM。我有一个并行程序,在两个CPU中并行运行相同的代码(稍作更改),每个核心使用4个线程。
出于效率原因,最好是有一种方法可以确保在CPU 1上运行的代码只在其相应的RAM上分配内存,而不是在CPU 2的RAM上分配内存,反之亦然,因为它们之间的通信CPU会产生开销。
有没有办法做到这一点?
答案 0 :(得分:5)
假设您使用的是Linux ,默认的NUMA策略更喜欢在本地分配内存,因此您要求的内容应该是开箱即用的。这可以通过配置来改变。
无论当前策略是什么,您都可以使用libnuma
在本地NUMA节点(即RAM +套接字/核心的组合)或特定节点上使用numa_alloc_local
分配内存, numa_alloc_onnode
,等等。要释放内存,请使用numa_free
。有关这些功能和NUMA系统的详细信息,请参阅numa(7)和numa_alloc(3)的手册页。
答案 1 :(得分:4)
您可以查看Hoard memory allocator。我相信它试图解决你遇到的同样问题。
Hoard是malloc的替代品,可以显着提高应用程序性能,尤其适用于在多处理器和多核CPU上运行的多线程程序
特别是,“虚假分享”的问题似乎是你想要避免的。
虚假分享
分配器可能会导致多线程代码出现其他问题。它可能导致应用程序中的错误共享:不同CPU上的线程最终可能会在同一缓存行或内存块中占用内存。访问这些错误共享的缓存行比访问非共享缓存行慢几百倍。