Anterior Siguiente

Para evitar una condición de carrera al actualizar una variable compartida, a veces sólo es necesario (y también más eficiente) proteger del acceso paralelo a una sola instrucción que una sección con varias instrucciones. Un único hilo ejecuta la instrucción al tiempo y los demás esperan su turno. El hilo que termina no espera al final de la instrucción sino que continúa hasta la siguiente barrera.

Sintaxis básica

#pragma omp parallel
{
    <parallel region code>
    
    #pragma omp atomic [update|read|write|capture]
    <instruction>

    <parallel region code>
} // implicit barrier here
  • update: es la opción por defecto; asegura que el valor no se modifique hasta que la variable se haya actualizado.
  • read: garantiza que el valor de la variable a leer no se modifique hasta que se termine de leerla.
  • write: asegura que el valor de la variable a escribir no se modifique hasta que se termine de escribirla.
  • capture: asegura que se capture el valor de la variable antes de hacer una actualización.

Ejemplo

Vamos a contar cuántos hilos ejecutan la instrucción:

#include <stdio.h>
#include <omp.h>

int main(){
    int m = omp_get_thread_num();
    printf("master thread=%d in serial region\n", m);
    int count = 0;

    #pragma omp parallel
    {
        int t = omp_get_thread_num();
        printf("thread=%d in parallel region\n", t);
        
        #pragma omp atomic
        count++;
        
        printf("thread=%d says goodbye\n", t);
    } // implicit barrier here
    
    printf("master thread=%d in serial region\n", m);
    printf("count=%d\n", count);
}

Descarga el código aquí.

¿Cómo compilar?

clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/ 
     -o atomic-000 atomic-000.c

¿Cómo ejecutar?

./atomic-000 

Salida

master thread=0 in serial region
thread=0 in parallel region
thread=0 says goodbye
thread=3 in parallel region
thread=3 says goodbye
thread=1 in parallel region
thread=1 says goodbye
thread=2 in parallel region
thread=2 says goodbye
master thread=0 in serial region
count=4

La anotación atómica garantiza que el contador sea 4.

Preguntas

  • Modifica el programa y usa read, write y capture.
Anterior Siguiente
Estás en el Nivel 1: Introducción a la programación paralela con OpenMP. ¿Deseas volver al inicio?