我正在尝试在我的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);
根据规格,我仍然不清楚要放置什么以及如何放置nodemask
和maxnode
。
答案 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
为后缀。