31

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

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

4

3 回答 3

61

您想要OMP_SET_LOCK/OMP_UNSET_LOCK功能: https ://hpc.llnl.gov/tuts/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);

尽管特定的 API 调用不同,但大多数锁定例程(例如 pthreads 信号量和 sysv 信号量)都在这种逻辑上工作。

于 2010-03-07T19:27:31.430 回答
34

为了后来者的利益,使用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      
        }
    }
} 

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

于 2012-11-05T17:30:49.203 回答
20
#pragma omp critical
{
    // write to file here
}
于 2011-05-06T05:16:15.203 回答