Могу ли я получить узел 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 .