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

我想在我的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给出了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后缀。