numaif.h: MPOL_LOCAL необъявленный для использования в mbind - PullRequest
0 голосов
/ 03 октября 2018

Согласно 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 Ответ

0 голосов
/ 03 октября 2018

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

...