c++ - ¿Cómo utilizar el bloqueo en OpenMP?
locking critical-section (3)
Tengo dos piezas de código C ++ que se ejecutan en 2 núcleos diferentes. Ambos escriben en el mismo archivo.
¿Cómo usar OpenMP y asegurarte de que no haya fallas?
Para el beneficio de los que vienen después, el uso critical
es otra opción. Incluso puedes hacer secciones con nombre crítico.
Por ejemplo:
#include <omp.h>
void myParallelFunction()
{
#pragma omp parallel for
for(int i=0;i<1000;++i)
{
// some expensive work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
// other work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
}
}
Edit: Hay un gran hilo en los comentarios iniciados por Victor Eijkhout. Resumir y parafrasear: en resumen, critical
bloqueos critical
un segmento de código. Eso puede ser una exageración en los ejemplos más complejos donde todo lo que desea hacer es bloquear un elemento de datos específico. Es importante entender esto antes de elegir entre los dos métodos.
Desea las funciones OMP_SET_LOCK
/ OMP_UNSET_LOCK
: https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK . Básicamente:
omp_lock_t writelock;
omp_init_lock(&writelock);
#pragma omp parallel for
for ( i = 0; i < x; i++ )
{
// some stuff
omp_set_lock(&writelock);
// one thread at a time stuff
omp_unset_lock(&writelock);
// some stuff
}
omp_destroy_lock(&writelock);
La mayoría de las rutinas de bloqueo como pthreads semaphores y sysv semaphores funcionan en ese tipo de lógica, aunque las llamadas específicas a la API son diferentes.
#pragma omp critical
{
// write to file here
}