我的服务器有 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/