Согласно mbind man page
, одним из возможных mode
является MPOL_LOCAL
, который помещает область памяти в тот же узел ЦП, который инициировал выделение:
#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
Если изменить, например, MPOL_INTERLEAVE
, он скомпилируется и отобразит Hello world!
очень хорошо.
Что здесь происходит?На этом этапе я на 100% озадачен.
Я пробовал с gcc
/ g++
4.9.2, 5 и 8;на трех разных машинах с ядрами 4.17.12+
(понятия не имею, откуда оно взято), 4.18.10
(скомпилировано самостоятельно) и 4.15.0
(включено в последнюю версию Linux Mint).libnuma-dev
актуально.