如果共享,OpenMP会将堆栈或数据变量移动到堆上吗?

我正在观看OpenMP系列视频简介,并且演示者不断重复“堆是共享的,堆栈是私有的”。 还提到数据和文本区域是共享的。 然而,他举例说明了父线程的堆栈变量显然是共享的,他一直将这些变量称为“在堆上”。 这是一个例子:

https://youtu.be/dlrbD0mMMcQ?t=2m57s

他声称变量indexcount是“堆在一起”。 不是在父线程的堆栈上indexcount一个静态变量,所以是数据区域的一部分? 在我自己的OMP程序中,如果我打印这些变量的地址,它们分别出现在堆栈和数据区域中。 到目前为止,这并不是唯一的一个地方,他已经将变量称为“堆上”,从我所知道的情况来看,这些变量是共享的,但不是堆在一起。 我只是想确保我不会错过OMP的工作方式。

阅读规范,我可以找到这个最清晰的声明,用于在并行区域之外“隐式共享”堆栈变量:

对于除了任务生成结构或目标结构之外的结构,如果不存在默认子句,则这些变量引用具有与封闭上下文中存在的相同名称的变量

OpenMP 4.5规范第182页


措辞(堆栈/堆)是不精确的

OpenMP标准没有引用堆栈或堆栈的内存模型。 所以我会用定义的实现来回答你的问题。 如果他们被共享,我没有理由将堆栈变量的数据移动到堆上。 如果你通过查看共享变量的指针来看到它们在堆栈中,我实际上会相信这一点。

即使C标准也不包含堆栈或堆的引用。

在我看来,你不应该使用不属于标准的概念(并因此依赖于实现)来推断正确性。 而是使用存储时间和范围。

我推测Tim Mattson使用堆栈/堆,因为它们可能更广泛地被称为。

1 OpenMP允许控制线程的堆栈大小,但没有进一步参考堆栈是什么。

你指出的具体例子是错误的

即使你考虑简化:

  • 自动存储时间==“堆栈”
  • 分配/动态2存储时间==“堆”
  • 你的分析是正确的,引用适用。 按照2.15.1.1,对于在该构建体内部的范围中声明的具有自动存储持续时间的对象没有预定的数据共享规则。 因此它是一个隐含确定的数据共享属性的变量。

    2令人困惑的是,C标准使用“分配的存储时间”,而C ++和OpenMP使用“动态存储时间”。

    链接地址: http://www.djcxy.com/p/13907.html

    上一篇: Does OpenMP move stack or data variables to the heap if they are shared?

    下一篇: Should I put large arrays on stack or heap?