web-dev-qa-db-fra.com

Comment utiliser le verrouillage dans OpenMP?

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?

24
MainID

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.

45
user257111

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.

25
Chris A.
#pragma omp critical
{
    // write to file here
}
17
adamax