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, и они должны определить его, смотрите здесь.

Другие вопросы по тегам