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