我想在我的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
。
nodemask
是指向允许的NUMA节点的位掩码的指针。 位掩码是unsigned long
元素的数组,每个数组元素在特定体系结构中允许保持与unsigned long int
的大小相同的位数。 除非你的程序运行在一个非常大的NUMA系统上,否则一个unsigned long
变量就足够了。
maxnode
给出了maxnode
中有效位的nodemask
。 内核将内部大小调整为sizeof(unsigned long)
的倍数,但仅使用maxnode
位。
有很多的例子和库可以让你创建和方便地操作位掩码而不必自己动手操作位操作。 你可以利用libnuma
。 它不允许您设置MPOL_MF_MOVE
策略,但包含创建和操作节点掩码的函数。
一个可怕的,非常不可移植的Linux pro-tip:处理CPU亲和性掩码的现有宏,即CPU_ZERO
/ CPU_SET
/ CPU_CLR
和关联的数据结构cpu_set_t
也可以用于NUMA节点掩码。 原因是(1)两者都是作为unsigned long
数组实现的,(2)通常NUMA节点比逻辑CPU少,因此cpu_set_t
应该有足够的位来表示系统上的所有NUMA节点。
附注: 4611686018424767488
可能应该加上LL
后缀。