根据mbind man page
,一种可能mode
是MPOL_LOCAL
,它将内存区域放置在触发分配的 CPU 的同一节点中:
#include <numaif.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define N 134217728
int main() {
uint64_t *a = (uint64_t*) malloc(N*sizeof(uint64_t));
mbind(a, N, MPOL_LOCAL, 0, 0, MPOL_MF_STRICT | MPOL_MF_MOVE);
printf("Hello world!\n");
return 0;
}
但是,符号根本没有定义。
$ gcc-8 -lnuma example.c
example.c: In function ‘main’:
example.c:10:14: error: ‘MPOL_LOCAL’ undeclared (first use in this function); did you mean ‘MPOL_MAX’?
mbind(a, N, MPOL_LOCAL, 0, 0, MPOL_MF_STRICT | MPOL_MF_MOVE);
^~~~~~~~~~
MPOL_MAX
example.c:10:14: note: each undeclared identifier is reported only once for each function it appears in
更改为 egMPOL_INTERLEAVE
使其编译和显示Hello world!
就好了。
这里发生了什么?在这个阶段,我 100% 感到困惑。
我试过gcc
/ g++
4.9.2、5 和 8;在运行内核的三台不同的机器中4.17.12+
(不知道它来自哪里),4.18.10
(我自己编译)和4.15.0
(包含在最新的 Linux Mint 中)。libnuma-dev
已是最新。