2011-11-17 12 views
5

De acuerdo con la OpenMP Memory Model, el siguiente es incorrecto:acceder a la memoria privada de un hilo en OpenMP

int *p0 = NULL, *p1 = NULL; 
#pragma omp parallel shared(p0,p1) 
{ 
    int x; 
    // THREAD 0    // THREAD 1 
    p0 = &x;     p1 = &x; 
    *p1 ...     *p0 ... 
} 

Mi ejemplo tiene el siguiente embargo:

int *p0 = NULL, *p1 = NULL; 
#pragma omp parallel shared(p0,p1) 
{ 
    int x; 
    // THREAD 0    // THREAD 1 
    p0 = &x;     p1 = &x; 
    #pragma omp flush 

    #pragma omp barrier 
    *p1 ...     *p0 ... 
    #pragma omp barrier 
} 

¿Esto sería incorrecto? No puedo encontrar algo en el modelo de memoria que no permita esto.

Asumo que mi ejemplo de juguete es correcta, como en el modelo de memoria de 3.1 que permitirá una tarea para tener acceso a una variable privada, siempre y cuando el programador asegura que aún está vivo. Dado el hecho de que las tareas se pueden desatar, en teoría se pueden ejecutar dentro de un hilo de trabajo diferente, lo que permite que un hilo OpenMP acceda a la memoria privada de otro.

Respuesta

1

Esto debería funcionar. Flush sincroniza todas las variables compartidas y garantiza que el entorno mp con todos los subprocesos sigue activo. Siempre que no use p0 en la asignación p1s o viceversa, debería estar bien. Aunque no puedo imaginar por qué uno haría algo así. Tal vez puedas contar más sobre el razonamiento detrás de esa construcción.

Desde p0 y p1 siguen vivos después de la región paralela, se podría hacer todas las tareas allí también sin barreras, etc ..

+0

Estoy intentando escribir en el espacio de direcciones del hilo de rosca 0 a 1 y viceversa. Puedo pensar en algunas aplicaciones interesantes, pero todavía no tengo un ejemplo concreto. Solo experimentando. Tenga en cuenta que le estoy dando a cada subproceso acceso a otro hilo de memoria privada. Solo quiero saber si está explícitamente prohibido o desalentado; el modelo de memoria OpenMP no es muy claro y si entiendo las complejidades de la tarea pragma, entonces podría ser que el modelo de memoria esté incompleto. – ipapadop

1

Como un pensamiento lateral, esto es análogo al tratar de leer una variable local dentro de algunas función que ha llamado asignando esa variable local a una variable global, y luego leyendo la variable global.

La analogía aquí es que una variable global actúa como una variable compartida en multihebra, esencialmente dando acceso a lo que se suponía que era hilo privado (como la variable local que solo debería ser visible dentro de la función).

Así que para responder a la pregunta se le preguntó, haciendo eliminación de referencias en la memoria privada hilo es completamente válido. Está permitido porque aliasing puntero se permite (aquí es donde 2 o más variables proporcionan el acceso a la misma ubicación en la memoria, en el caso de que uno es un número entero privada hilo y el otro es un puntero compartido).

Aunque completamente válido, tenga cuidado con esto puede causar algunos difíciles de detectar las condiciones de carrera, ya que normalmente uno no utilizar un candado para proteger el acceso a enhebrar variables privadas.

+0

+1 para mencionar el alias de puntero. Sin embargo, todavía no está claro si lo que estoy haciendo es válido bajo el modelo de memoria. Me ha funcionado en todos los compiladores/plataformas que he usado, sin embargo eso no significa que sea correcto. – ipapadop

Cuestiones relacionadas