c++ - 如何控制哪个 numa 节点执行我的程序

标签 c++ numa

我的服务器有 4 个 numa 节点,每个节点有 8 个带超线程的内核。所以我有 64 个逻辑 CPU。

我有一些程序生成数据和其他程序使用数据。这些程序是用 c++ (11) 编写的。我想启动多个生产者和多个消费者程序。

为了最大限度地提高性能,我喜欢控制程序实例的执行位置。换句话说,消费者程序应该与相应的生产者在同一个 numa 节点上。

最后我需要控制程序运行在哪个内核上。

我正在使用 C++ (11)。

如何控制程序的分发方式?

编辑:也许我应该补充一点,服务器正在运行 Linux。 Linux 的解决方案会很棒,但同时支持 Linux 和 Windows 的解决方案会更好。

最佳答案

此代码应使您的线程在特定核心或核心子集上运行——在本例中为核心 17 和 18;

cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(17, &cpuset);
CPU_SET(18, &cpuset);
if (pthread_setaffinity_np(thread[0], sizeof(cpu_set_t), &cpuset) != 0)
    throw error"Failed to set affinity for thread");  

您可以允许您的线程与多个核心具有亲和性,因此您可以设置掩码,以便允许同一 cpu 上的任何核心,或者修改允许集以获得最大的 L2/L3 缓存性能。

您可以围绕该 sniplet 编写自己的逻辑,以允许其他核心上的剩余线程。

如果您想要控制多个进程而不是多个线程,这仍然有效,但是您需要提前确定核心分配,或者创建一个外部服务,每个程序都可以请求哪个集合的核心是允许的。

关于c++ - 如何控制哪个 numa 节点执行我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29548235/

相关文章:

c++ - C++ 类中冗余测试函数的影响

c++ - std::regex_replace 给了我意想不到的结果

c++ - 松弛的内存顺序会导致这里无限循环吗?

c++ - 在 XP 中也加载的 DLL 中使用新的 Vista 线程池 API(XP 中未使用线程池代码)

c - NUMA 架构上不同数据类型的 OpenMP 性能

c - 如何在 Windows 10 上通过 openMP 使用所有 NUMA 节点

c++ - 返回链表中的最大值

memory - 现代 Linux 中是否有 NUMA 下次接触策略

windows - NUMA-本地内存

c++ - 有没有在 C/C++ 代码中使用 mbind 的例子?