2010-01-26 9 views
10

Si tengo una placa multiprocesador que tiene cache-coherentnon-uniform memory access (NUMA), es decir, "northbridges" separada con memoria RAM para cada procesador, ¿sabe algún compilador cómo distribuir automáticamente los datos entre los diferentes sistemas de memoria de manera que los procesos que trabajan en hilos locales se recuperen principalmente sus datos de la RAM asociada con el procesador en el que se está ejecutando el subproceso?¿Gcc, icc o el compilador C/C++ de Microsoft admiten o saben algo sobre NUMA?

Tengo una configuración donde 1 GB está conectado al procesador 0, 1 GB está conectado al procesador 1, et c. hasta 4 procesadores. En el coherent memory space, la memoria física de la RAM en el primer procesador es de 0 a 1 GB-1. Para el segundo procesador, es de 1 GB a 2 GB-1, y así sucesivamente.

¿Algún compilador, o quizás malloc específicamente, asocia la memoria nueva asignada por un proceso en un núcleo específico a la RAM física asociada con ese núcleo?

+0

Fuera de interés, ¿quién es el fabricante de la placa? –

+0

He planteado la pregunta de esta manera, pero mi problema original tiene que ver con un número de núcleos en 1 dado y el costo de hacer un acceso de memoria para núcleos en diferentes partes del chip para diferentes regiones de memoria. –

Respuesta

7

Linux núcleo sabe de la NUMA y tratará de dar a sus páginas de proceso de la memoria local a la CPU actual (fuente:. U. Drepper, "What Every Programmer Should Know About Memory")

+5

... y de hecho * necesita * hacerse en el kernel, porque en general los procesos de espacio de usuario no controlan cómo se mapean sus direcciones lineales en direcciones físicas, ya que no tienen control de sus tablas de páginas. – caf

4

Para plataformas MS, el compilador no tiene conocimiento de NUMA. Sin embargo, el sistema es consciente de NUMA e intentará asignar memoria en el mismo nodo.

Consulte http://code.msdn.microsoft.com/64plusLP para obtener más detalles sobre cómo las versiones recientes de Windows manejan NUMA.

5

NUMA asignación de memoria no se realiza en tiempo de compilación. Hacer suposiciones como esta sería malo para la portabilidad.

En Linux, esta es una función de kernel, aunque puede controlar esto en tiempo de ejecución con numactl o set_mempolicy o con libnuma.

Cuestiones relacionadas