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线程访问另一个的私有内存.
这应该有效。Flush 同步所有共享变量,并且 Barrier 保证所有线程的 mp 环境仍然处于活动状态。只要你不在 p1s 赋值中使用 p0 ,反之亦然,就应该没问题。虽然我无法想象为什么有人会做出那样的事情。也许您可以更多地了解该构造背后的推理。
由于 p0 和 p1 在并行区域之后仍然存在,因此您也可以在那里毫无障碍地完成所有分配等。