我有两个在两个不同内核上运行的C ++代码。它们都写入同一个文件。
如何使用OpenMP并确保没有崩溃?
答案 0 :(得分:40)
您需要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调用是不同的。
答案 1 :(得分: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
}
}
}
编辑:Victor Eijkhout发表的评论中有一个很棒的主题。总结和释义:简而言之critical
锁定代码段。在更复杂的示例中,这可能是过度的,您只想锁定特定的数据项。在两种方法之间做出选择之前,了解这一点非常重要。
答案 2 :(得分:16)
#pragma omp critical
{
// write to file here
}