Fortran 中的 COMMON 块是否必须在 OpenMP 的每个子例程中声明为 threadprivate?

Fra*_*ank 5 fortran openmp fortran-common-block

我正在修改一些旧的 Fortran 代码以使用 OpenMP 指令运行,并且它大量使用了COMMON块。我发现多个消息来源说使用 OMP 指令将COMMON块声明为通过为每个 OpenMP 线程提供自己的副本THREADPRIVATE来解决COMMON驻留在全局范围内的块的问题。但我不确定的是,该THREADPRIVATE指令是否需要在每个子程序中声明之后,或者是否在主程序中(并且仅)具有它就PROGRAM足够了?

Ian*_*ush 6

是的,它必须每次出现。引用OpenMP 5.0 标准

如果指定公共块名称的 threadprivate 指令出现在一个程序单元中,那么这样的指令也必须出现在包含指定相同名称的 COMMON 语句的每个其他程序单元中。它必须出现在程序单元中最后一个这样的 COMMON 语句之后。

作为评论,将 OpenMP 放入一个充满全局变量的程序中可能会导致痛苦的生活。在我开始这样的努力之前,我至少会考虑一下“我想从这里开始吗” - 在添加 OpenMP 之前对代码进行现代化可能会成为一个更容易和更便宜的选择,尤其是从长远来看。