Подтвердить что ты не робот

Как использовать блокировку в OpenMP?

У меня есть две части кода С++, работающие на двух разных ядрах. Оба они пишут в тот же файл.

Как использовать OpenMP и убедиться, что нет сбоя?

4b9b3361

Ответ 1

Вам нужны функции OMP_SET_LOCK/OMP_UNSET_LOCK: https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK. В основном:

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

Большинство процедур блокировки, таких как семафоры pthreads и семавы sysv, работают над такой логикой, хотя конкретные вызовы API различаются.

Ответ 2

В интересах тех, кто приходит после, использование critical на самом деле проще здесь (код и чтение). Вы даже можете сделать именованные критические разделы.

Например:

#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      
        }
    }
} 

Ответ 3

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