在OpenMP中访问线程的私有内存

ipa*_*dop 6 c c++ multithreading openmp

根据OpenMP内存模型,以下是不正确的:

int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
  int x;
  // THREAD 0              // THREAD 1
  p0 = &x;                 p1 = &x;
  *p1 ...                  *p0 ...
}
Run Code Online (Sandbox Code Playgroud)

我的例子如下所示:

int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
  int x;
  // THREAD 0              // THREAD 1
  p0 = &x;                 p1 = &x;
  #pragma omp flush

  #pragma omp barrier
  *p1 ...                  *p0 ...
  #pragma omp barrier
}
Run Code Online (Sandbox Code Playgroud)

这会不正确吗?我在内存模型中找不到不允许这样做的东西.

我假设我的玩具示例是正确的,就像3.1中的内存模型一样,只要程序员确保它仍处于活动状态,它们就允许任务访问私有变量.鉴于任务可以解开,理论上它们可以在不同的工作线程内执行,因此允许OpenMP线程访问另一个的私有内存.

Bor*_*ort 2

这应该有效。Flush 同步所有共享变量,并且 Barrier 保证所有线程的 mp 环境仍然处于活动状态。只要你不在 p1s 赋值中使用 p0 ,反之亦然,就应该没问题。虽然我无法想象为什么有人会做出那样的事情。也许您可以更多地了解该构造背后的推理。

由于 p0 和 p1 在并行区域之后仍然存在,因此您也可以在那里毫无障碍地完成所有分配等。