如何在内存中的特定位置分配内存(C编程)?

时间:2013-07-08 10:11:24

标签: c memory memory-management parallel-processing ram

我有一台带有2个CPU的服务器,每个CPU有6个核心。每个CPU都连接到4 GB的RAM。我有一个并行程序,在两个CPU中并行运行相同的代码(稍作更改),每个核心使用4个线程。

出于效率原因,最好是有一种方法可以确保在CPU 1上运行的代码只在其相应的RAM上分配内存,而不是在CPU 2的RAM上分配内存,反之亦然,因为它们之间的通信CPU会产生开销。

有没有办法做到这一点?

2 个答案:

答案 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上的线程最终可能会在同一缓存行或内存块中占用内存。访问这些错误共享的缓存行比访问非共享缓存行慢几百倍。