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

时间:2015-09-30 06:38:40

标签: c++ c linux memory numa

我正在尝试在我的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

1 个答案:

答案 0 :(得分:3)

while IFS=' ' read -ra field; do ... done <<< "$line" 是指向允许的NUMA节点的位掩码的指针。位掩码是nodemask个元素的数组,每个数组元素保持与特定体系结构允许的unsigned long大小一样多的位。除非您的程序在非常大的NUMA系统上运行,否则单个unsigned long int变量就足够了。

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

有许多示例和库可以让您创建并方便地操作位掩码,而无需自己动手操作位操作。您可以使用maxnode。它不允许您设置libnuma策略,但包含用于创建和操作节点掩码的函数。

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

旁注:cpu_set_t可能应以4611686018424767488为后缀。