繁体   English   中英

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

[英]How to allocate memory in a specific place in memory (C programming)?

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

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

有没有办法做到这一点?

假设您使用的是Linux,默认的NUMA策略更喜欢在本地分配内存,因此您要求的内容应该是开箱即用的。 这可以通过配置来改变。

无论当前的策略是什么,您都可以使用libnuma在本地NUMA节点(即RAM +套接字/核心的组合)或特定节点上分配内存,使用numa_alloc_localnuma_alloc_onnode等。 要释放内存,请使用numa_free 有关这些功能和NUMA系统的详细信息,请参见numa(7)numa_alloc(3)的手册页。

你可以看看Hoard内存分配器 我相信它试图解决你遇到的同样问题。

Hoard是malloc的直接替代品,可以显着提高应用程序性能,尤其适用于在多处理器和多核CPU上运行的多线程程序

特别是,“虚假分享”的问题似乎是你想要避免的。

虚假分享

分配器可能会导致多线程代码的其他问题。 它可能导致应用程序中的错误共享:不同CPU上的线程最终可能会在同一缓存行或内存块中占用内存。 访问这些错误共享的缓存行比访问非共享缓存行慢几百倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM