numaif.h: MPOL_LOCAL необъявленный для использования в mbind
Согласно 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
до даты.
1 ответ
MPOL_LOCAL объявлен стороной ядра в uapi / linux / mempolicy.h и равен 4. Он в UAPI, так что на самом деле вы можете #include <linux/mempolicy.h>
,
MPOL_LOCAL должен быть объявлен на стороне пользователя в numaif.h как на странице руководства. Я не понимаю, почему это не так, наряду с другими определениями. Также меняется определение для MPOL_MAX - на стороне ядра оно равно MPOL_LOCAL + 1 = 5
, но в numaif.h он равен MPOL_INTERLEAVE = 3
, Я ожидал бы, что MPOL_MAX будет на один больше максимального MPOL или равно максимальному значению с обеих сторон, но ядро и инструмент пространства пользователя определяют его по-разному.
Я думаю, что стоит сообщить о проблеме в numactl, чтобы уведомить разработчиков. Согласно справочной странице это должно быть определено. Я не знаю, почему это не так.
На данный момент, я бы просто
#include <numaif.h>
#ifndef MPOL_LOCAL
#define MPOL_LOCAL 4
#endif
Я просмотрел сеть, чтобы узнать, как разные программы справляются с этим. Я думаю, что программы просто определяют все символы MPOL_* сами, смотрите hwloc или стресс-нг. fio только что определил MPOL_LOCAL как равный 4. Open-mpi даже отмечает, что numaif.h
не определяет MPOL_LOCAL, и они должны определить его, смотрите здесь.