【发布时间】:2018-06-16 13:49:17
【问题描述】:
我正在观看 OpenMP 简介系列视频,演示者不断重复“堆是共享的,堆栈是私有的”。还提到数据和文本区域是共享的。然而,他给出了父线程的堆栈变量显然是共享的示例,并且他一直将这些变量称为“在堆上”。这是一个例子:
https://youtu.be/dlrbD0mMMcQ?t=2m57s
他声称变量index 和count 在“堆上”。 index不是在父线程的栈上吗? count 不是静态变量,所以不是数据区的一部分吗?在我自己的 OMP 程序中,如果我打印这些变量的地址,它们似乎分别位于堆栈和数据区域。到目前为止,这并不是他将变量称为“堆上”的唯一地方,据我所知,这些变量是共享的,但不是在堆上。我只是想确保我没有遗漏 OMP 的工作方式。
阅读规范,我能找到关于并行区域外堆栈变量“隐式共享”的最清晰的声明:
对于任务生成构造或目标构造以外的构造,如果不存在默认子句,则这些变量引用封闭上下文中存在的同名变量
OpenMP 4.5 规范第 182 页
【问题讨论】:
-
"heap is shared, stack is private"指的是每个单独线程的堆栈。显然,主线程的堆栈(例如main())可以包含线程之间共享的数据。 (就我个人而言,我不明白你怎么能指望通过观看某个中年灰人在屏幕上来回摇晃的视频来学习一门技术学科:) -
这是与此What resources are shared between threads?相关的上一个问题
-
我确实已经读过,并且很清楚线程共享的内容,尽管我用 C 和多线程标记了这个问题,但它更多的是关于 OpenMP 如何工作的问题。我同意这些视频可能不是最好的,但它们似乎是一个不错的介绍,除了将任何共享变量称为“堆变量”的问题。他对此非常一致,以至于我认为可能是因为这些视频已经有几年的历史了,可能是旧版本的 OpenMP 用于将共享变量移动到堆或其他东西。
-
是的,这很奇怪。你会认为发布视频的人会足够简洁,可以使用正确的措辞——但我多年来经历了足够多的蹩脚教授,知道情况并非总是如此。 (警惕互联网视频——很多时候它们不是最好的)无论是openMP pthreads等,这个概念都不会改变。每个线程都有自己的本地调用堆栈,并且线程本地的变量是私有的。几乎所有其他内容都可以共享。
-
@DavidC.Rankin,“在屏幕上来回摇晃的中年灰人”是来自英特尔的 Timothy "Tim" Mattson,曾任 OpenMP 架构审查委员会首席执行官,曾工作几乎每个版本的规范都在那里。我想他知道他在说什么。堆/堆栈术语不是 OpenMP 规范的一部分,纯粹用作标准定义的数据共享类的模型。 “栈是私有的”也是多线程执行正确性模型的一个中心假设。
标签: c multithreading openmp