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

Do COMMON blocks in Fortran have to be declared threadprivate in every subroutine for OpenMP?

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

是的,它必须每次都出现。引用自 OpenMP 5.0 standard

If a threadprivate directive that specifies a common block name appears in one program unit, then such a directive must also appear in every other program unit that contains a COMMON statement that specifies the same name. It must appear after the last such COMMON statement in the program unit.

作为评论将 OpenMP 放入充满全局变量的程序中可能会导致痛苦的生活。在我开始这样的努力之前,我至少会考虑一下“我是否想从这里开始”——在添加 OpenMP 之前对代码进行现代化可能会成为一个更简单、更便宜的选择,尤其是在 [=16] =].