如果共享,OpenMP是否会将堆栈或数据变量移动到堆中?

时间:2018-01-07 09:11:56

标签: c multithreading openmp

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

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

他声称变量indexcount在"上是"。在父线程的堆栈上是不是index? Isn' t count是一个静态变量,还是数据区域的一部分?在我自己的OMP程序中,如果我打印这些变量的地址,它们看起来分别位于堆栈和数据区域。到目前为止,这并不是唯一一个将变量称为“#34;在堆上”的地方。据我所知,共享,但不是在堆上。我只是想确保我不会错过OMP工作方式。

阅读规范,我可以找到最明确的声明,用于"隐式共享"并行区域外的堆栈变量:

  

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

OpenMP 4.5规范第182页

1 个答案:

答案 0 :(得分:1)

措辞(堆栈/堆)不精确

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

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

在我看来,你不应该使用不属于标准的概念(因此取决于实施)来推理正确性。而是使用存储持续时间和范围。

我推测Tim Mattson使用堆栈/堆,因为它们可能更广为人知。

1 OpenMP允许控制线程的stacksize,但没有进一步引用堆栈的内容。

您指出的具体示例是错误的

即使您考虑简化:

  • 自动存储持续时间==“stack”
  • 已分配/动态 2 存储持续时间==“堆”

您的分析是正确的,引用适用。根据2.15.1.1,对于具有在构造内的范围内声明的的自动存储持续时间的对象,没有预定的数据共享规则。因此,它是一个带有隐式确定的数据共享属性的变量

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