我正在修改一些旧的 Fortran 代码以使用 OpenMP 指令运行,它大量使用了COMMON
块。我发现多个消息来源说,使用 OMP 指令将COMMON
块声明为通过为每个 OpenMP 线程提供自己的副本THREADPRIVATE
来解决块驻留在全局范围内的问题。COMMON
我不确定的是,THREADPRIVATE
指令是否需要在每个子程序的声明之后,或者是否在主程序(并且只有)PROGRAM
中就足够了?
问问题
132 次
1 回答
6
是的,它必须在每一次出现。引用OpenMP 5.0 标准
如果指定公共块名称的 threadprivate 指令出现在一个程序单元中,那么这样的指令也必须出现在包含指定相同名称的 COMMON 语句的每个其他程序单元中。它必须出现在程序单元中最后一个这样的 COMMON 语句之后。
作为评论将 OpenMP 放入一个充满全局变量的程序中可能会导致痛苦的生活。在我开始这样的努力之前,我至少会考虑“我想从这里开始吗” - 在添加 OpenMP 之前对代码进行现代化可能会成为一个更容易和更便宜的选择,尤其是从长远来看。
于 2021-06-11T06:17:14.977 回答