2011-11-02 11 views
8

Skonfigurowałem swój kod, aby ostrożnie ładować i przetwarzać dane lokalnie w moim systemie NUMA. Myślę. Oznacza to, że dla celów debugowania naprawdę chciałbym móc korzystać z adresów wskaźnika, do których uzyskuję dostęp w ramach określonej funkcji, która została skonfigurowana przez wiele innych funkcji, do bezpośredniej identyfikacji węzłów NUMA wskazanych w pamięci. jest na stałe, więc mogę sprawdzić, czy wszystko znajduje się w miejscu, w którym powinno się znajdować. czy to możliwe?Czy mogę uzyskać węzeł NUMA z adresu wskaźnika (w języku C w systemie Linux)?

Znalazłem tę prośbę na msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72 dla tego samego, ale odpowiedź używa QueryWorkingSetEx(), która wydaje się być specyficzna dla systemu Windows. Czy można to zrobić w systemie Linux? W szczególności jestem związany z Debian Squeeze.

Dzięki.

Odpowiedz

16

Jest move_pages funkcja w -lnuma: http://linux.die.net/man/2/move_pages

które mogą Raport bieżący stan adresowej (strona) do węzła mapowania:

nodes can also be NULL, in which case move_pages() does not move any pages but instead will return the node where each page currently resides, in the status array. Obtaining the status of each page may be necessary to determine pages that need to be moved.

Tak, połączenie może być tak:

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); 
+0

Korzystanie odpowiedź otrzymuję „Błąd krytyczny: numaif.h: Nie ma takiego pliku lub katalogu”. Czy masz pojęcie, co jest nie tak? – klm123

+1

Ok. Mam to. Nagłówek nie jest dołączony do glibc, ale wymaga zainstalowania libnuma-devel lub podobnego pakietu. – klm123

6

Alternatywnie istnieje funkcja get_mempolicy w -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. 

Zatem, węzeł NUMA strony są wskazał przez ptr sprawdza się:

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