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
private
es 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).threadprivate
otra parte, lo más probable es que una variablethreadprivate
se 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 variablethreadprivate
persiste 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
private
son 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 punteroprivate
es undefine.Pero se debe asumir que los datos en los bloques comunes de
threadprivate
no están definidos en la entrada a la primera región paralela a menos que se especifique una cláusulacopyin
Cuando 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
threadprivate
se 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 variablethreadprivate
se 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
threadprivate
no es conforme.El contenido de una variable
threadprivate
puede 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
threadprivate
persistirán entre dos referencias consecutivas a la variable en el programa.Se garantiza que los valores de los datos en las variables
threadprivate
losthreadprivate
no iniciales persistirán entre dos regionesparallel
activas consecutivas solo si se cumplen todas las condiciones siguientes:Ninguna de
parallel
regionesparallel
está anidada dentro de otra regiónparallel
explícita.El número de subprocesos utilizados para ejecutar ambas regiones
parallel
es el mismo.Las políticas de afinidad de hilos utilizadas para ejecutar ambas regiones
parallel
son 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
threadprivate
en 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.