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.
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. –
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