有没有在C/ c++代码中使用mbind的例子?
Is there any example of using mbind in C/C++ code?
我试图在我的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
给出了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
作为后缀