Могу ли я получить узел NUMA по адресу указателя (в C на Linux)? - PullRequest
10 голосов
/ 03 ноября 2011

Я настроил свой код для локальной загрузки и обработки данных в моей системе NUMA.Я думаю.То есть, для целей отладки я действительно хотел бы иметь возможность использовать адреса указателей, к которым обращаются внутри определенной функции, которые были установлены многими другими функциями, чтобы непосредственно идентифицировать узлы (узлы) NUMA, на которые указала памятьнаходится на, так что я могу проверить, что все находится там, где оно должно быть.Возможно ли это?

Я нашел этот запрос на msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72 для того же, но в ответе используется QueryWorkingSetEx (), который, похоже, специфичен для Windows.Можно ли это сделать в Linux?Я в Debian Squeeze, если быть точным.

Спасибо.

Ответы [ 2 ]

20 голосов
/ 05 ноября 2011

В -lnuma имеется функция move_pages: http://linux.die.net/man/2/move_pages

, которая может сообщать о текущем состоянии адреса (страницы) в сопоставлениях узлов: узлы

также могутбыть NULL, и в этом случае move_pages () не перемещает никакие страницы, а вместо этого вернет узел, где в настоящее время находится каждая страница, в массиве состояния.Получение статуса каждой страницы может быть необходимо для определения страниц, которые необходимо переместить.

Итак, звонок может быть таким:

 void * ptr_to_check = your_address;
 /*here you should align ptr_to_check to page boundary */
 int status[1];
 int ret_code;
 status[0]=-1;
 ret_code=move_pages(0 /*self memory */, 1, &ptr_to_check,
    NULL, status, 0);
 printf("Memory at %p is at %d node (retcode %d)\n", ptr_to_check, status[0], ret_code);
9 голосов
/ 07 июня 2013

В качестве альтернативы есть функция get_mempolicy в -lnuma: http://linux.die.net/man/2/get_mempolicy

If flags specifies both MPOL_F_NODE and MPOL_F_ADDR, get_mempolicy() will 
return the node ID of the node on which the address addr is allocated into 
the location pointed to by mode. If no page has yet been allocated for the 
specified address, get_mempolicy() will allocate a page as if the process had 
performed a read [load] access to that address, and return the ID of the node 
where that page was allocated. 

Таким образом, узел numa страницы, на которую указывает ptr, проверяется с помощью:

int numa_node = -1;
get_mempolicy(&numa_node, NULL, 0, (void*)ptr, MPOL_F_NODE | MPOL_F_ADDR);
return numa_node;
...