有没有在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);

从规格上来说,我仍然不清楚在nodemask和maxnode中该放置什么以及如何放置.

解决方法:

nodemask是指向允许的NUMA节点的位掩码的指针.位掩码是无符号长元素的数组,每个数组元素所保存的位数与特定体系结构上无符号长整数的大小一样.除非您的程序在非常大的NUMA系统上运行,否则一个无符号的long变量就足够了.

maxnode给出节点掩码中的有效位数.内核在内部将大小取整为sizeof(无符号长)的倍数,但仅使用maxnode位.

周围有许多示例和库,这些示例和库使您可以创建和方便地操作位掩码,而不必自己搞乱位操作.您可以利用libnuma.它不允许您设置MPOL_MF_MOVE策略,但包括用于创建和操作节点掩码的函数.

一个可怕且非常不可移植的Linux专业提示:处理CPU亲和力掩码的现有宏,即CPU_ZERO / CPU_SET / CPU_CLR和关联的数据结构cpu_set_t,也可以用于NUMA节点掩码.这样做的原因是(1)都被实现为无符号长数组,并且(2)通常NUMA节点少于逻辑CPU,因此cpu_set_t应该具有足够的位以能够表示系统上的所有NUMA节点.

旁注:4611686018424767488应该在LL后缀.

上一篇:c – 使用numa_alloc_onnode()分配小块是否有限制?


下一篇:大数减法(A - B Problem Plus)问题思路及C语言实现