Как использовать lock в OpenMP?

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

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

3 ответов


вы хотите 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 отличаются.


в интересах тех, кто придет после, используя 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      
        }
    }
} 

Edit: в комментариях, инициированных Виктором Эйкхаутом, есть отличная тема. Резюмируя и перефразируя: короче critical блокирует сегмент кода. Это может быть излишним в более сложных примерах, где все, что вы хотите сделать, это заблокировать определенный элемент данных. Важно понять это, прежде чем делать выбор между два метода.


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