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

Is there any example of using mbind in C/C++ code?

本文关键字:mbind c++ 代码 有没有      更新时间:2023-10-16

我试图在我的c++代码中使用mbind(),以便重新排列跨4 NUMA域的虚拟页面,不幸的是,我是这个函数的新手:

long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask,   
              unsigned long maxnode, unsigned flags);

目前,我有这样的东西:

mbind(0x0,4611686018424767488,MPOL_BIND,nodemask,maxnode,MPOL_MF_MOVE);

从规格来看,我仍然不清楚nodemaskmaxnode应该放什么以及如何放。

nodemask是一个指向NUMA节点位掩码的指针。位掩码是一个unsigned long元素的数组,每个数组元素在特定体系结构上所允许的unsigned long int的大小中保留尽可能多的位。除非您的程序运行在一个非常大的NUMA系统上,否则单个unsigned long变量应该足够了。

maxnode给出了nodemask的有效位数。内核内部将大小舍入为sizeof(unsigned long)的倍数,但只使用maxnode位。

有很多例子和库允许你创建和方便地操作位掩码,而不必自己摆弄位操作。您可以使用libnuma。它不允许您设置MPOL_MF_MOVE策略,但包含用于创建和操作节点掩码的函数。

一个可怕且非常不可移植的Linux专业提示:现有的处理CPU亲和掩码的宏,即CPU_ZERO/CPU_SET/CPU_CLR和相关的数据结构cpu_set_t也可以用于NUMA节点掩码。原因是:(1)两者都是作为unsigned long的数组实现的;(2)NUMA节点通常比逻辑cpu少,因此cpu_set_t应该有足够的比特来表示系统上的所有NUMA节点。

旁注:4611686018424767488可能应该以LL作为后缀