Могу ли я получить узел NUMA по адресу указателя (в C на Linux)?

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

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

Благодарю.

4 ответа

Решение

Есть move_pages функция в -lnuma: 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);

В качестве альтернативы, есть 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;

Если вы знаете адрес возврата вашего mmap, попробуйте проверить /proc/{pid}/numa_maps. Вы увидите что-то вроде

      14ab47200000 interleave:2-3 anon=1171400 dirty=1171400 N2=585690 N3=585710 kernelpagesize_kB=4

Это означает, что адрес 0x14ab47200000 чередуется с узлом 2 и узлом 3 (N3). Подробности смотрите на https://linux.die.net/man/5/numa_maps .

В режиме ядра мы можем использовать lookup_node().

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