我正在尝试使用OpenMP并行化C程序。
我想进一步了解:
据我所知,区别在于 threadprivate 的全局范围和跨并行区域的保留值。我在几个示例中发现,当一段代码包含一些必须私有(private)化的全局/静态变量时,这些变量将包含在 threadprivate 列表中,并且使用 copyin 将它们的初始值复制到私有(private)副本中。
但是,是否有任何规则可以阻止我们使用私有(private)子句来处理全局/静态变量?也许任何实现细节?
我在OpenMP3.0规范中找不到任何解释。
最佳答案
您必须记住的最重要的区别是:
private
变量是区域的局部变量,大多数情况下将放置在堆栈上。变量隐私的生存期是数据作用域定义的持续时间。每个线程(包括主线程)都对原始变量进行私有(private)复制(新变量不再与原始变量在存储上相关联)。 threadprivate
变量很可能放在堆或 thread local storage (可以看作是线程本地的全局内存)中。 threadprivate
变量跨区域持久(取决于某些限制)。主线程使用原始变量,所有其他线程都对原始变量进行私有(private)复制(主变量仍与原始变量在存储上相关联)。 private
定义的变量,退出并行构造时,未定义相应的共享变量。 private
指针的初始状态为undefined。 threadprivate
子句,否则应假定copyin
公共(public)块中的数据在进入第一个并行区域时未定义。当一个公共(public)块出现在threadprivate
指令中时,每个线程副本在首次使用之前都要初始化一次。 threadprivate
指令给出了很好的描述(并且也进行了更详细的介绍):