2011-03-29 18 views
7

Al tratar de aumentar la velocidad de mis aplicaciones en PCs no NUMA/estándar, siempre encontré que el cuello de botella era la llamada a malloc() porque incluso en máquinas multi-core es compartida/sincronizada entre todos los núcleos.¿La función do malloc/memcpy se ejecuta de forma independiente en NUMA?

que disponer de un PC con una arquitectura NUMA el uso de Linux y C y tengo dos preguntas:

  1. En una máquina NUMA, ya que cada núcleo está provisto con su propia memoria, a malloc() ejecuten de forma independiente en cada núcleo/memoria sin bloquear los otros núcleos?
  2. En estas arquitecturas, ¿cómo se realizan las llamadas a memcpy()? ¿Se puede llamar esto independientemente en cada núcleo o, llamándolo una vez que el núcleo bloqueará a los otros? Tal vez estoy equivocado, pero recuerdo que también memcpy() tiene el mismo problema que malloc(), es decir, cuando un núcleo lo está usando, los demás tienen que esperar.

Respuesta

4

Una máquina NUMA es un sistema de memoria compartida, por lo que los accesos a la memoria desde cualquier procesador pueden alcanzar la memoria sin bloquear. Si el modelo de memoria estuviera basado en mensajes, entonces el acceso a la memoria remota requeriría que el procesador en ejecución solicite que el procesador local realice la operación deseada. Sin embargo, en un sistema NUMA, un procesador remoto puede afectar el rendimiento del procesador cerrado debido a la utilización de los enlaces de memoria, aunque esto puede depender de la configuración arquitectónica específica.

En cuanto a 1, esto depende completamente de la biblioteca OS y malloc. El sistema operativo es responsable de presentar la memoria por núcleo/por procesador como un espacio unificado o como NUMA. Malloc puede o no ser consciente de NUMA. Pero, fundamentalmente, la implementación de malloc puede o no ser capaz de ejecutarse simultáneamente con otras solicitudes. Y la respuesta de Al (y la discusión asociada) aborda este punto con mayor detalle.

cuanto a 2, como memcpy consisten de una serie de cargas y tiendas, el único impacto sería de nuevo los posibles efectos de arquitectura de la utilización de controladores de memoria los otros procesadores, etc.

+0

Hola Brian. Muchas gracias. ¿Conoces alguna buena biblioteca de malloc que sea consciente de NUMA? Busqué en Google y encontré MPC ... ¿es bueno en tu opinión? –

+0

En las raras ocasiones en que escribo algo para que sea compatible con NUMA, asigno directamente mi memoria desde el sistema operativo utilizando VirtualAllocExNuma (Windows) o libnuma (linux). – Brian

+0

Muchas gracias lo intentaré. –

2
  1. llamadas a malloc en procesos separados se ejecuten de forma independiente sin importar si usted está en una arquitectura NUMA. Las llamadas a malloc en diferentes subprocesos del mismo proceso no se pueden ejecutar de forma independiente porque la memoria devuelta es igualmente accesible para todos los subprocesos dentro del proceso. Si desea memoria que sea local para un hilo en particular, lea en el Almacenamiento local de subprocesos. No he podido encontrar ninguna documentación clara sobre si Linux VM y el planificador pueden optimizar la afinidad entre núcleos, hilos, memoria local y almacenamiento local de subprocesos.
+0

"llamadas a malloc en diferentes hilos del mismo proceso no se puede ejecutar de forma independiente "- en NUMA no pueden con grupos de memoria por subproceso, aunque las llamadas a 'libre' en diferentes subprocesos pueden no ser independientes, ya que por supuesto puede liberar memoria en un subproceso diferente de donde lo asignaste –

+0

Pero eso depende completamente de la implementación de malloc. Normalmente, las personas usan librerías 3. party malloc (por ejemplo, tcmalloc) para mejorar el rendimiento en aplicaciones de múltiples hilos (aunque ni tcmalloc ni glibc malloc tienen en cuenta NUMA) – nos

+0

Hola Steve. Por lo que yo sé, las agrupaciones de memoria son fragmentos de memoria preasignados continuamente que nunca se liberan (... al menos así es como lo usé en la arquitectura que no es NUMA). Me parece que lo que está proponiendo es más una solución basada en una biblioteca que hace dos cosas: A = crear un conjunto de memoria por subproceso B = redefinir el comportamiento malloc. ¿Estoy en lo correcto o es algo realmente especificado en el nivel del sistema operativo para ese tipo de hardware? –

Cuestiones relacionadas