在 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
位。
周围有许多示例和库,可让您创建和方便地操作位掩码,而无需自己 fiddle 进行位操作。您可以使用 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
为后缀。
我正在尝试在我的 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
位。
周围有许多示例和库,可让您创建和方便地操作位掩码,而无需自己 fiddle 进行位操作。您可以使用 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
为后缀。