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

我对pthreads很陌生,并想问如何表达如下内容:

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

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

PS:由于某些资源克隆,我在包含 while 的部分包含了 fork ,因为某些资源克隆导致进入循环之前更加聪明。

0
额外 编辑
意见: 1

2 答案

OpenMP在后台执行许多其他事情,而不仅仅是产生线程。它还分发代码段并同步不同的线程。尽管您正在询问有关 fork()的实现,但您已将问题标记为 pthreads ,这很令人困惑。在Linux中 fork()非常重要,因为它创建新的进程,而使用clone()创建线程。

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

一个警告虽然 - fork()是使用COW(写时复制)页面实现的。这意味着尽管开始时孩子的记忆内容等于父母的记忆内容,但是所做的任何变化都是私人的 - 孩子不会看到父母在自己的记忆中修改什么,反之亦然。内存必须使用SysV共享内存原语或共享文件映射在两者之间明确共享。

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

vfork() is a syscall designed for completely different purpose and is not suitable for process cloning at all.

0
额外
所以考虑pthreads它会成为:pthread_create(&tid1,0,dothis,0);在pthread_create(&tid2,0,找时间做,0);在pthread_join(tid1,0);在pthread_join(tid2,0); ?这将会更容易,如果我正确地看到这个我默认共享内存?谢谢这可能会更容易,因为叉!
额外 作者 litro,
无需两次调用 pthread_create - 您已经拥有其他线程:)
额外 作者 Hristo Iliev,

我不认为有使用叉的部分的直接模拟。 但是,您可以使用messgae传递机制在理论上模拟它,其中共享变量由根机器保存。所有openMP flush都将使用root进行。 (请记住,openMP使用的是弱一致性模型)。

0
额外