如何将OpenMP部分转换为fork()

时间:2012-05-24 07:21:49

标签: c++ pthreads fork openmp

我是pthreads的新手,想问一下如何表达:

while(imhappy())
{
 #pragma omp sections
 {
  #pragma omp section
  {
   dothis();
  }
  #pragma omp section
  {
   dothat();
  }
 }
}

在使用fork()或vfork()的等效构造中? 谢谢你!

PS:我在这些部分中包含了,以防由于某些资源克隆而在进入循环之前对 fork 更加聪明。

2 个答案:

答案 0 :(得分:2)

OpenMP在幕后做了很多其他事情而不仅仅是产生线程。它还分发代码段并同步不同的线程。您已将问题标记为pthreads,但您询问fork()的实施情况令人困惑。在Linux中,fork()非常重要,因为它创建了新进程,而clone()则用于创建线程。

然而,具有两个线程的OpenMP部分构造的粗略等价物将是fork,之后必须遵循if构造,并且主进程将在子进程执行时执行dothis()路径dothat()路径。来自fork()的返回值在父进程和子进程中是不同的,可用于为分支做出决策。然后,父进程将等待子进程以waitpid()结束,这类似于omp sections区域末尾的隐式障碍同步。

但有一点需要注意 - fork()是使用COW(写时复制)页面实现的。这意味着虽然在开始时子项的内存内容等于父项的内存内容,但所做的任何更改都是私有的 - 子项不会看到父项在其自己的内存中修改的内容,反之亦然。必须使用SysV共享内存原语或共享文件映射在两者之间显式共享内存。

您可能真的想要考虑使用POSIX线程API。

vfork()是一个系统调用,专为完全不同的目的而设计,根本不适合进程克隆。

答案 1 :(得分:0)

我认为使用fork没有直接模拟部分。 但是,理论上可以使用messgae传递机制来模拟它,其中共享变量与根机器保持在一起。所有openMP刷新都将使用root进行。 (请记住,openMP使用弱于弱一致性模型)。