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

5
我有一台服务器,有两个CPU,每个CPU有6个核心。每个CPU都连接着4GB的RAM。我有一个并行程序,在两个CPU上同时运行相同的代码(稍有不同),每个核心使用4个线程。
为了提高效率,最好有一种方法可以确保在CPU 1上运行的代码只分配其对应的内存,而不是在CPU 2的内存上分配,反之亦然,因为CPU之间的通信会产生开销。
是否有任何方法可以做到这一点?

1
我相信内核已经做了你想要的事情。 - Basile Starynkevitch
默认情况下需要更改配置并重新编译内核才能实现此功能吗? - Gonçalo Silva Santos
1
物理内存位置由操作系统控制。您的应用程序在虚拟内存中运行,其页面可以位于物理内存中的任何位置,甚至可以分页到磁盘上。更不用说缓存了。 - Tarik
@Tarik 已经采取措施防止磁盘分页。 - Gonçalo Silva Santos
即使页面被固定在内存中,操作系统仍然控制虚拟内存中每个页面的位置。 - Tarik
2个回答

7
假设您正在使用Linux,默认的NUMA策略更喜欢本地分配内存,因此您所需要的应该可以直接使用。不过这可以通过配置进行更改。
无论当前的策略如何,您都可以使用libnuma在本地NUMA节点(也就是RAM + socket / core的组合)或特定节点上分配内存,使用numa_alloc_localnuma_alloc_onnode等函数。要释放内存,请使用numa_free。有关这些函数和NUMA系统的详细信息,请参阅numa(7)numa_alloc(3)的手册页面。

我已经在使用CPUSET和GOMP将特定线程锁定到特定核心。cpuset手册讲解了内存节点以及进程如何锁定到CPU和其内存节点。这是否与您所指的相同? - Gonçalo Silva Santos

4
你可以看一下 Hoard内存分配器。我相信它试图解决你遇到的同样问题。
Hoard是malloc的即插即用替代品,可以显著提高应用程序性能,特别是在多处理器和多核CPU上运行的多线程程序中。
尤其是“伪共享”问题似乎是你想要避免的。
“伪共享”是分配器对多线程代码的其他问题。它可能导致您的应用程序中的伪共享:不同CPU上的线程可能会以相同的缓存行或内存块结束。访问这些虚假共享的缓存行比访问未共享的缓存行慢数百倍。

感谢Karthik提供的有用信息! - Tarik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接