#c #linux #multithreading #memory #numa
#c #linux #многопоточность #память #numa
Вопрос:
Когда я выделяю память на определенном узле NUMA с помощью numa_alloc_onnode() вот так :
char *ptr;
if ((ptr = (char *) numa_alloc_onnode(1024,1)) == NULL) {
fprintf(stderr,"Problem in %s line %d allocating memoryn",__FILE__,__LINE__);
return(1);
}
а затем используйте move_pages(), чтобы попытаться подтвердить, что выделенная память действительно находится на узле 1 :
printf("ptr is on node %dn",get_node(ptr));
где
// This function returns the NUMA node that a pointer address resides on.
int get_node(void *p)
{
int status[1];
void *pa;
unsigned long a;
// round p down to the nearest page boundary
a = (unsigned long) p;
a = a - (a % ((unsigned long) getpagesize()));
pa = (void *) a;
if (move_pages(0,1,amp;pa,NULL,status,0) != 0) {
fprintf(stderr,"Problem in %s line %d calling move_pages()n",__FILE__,__LINE__);
abort();
}
return(status[0]);
}
Я получаю ответ «ptr находится на узле -2». Из errno-base.h Я нахожу, что 2 равно ENOENT, а на справочной странице move_pages() указано, что статус -ENOENT в этом контексте означает «Страница отсутствует».
Если я заменю numa_alloc_onnode() обычным malloc(), это работает нормально: я получаю номер узла.
Кто-нибудь имеет представление о том, что здесь происходит?
Заранее спасибо.
Ответ №1:
numa_alloc_onnode(3)
говорит:
All numa memory allocation policy only takes effect when a
page is actually faulted into the address space of a process
by accessing it. The numa_alloc_* functions take care of this
automatically.
Означает ли это, что вам нужно что-то сохранить на вновь выделенной странице, прежде чем ядро действительно предоставит вам страницу?
Комментарии:
1. Вы правы. Вы опередили меня на 12 секунд! Оказывается, что запись в выделенное пространство (подойдет простой ptr [0] = 0;) заставляет приведенный выше код работать так, как ожидалось: он дает мне номер узла. Похоже, чтение не считается. Мне также кажется, что это противоречит справочной странице: это функция numa_alloc_ *, и она не была обработана автоматически! Я работаю на Debian Squeeze, если это уместно.
2. Хех, эта часть про «автоматически» меня тоже смутила — но потом я вспомнил, что она была написана немецким инженером по ядру, который, вероятно, думает о «автоматической настройке механизма сбоя страницы». 🙂