2011-11-02 10 views
8

He configurado mi código para cargar y procesar datos localmente en mi sistema NUMA. Creo. Es decir, para fines de depuración, me gustaría poder utilizar las direcciones del puntero a las que se accede dentro de una función particular, que han sido configuradas por muchas otras funciones, para identificar directamente los nodos NUMA a los que apuntaba la memoria. está residiendo, entonces puedo verificar que todo esté ubicado donde debería estar ubicado. es posible?¿Puedo obtener el nodo NUMA desde una dirección de puntero (en C en Linux)?

Encontré esta solicitud en msdn http://social.msdn.microsoft.com/Forums/en-US/parallelcppnative/thread/37a02e17-e160-48d9-8625-871ff6b21f72 para la misma cosa, pero la respuesta usa QueryWorkingSetEx() que parece ser específico de Windows. ¿Se puede hacer esto en Linux? Estoy en Debian Squeeze, para ser precisos.

Gracias.

Respuesta

16

Hay una función de move_pages en -lnuma: http://linux.die.net/man/2/move_pages

que puede reportar el estado actual de la dirección (página) al nodo asignaciones:

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.

Por lo tanto, la llamada puede ser como:

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

Utilizando su respuesta me sale "error fatal: numaif.h: No existe el fichero o directorio". ¿Tienes una idea de lo que está mal? – klm123

+1

Ok. Entiendo. El encabezado no se incluye con glibc, pero requiere instalar libnuma-devel o un paquete similar. – klm123

6

Alternativamente, hay una función get_mempolicy en -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. 

Por lo tanto, el nodo NUMA de una página que se está apuntado por ptr se comprueba con:

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