parallel-processing openmp private

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:

  1. Las diferencias entre la directiva threadprivate y la cláusula privada y
  2. 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 variable threadprivate 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 variable threadprivate 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 puntero private 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áusula copyin Cuando aparece un bloque común en una directiva threadprivate , 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 variable threadprivate 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ón parallel .

    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 los threadprivate no iniciales persistirán entre dos regiones parallel activas consecutivas solo si se cumplen todas las condiciones siguientes:

    • Ninguna de parallel regiones parallel está anidada dentro de otra región parallel 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.