2012-08-14 25 views
7

Tengo una máquina de doble zócalo Xeon E5522 2.26GHZ (con hyperthreading deshabilitado) que ejecuta el servidor ubuntu en Linux kernel 3.0 compatible con NUMA. El diseño de la arquitectura es de 4 núcleos físicos por socket. Una aplicación OpenMP se ejecuta en esta máquina y tengo las siguientes preguntas:¿Relación OpenMP y NUMA?

  1. ¿Tiene un programa OpenMP aprovechan (es decir, un hilo y sus datos privados se mantienen en un nodo NUMA lo largo de la ejecución) de forma automática cuando se ejecuta en una máquina NUMA + Kernel consciente ?. Si no, ¿qué se puede hacer?

  2. ¿qué pasa con NUMA y por hilo C++ STL estructuras de datos privadas?

+0

Defina qué tipo de ventaja quiere decir con "ventaja cuando se ejecuta en una máquina NUMA". OpenMP actualmente no tiene conocimiento de NUMA, pero es probable que OpenMP 4.0 traiga provisiones para enlaces de hilos mejorados. –

+0

He actualizado la pregunta, es principalmente lo que usted señaló. ¿Qué hay de 'taskset'? ¿Ayudará a vincular los hilos de manera que los datos privados por hilos se mantengan en forma local? – labotsirc

Respuesta

15

El estándar OpenMP actual define un entorno de boolean variable de OMP_PROC_BIND que controlls unión de hilos de OpenMP. Si se establece en true, p.

shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x 

el entorno de ejecución de OpenMP no debería mover los hilos entre los procesadores. Desafortunadamente, no se dice nada más acerca de cómo deben vincularse esos hilos y eso es lo que un grupo de trabajo especial en el comité de lenguaje OpenMP está abordando en este momento. OpenMP 4.0 vendrá con nuevas variables y cláusulas de envrionment que le permitirán a uno especificar cómo distribuir los hilos. Por supuesto, muchas implementaciones OpenMP ofrecen su propio non-standard methods to control binding.

La mayoría de los tiempos de ejecución de OpenMP no son compatibles con NUMA. Con mucho gusto enviarán hilos a cualquier CPU disponible y usted debería asegurarse de que cada subproceso solo acceda a los datos que le pertenecen. Hay algunos consejos generales en esta dirección:

  • No utilice dynamic programación paralela para for (C/C++)/DO (Fortran) bucles.
  • Intenta inicializar los datos en el mismo subproceso que luego lo usará. Si ejecuta dos bucles paralelos separados for con el mismo tamaño de equipo y el mismo número de fragmentos de iteración, con static el fragmento de planificación 0 de ambos bucles se ejecutará por el hilo 0, el fragmento 1 - por el hilo 1, y así sucesivamente.
  • Si usa tareas OpenMP, intente inicializar los datos en el cuerpo de la tarea, porque la mayoría de los tiempos de ejecución OpenMP implementan el robo de tareas: los subprocesos inactivos pueden robar tareas de las colas de tareas de otros subprocesos.
  • Utilice un asignador de memoria compatible con NUMA.

Algunos de mis colegas han evaluado a fondo la behavious NUMA de diferentes tiempos de ejecución de OpenMP y han observado de forma específica en la toma de conciencia de la NUMA de la implementación de Intel, pero los artículos no están publicados todavía, así que no se le puede proporcionar un enlace.

Hay un proyecto de investigación, llamado ForestGOMP, que tiene como objetivo proporcionar un reemplazo directo compatible con NUMA para libgomp. Puede ser que debas echarle un vistazo.

+0

consejos muy útiles, gracias.En cuanto a su último consejo detallado; qué sucede con el caso del "objeto m = nuevo objeto (arg);" asignador de objetos en C++, ¿hay un equivalente como tcmalloc para C? – labotsirc

+0

'tcmalloc' admite tanto C como C++. En cuanto al operador 'nuevo' de C++, puede usar la sintaxis de colocación para poner el objeto en la memoria, asignada previamente por' tcmalloc', o confiar en 'tcmalloc' reemplazando la llamada' malloc() 'estándar mediante precarga (como' nuevo 'es técnicamente una envoltura alrededor de' malloc'). –

+0

gracias Hristo, tcmalloc pre-loading + taskset está ayudando a escalar la aplicación dentro del mismo socket, sin embargo cuando empiezo a usar núcleos adicionales desde el segundo socket (sin taskset, dejando que openMP y OS manejen el enlace del thread) la aceleración no mejora o incluso puede ser peor que usar un socket. Bajo estas circunstancias, podría (1) esperar la versión 4.0 o (2) soltar OpenMP y usar encabezados, pero no estoy seguro de si esta segunda opción realmente me permitirá resolver el problema consciente de NUMA, tengo que investigar que – labotsirc