4

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

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

有没有办法做到这一点?

4

2 回答 2

6

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

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

于 2013-07-08T10:27:52.007 回答
4

你可以看看Hoard memory allocator。我相信它试图解决您遇到的相同问题。

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

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

虚假分享

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

于 2013-07-08T10:21:37.730 回答