5

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

4

1 回答 1

6

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

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

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

于 2021-06-11T06:17:14.977 回答