【发布时间】:2011-01-24 16:23:21
【问题描述】:
我有两段 C++ 代码在 2 个不同的内核上运行。他们都写入同一个文件。
如何使用 OpenMP 并确保没有崩溃?
【问题讨论】:
标签: c++ locking openmp critical-section
我有两段 C++ 代码在 2 个不同的内核上运行。他们都写入同一个文件。
如何使用 OpenMP 并确保没有崩溃?
【问题讨论】:
标签: c++ locking openmp critical-section
您想要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 信号量)都在这种逻辑上工作。
【讨论】:
#pragma omp critical
{
// write to file here
}
【讨论】:
为了后来者的利益,使用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 发起的 cmets 中有一个很棒的主题。总结和释义:简而言之,critical 锁定了一个代码段。在您想要做的只是锁定特定数据项的更复杂的示例中,这可能是过度的。在这两种方法之间做出选择之前,了解这一点很重要。
【讨论】:
#pragma omp critical 会在这个例子中得到完全相同的代码,不是吗?
omp critical 或锁定/解锁会导致与此答案中给出的示例相同的性能。