gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:08 26 4
gpt4 key购买 nike

我在看这个 OpenMP 简介系列视频,主持人一直在重复“堆是共享的,堆栈是私有(private)的”。还提到数据和文本区域是共享的。然而,他给出了父线程的堆栈变量显然是共享的示例,并且他一直将这些变量称为“在堆上”。这是一个例子:

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

他声称变量 indexcount 在“堆上”。 index不是在父线程的栈上吗? count 不是静态变量,所以不是数据区的一部分吗?在我自己的 OMP 程序中,如果我打印这些变量的地址,它们似乎分别位于堆栈和数据区域。到目前为止,这并不是他将变量称为“在堆上”的唯一地方,据我所知,这些变量是共享,但不是在堆上。我只是想确保我没有遗漏任何有关 OMP 工作方式的信息。

阅读规范,我能找到关于并行区域外堆栈变量“隐式共享”的最清晰的声明:

For constructs other than task generating constructs or target constructs, if no default clause is present, these variables reference the variables with the same names that exist in the enclosing context

OpenMP 4.5 规范 p.182

最佳答案

措辞(栈/堆)不准确

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

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

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

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

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

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

即使你考虑简化:

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

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

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

关于c - 如果共享,OpenMP 是否会将堆栈或数据变量移动到堆中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48135794/

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