Как использовать 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
блокирует сегмент кода. Это может быть излишним в более сложных примерах, где все, что вы хотите сделать, это заблокировать определенный элемент данных. Важно понять это, прежде чем делать выбор между два метода.