5

Si utilizo una variable compartida, digamos una doble, para calcular algún tipo de suma a lo largo de la ejecución del programa. ¿Sería eso de alguna manera vulnerable a las operaciones no estables? Quiero decir, ¿sería posible que más de un núcleo accedería a esta variable de forma asíncrona y causaría resultados inestables?C++: protección de memoria compartida OpenMP

Por ejemplo: esta es una variable global:

double totalTime = 0; 

y en cada núcleo de un comando se llama:

totalTime += elapsedTime; 

Esta última operación/sentencia se ejecuta tomando el valor de totalTime , ponlo en el registro de CPU, y luego haz la suma. Puedo imaginar que más de un núcleo tomaría el mismo valor en el mismo instante, y luego agregaría el nuevo tiempo transcurrido, y luego el valor almacenado en tiempo total se sobrescribirá con el valor incorrecto, debido a la latencia. ¿Es eso posible? y como puedo resolver esto?

Gracias.

Respuesta

4

Claramente, esta operación no es segura para subprocesos ya que, como usted mencionó, implica varias instrucciones de ensamblador. De hecho, openMP incluso tiene una directiva especial para este tipo de operaciones.

Se necesitará el pragma atomic para hacerlo, así, "atómica":

#pragma omp atomic 
totalTime += elapsedTime; 

Tenga en cuenta que atomic sólo funciona cuando se tiene una sola actualización a una posición de memoria, como una adición, incremento, etc. .

Si usted tiene una serie de instrucciones que necesita para atómica juntos debe utilizar el critical Directiva:

#pragma omp critical 
{ 
    // atomic sequence of instructions 
} 

Editar: He aquí una buena sugerencia de "snemarch": Si va a actualizar repetidamente la variable global totalTime en un circuito en paralelo se puede considerar el uso de la cláusula reduction para automatizar el proceso y también hacen que sea mucho más eficiente:

double totalTime = 0; 

#pragma omp parallel for reduction(+:totalTime) 
for(...) 
{ 
    ... 
    totalTime += elapsedTime; 
} 

Al final totalTime contendrá correctamente la suma de los valores locales elapsedTime sin necesidad de sincronización explícita.

+0

Gracias, amigo :) –

+0

Me pregunto cómo OpenMP admite las adiciones atómicas para los tipos de datos de punto flotante en x86; no hay instrucciones nativas para ello. Secciones críticas? – snemarch

+0

@snemarch: No pude encontrar nada definitivo al respecto, así que supongo que usa bloqueos. – Tudor

Cuestiones relacionadas