我正在尝试使用OpenMP并行化C程序。

我想进一步了解:

  • threadprivate 指令与私有(private)子句和
  • 之间的区别
  • 在这种情况下,我们必须使用其中任何一个。

  • 据我所知,区别在于 threadprivate 的全局范围和跨并行区域的保留值。我在几个示例中发现,当一段代码包含一些必须私有(private)化的全局/静态变量时,这些变量将包含在 threadprivate 列表中,并且使用 copyin 将它们的初始值复制到私有(private)副本中。

    但是,是否有任何规则可以阻止我们使用私有(private)子句来处理全局/静态变量?也许任何实现细节?

    我在OpenMP3.0规范中找不到任何解释。

    最佳答案

    您必须记住的最重要的区别是:

  • private变量是区域的局部变量,大多数情况下将放置在堆栈上。变量隐私的生存期是数据作用域定义的持续时间。每个线程(包括主线程)都对原始变量进行私有(private)复制(新变量不再与原始变量在存储上相关联)。
  • 另一方面,threadprivate变量很可能放在 thread local storage (可以看作是线程本地的全局内存)中。 threadprivate变量跨区域持久(取决于某些限制)。主线程使用原始变量,所有其他线程都对原始变量进行私有(private)复制(主变量仍与原始变量在存储上相关联)。


  • 还有更多棘手的区别:
  • 进入构造时,每个线程都未定义为private定义的变量,退出并行构造时,未定义相应的共享变量。 private指针的初始状态为undefined。
  • 但是,除非指定了threadprivate子句,否则应假定copyin公共(public)块中的数据在进入第一个并行区域时未定义。当一个公共(public)块出现在threadprivate指令中时,每个线程副本在首次使用之前都要初始化一次。
  • OpenMP Specifications(第2.14.2节)实际上对threadprivate指令给出了很好的描述(并且也进行了更详细的介绍):

  • 10-08 14:31