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

How control which numa node executes my program

我有一个有 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 编写自己的逻辑,以允许其他核心上的剩余线程。

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