我有两段运行在不同核心上的C++代码,它们都向同一个文件写入内容。
如何使用OpenMP并确保没有崩溃?
我有两段运行在不同核心上的C++代码,它们都向同一个文件写入内容。
如何使用OpenMP并确保没有崩溃?
您需要使用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);
大多数锁定例程(如pthread信号量和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
}
}
}
编辑:评论区有一篇由Victor Eijkhout引发的很棒的帖子。概括和解释一下:简而言之,critical
锁定了一个代码段。在更复杂的示例中,仅想锁定特定的数据项可能会过度使用它。在选择两种方法之间做出选择之前,理解这一点非常重要。
#pragma omp critical
{
// write to file here
}
#pragma omp critical
将导致完全相同的代码,不是吗? - rph