parallel processing - Diferencia entre OpenMP threadprivate y privado
parallel-processing (1)
Estoy tratando de paralelizar un programa de C usando OpenMP.
Me gustaría saber más sobre:
- Las diferencias entre la directiva threadprivate y la cláusula privada y
- En qué casos debemos utilizar alguno de ellos.
Por lo que sé, la diferencia es el alcance global con threadprivate y el valor preservado en las regiones paralelas. Encontré en varios ejemplos que cuando un fragmento de código contiene algunas variables globales / estáticas que deben privatizarse, estas variables se incluyen en una lista de threadprivate y sus valores iniciales se copian en las copias privadas usando copyin .
Sin embargo, ¿hay alguna regla que nos impida utilizar la cláusula privada para tratar con variables globales / estáticas? ¿Tal vez algún detalle de implementación?
No pude encontrar ninguna explicación en la especificación OpenMP3.0.
Las diferencias más importantes que tienes que memorizar:
Una variable
privatees local a una región y se colocará la mayor parte del tiempo en la pila . La vida útil de la privacidad de la variable es la duración definida de la cláusula de alcance de los datos. Cada hilo (incluido el hilo maestro) hace una copia privada de la variable original (la nueva variable ya no está asociada al almacenamiento con la variable original).threadprivateotra parte, lo más probable es que una variablethreadprivatese coloque en el montón o en el almacenamiento local del hilo (que se puede ver como una memoria global local a un hilo). Una variablethreadprivatepersiste en las regiones (dependiendo de algunas restricciones). El subproceso maestro utiliza la variable original, todos los demás subprocesos hacen una copia privada de la variable original (la variable maestra todavía está asociada al almacenamiento con la variable original).
También hay diferencias más difíciles:
Las variables definidas como
privateson indefinidas para cada hilo al ingresar a la construcción y la variable compartida correspondiente no está definida cuando se sale de la construcción paralela; El estado inicial de un punteroprivatees undefine.Pero se debe asumir que los datos en los bloques comunes de
threadprivateno están definidos en la entrada a la primera región paralela a menos que se especifique una cláusulacopyinCuando aparece un bloque común en una directivathreadprivate, cada copia de hilo se inicializa una vez antes de su primer uso.
Las Especificaciones de OpenMP (sección 2.14.2) en realidad dan una muy buena descripción (y también más detallada) de la directiva
threadprivate:Cada copia de una variable
threadprivatese inicializa una vez, de la manera especificada por el programa, pero en un punto no especificado en el programa antes de la primera referencia a esa copia. El almacenamiento de todas las copias de una variablethreadprivatese libera de acuerdo con cómo se manejan las variables estáticas en el lenguaje base, pero en un punto no especificado en el programa.Un programa en el que un hilo hace referencia a la copia de otro hilo de una variable
threadprivateno es conforme.El contenido de una variable
threadprivatepuede cambiar a través de un punto de programación de tareas si el hilo en ejecución cambia a otra tarea que modifica la variable. Para obtener más detalles sobre la programación de tareas, consulte la Sección 1.3 en la página 14 y la Sección 2.11 en la página 113.En regiones
parallel, las referencias del subproceso maestro serán a la copia de la variable en el subproceso que encontró la regiónparallel.Durante una parte secuencial, las referencias serán a la copia de la variable del hilo inicial. Se garantiza que los valores de los datos en la copia del hilo inicial de una variable
threadprivatepersistirán entre dos referencias consecutivas a la variable en el programa.Se garantiza que los valores de los datos en las variables
threadprivatelosthreadprivateno iniciales persistirán entre dos regionesparallelactivas consecutivas solo si se cumplen todas las condiciones siguientes:Ninguna de
parallelregionesparallelestá anidada dentro de otra regiónparallelexplícita.El número de subprocesos utilizados para ejecutar ambas regiones
paralleles el mismo.Las políticas de afinidad de hilos utilizadas para ejecutar ambas regiones
parallelson las mismas.El valor de la variable de control interno dyn-var en la región de tarea adjunta es falso en la entrada a ambas regiones
parallel.
Si todas estas condiciones se mantienen, y si se hace referencia a una variable
threadprivateen ambas regiones, entonces los hilos con el mismo número de hilo en sus respectivas regiones harán referencia a la misma copia de esa variable.