Como usar o bloqueio no OpenMP?

Eu tenho duas peças de código C ++ em execução em dois núcleos diferentes. Ambos escrevem no mesmo arquivo.

Como usar o OpenMP e certificar-se de que não haja falha?

Você quer as funções OMP_UNSET_LOCK / OMP_UNSET_LOCK : https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK . Basicamente:

 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); 

A maioria das rotinas de bloqueio, como semáforos pthreads e semáforos sysv, funcionam nesse tipo de lógica, embora as chamadas API específicas sejam diferentes.

Para o benefício daqueles que vêm depois, usar a critical é outra opção. Você pode até criar seções críticas nomeadas.

Por exemplo:

 #include  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: Há um ótimo tópico nos comentários iniciados por Victor Eijkhout. Resumindo e parafraseando: Em resumo, bloqueia um segmento de código. Isso pode ser um exagero em exemplos mais complexos, onde tudo o que você quer fazer é bloquear um item de dados específico. É importante entender isso antes de escolher entre os dois methods.

 #pragma omp critical { // write to file here } 
Intereting Posts