J'ai deux morceaux de code C++ fonctionnant sur 2 cœurs différents. Les deux écrivent dans le même fichier.
Comment utiliser OpenMP et s'assurer qu'il n'y a pas de plantage?
Vous voulez que le OMP_SET_LOCK
/OMP_UNSET_LOCK
fonctions: https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK . Fondamentalement:
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 plupart des routines de verrouillage telles que les sémaphores pthreads et les sémaphores sysv fonctionnent sur ce type de logique, bien que les appels API spécifiques soient différents.
Pour ceux qui viennent après, utiliser critical
est une autre option. Vous pouvez même créer des sections critiques nommées.
Par exemple:
#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: Il y a un grand fil dans les commentaires initiés par Victor Eijkhout. Résumé et paraphrase: En bref critical
verrouille un segment de code. Cela peut être exagéré dans des exemples plus complexes où tout ce que vous voulez faire est de verrouiller un élément de données spécifique. Il est important de comprendre cela avant de faire un choix entre les deux méthodes.
#pragma omp critical
{
// write to file here
}