如何在OpenMP中使用锁?

Mai*_*nID 23 c++ locking openmp critical-section

我有两个C++代码在两个不同的内核上运行.它们都写入同一个文件.

如何使用OpenMP并确保没有崩溃?

小智 44

你想要OMP_SET_LOCK/ OMP_UNSET_LOCKfunctions: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);
Run Code Online (Sandbox Code Playgroud)

尽管特定的API调用是不同的,但大多数锁定例程(如pthreads信号量和sysv信号量)都适用于这种逻辑.


Chr*_* A. 25

为了后来的利益,使用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      
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

编辑:Victor Eijkhout发表的评论中有一个很棒的主题.总结和释义:简而言之,critical锁定代码段.在更复杂的示例中,这可能是过度的,您只想锁定特定的数据项.在两种方法之间做出选择之前,了解这一点很重要.

  • 严重锁定代码段.如果您有数千次迭代并且您只是想确保没有两个线程同时执行相同的迭代,那么这不是一个好主意.使用关键意味着只有一个线程进行任何迭代.命名的关键部分可以缓解这个问题,但锁定更灵活,因为它们锁定数据元素,而不是代码片段. (6认同)

ada*_*max 17

#pragma omp critical
{
    // write to file here
}
Run Code Online (Sandbox Code Playgroud)