gpt4 book ai didi

c++ - 在 OpenMP 中访问线程的私有(private)内存

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:49 25 4
gpt4 key购买 nike

根据OpenMP Memory Model ,以下是不正确的:

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

虽然我的例子看起来像下面这样:

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
}

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

我假设我的玩具示例是正确的,因为在 3.1 的内存模型中,只要程序员确保它仍然存在,它们就允许任务访问私有(private)变量。鉴于任务可以解开这一事实,理论上它们可以在不同的工作线程中执行,因此允许 OpenMP 线程访问另一个线程的私有(private)内存。

最佳答案

这应该有效。 Flush 同步所有共享变量,barrier 保证所有线程的 mp 环境仍然活跃。只要您不在 p1s 分配中使用 p0,反之亦然,应该没问题。虽然我无法想象为什么会有人做那样的事情。也许您可以详细说明该构造背后的原因。

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

关于c++ - 在 OpenMP 中访问线程的私有(private)内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8161269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com