我正在观看此OpenMP系列视频简介,并且演示者不断重复这一点,#heap;堆是共享的,堆栈是私有的"。还提到数据和文本区域是共享的。然而,他举例说明了父线程的堆栈变量显然是共享的,并且他一直将这些变量称为"在堆上#34;。这是一个例子:
https://youtu.be/dlrbD0mMMcQ?t=2m57s
他声称变量index
和count
在"上是"。在父线程的堆栈上是不是index
? Isn' t count
是一个静态变量,还是数据区域的一部分?在我自己的OMP程序中,如果我打印这些变量的地址,它们看起来分别位于堆栈和数据区域。到目前为止,这并不是唯一一个将变量称为“#34;在堆上”的地方。据我所知,共享,但不是在堆上。我只是想确保我不会错过OMP工作方式。
阅读规范,我可以找到最明确的声明,用于"隐式共享"并行区域外的堆栈变量:
对于除任务生成构造或目标构造之外的构造,如果不存在缺省子句,则这些变量引用具有封闭上下文中存在的相同名称的变量
OpenMP 4.5规范第182页
答案 0 :(得分:1)
OpenMP标准没有引用 1 来堆叠或堆叠其内存模型。所以我会用实现定义回答你的问题。如果共享,我认为没有理由将堆栈变量的数据移动到堆中。如果通过查看共享变量的指针看到它们在堆栈中,我实际上相信这一点。
即使C标准也不包含对堆栈或堆的引用。
在我看来,你不应该使用不属于标准的概念(因此取决于实施)来推理正确性。而是使用存储持续时间和范围。
我推测Tim Mattson使用堆栈/堆,因为它们可能更广为人知。
1 OpenMP允许控制线程的stacksize,但没有进一步引用堆栈的内容。
即使您考虑简化:
您的分析是正确的,引用适用。根据2.15.1.1,对于具有在构造内的范围内声明的不的自动存储持续时间的对象,没有预定的数据共享规则。因此,它是一个带有隐式确定的数据共享属性的变量。
2令人困惑的是,C标准使用“分配的存储持续时间”而C ++ 和OpenMP使用“动态存储持续时间”。