【问题标题】:Accessing a thread's private memory in OpenMP在 OpenMP 中访问线程的私有内存
【发布时间】:2011-11-17 02:12:03
【问题描述】:

根据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 中的内存模型中一样,只要程序员确保它仍然存在,它们就允许任务访问私有变量。鉴于任务可以解开,理论上它们可以在不同的工作线程中执行,因此允许 OpenMP 线程访问另一个线程的私有内存。

【问题讨论】:

    标签: c++ c multithreading openmp


    【解决方案1】:

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

    由于 p0 和 p1 在平行区域之后仍然存在,因此您也可以在那里完成所有作业而没有障碍等。

    【讨论】:

    • 我正在尝试从线程 1 写入线程 0 的地址空间,反之亦然。我能想到一些有趣的应用程序,但我还没有具体的例子。只是在做实验。请注意,我让每个线程访问另一个线程的私有内存。我只想知道它是否被明确禁止或不鼓励; OpenMP 内存模型不是很清楚,如果我理解任务杂注的复杂性,那么可能是内存模型不完整。
    【解决方案2】:

    顺便说一句,这类似于尝试通过将局部变量分配给全局变量,然后读取全局变量来读取您调用的某个函数中的局部变量。

    这里的类比是,全局变量就像多线程中的共享变量一样,本质上可以访问应该是线程私有的(就像应该只在函数中可见的局部变量)。

    所以要回答所问的问题,对线程私有内存进行解引用是完全有效的。 这是允许的,因为允许使用指针别名(这是 2 个或多个变量提供对内存中相同位置的访问,在您的情况下,一个是线程私有整数,另一个是共享指针)。

    虽然完全有效,但请注意这可能会导致一些难以检测的竞争条件,因为通常不会使用锁来保护对线程私有变量的访问。

    【讨论】:

    • +1 用于提及指针别名。但是,目前尚不清楚我所做的在内存模型下是否有效。它在我使用过的所有编译器/平台上都对我有用,但这并不意味着它是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多