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

时间:2015-04-09 20:22:00

标签: c++ numa

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

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

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

最后,我需要控制程序运行的核心。

我使用的是c ++(11)。

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

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

1 个答案:

答案 0 :(得分:2)

此代码应使您的线程在特定核心或核心子集上运行 - 在此示例中为核心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缓存性能集。

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

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