我有一个带有4个numa节点的服务器,每个节点有8个带超线程的核心。所以我有64个逻辑CPU。
我有一些程序生成数据和其他消耗数据的程序。这些程序是用c ++(11)编写的。我想启动一些生产者和一些消费者计划。
为了最大限度地提高性能,我喜欢控制程序实例的执行位置。换句话说,消费者程序应该与相应的生产者在同一个numa节点上。
最后,我需要控制程序运行的核心。
我使用的是c ++(11)。
如何控制程序的分配方式?
编辑:也许我应该补充说服务器正在运行Linux。 Linux的解决方案很棒,但支持Linux和Windows的解决方案会更好。答案 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缓存性能集。
您可以围绕该片段编写自己的逻辑,以允许其他核心上的剩余线程。
如果您要控制多个进程而不是多个线程,这仍然有效,但是您需要提前确定核心分配,或创建一个外部服务,每个程序可以询问哪个集合核心是允许的。