Fortran和OpenMP:为什么不允许在纯过程中使用OpenMP指令?

3
我目前使用OpenMP来并行化一个遗留应用程序。在我的工作中,我们为子例程和函数的参数添加了INTENT,并广泛使用关键字pure,以便让编译器检查函数和子例程是否具有无副作用的代码,以确保不更改任何全局状态。
现在,我注意到,在OpenMP标准(包括4.0草案)中写道:
“Fortran限制:所有OpenMP指令都适用以下限制:• OpenMP指令不能出现在PURE或ELEMENTAL过程中。”
为什么会这样?特别是INTENT和pure是强制编译器检查无副作用代码的好工具。为什么不允许它们结合使用?其背后的技术原因是什么?
当前实现的代码可以编译和运行,没有任何投诉,并且真正地在并行运行,我们可以通过工具和进程管理工具看到它。
如果不能这样工作,我们如何利用编译器检查无副作用的代码并与OpenMP并行运行?当前应用程序广泛使用(更改的)全局状态进行运行时控制,我们需要确定它。
它主要使用Intel Fortran Compiler(ifort)进行测试。

为了清晰明了,请考虑编辑问题标题 - “为什么不允许在纯过程中使用OpenMP指令?”因为通常可以(更常见的是必须)做相反的事情。 - IanH
是的,你说得完全正确。 - Rick-Rainer Ludwig
@Rick-RainerLudwig - 我冒昧地更改了这个问题上的[tag:pure]标签,因为[tag:pure]标签真的不连贯,既涉及purepure,也涉及“纯CSS”以及Fortran中的纯过程。我不懂Fortran,所以如果我的编辑没有意义,请告诉我! - Richard JP Le Guen
1个回答

1

OpenMP做的事情并不简单,比如启动线程和与操作系统交互。这与纯过程的概念模型不太兼容。


直到线程库中出现运行时异常,它才是无副作用的。请记住,在纯过程中甚至不允许使用“写入”、“停止”和“错误停止”。 - Vladimir F Героям слава
PURE向过程的调用者保证全局机器状态将如何改变。 OpenMP指令的行为取决于这些指令的执行顺序,以一种破坏这些保证的方式。 - IanH
问题:我应该担心全局状态吗?目前,我只希望Fortran代码是无副作用的。我不明白为什么我应该担心由OpenMP自身处理的全局状态。这对我真的很重要吗? - Rick-Rainer Ludwig
@Rick:我认为微妙之处在于pure属性并不能使过程摆脱副作用,它只是向编译器发出信号,并且以一种相当严格的方式:函数只能有intent(in)参数,子程序只能修改自己的intent([in]out)参数。不允许对程序状态产生任何其他影响。OpenMP确实具有这样的影响,但这并不意味着它们是不需要的。您只需自行验证算法是否线程安全,或使用本机Fortran(2008)共数组织并行化即可。 - sigma
是的,我也完全同意这种想法。但为什么在OpenMP标准中会写(两次!):“OpenMP指令不得出现在PURE或ELEMENTAL过程中。”按照你的论点,一个简短的警告就足够说明OpenMP会破坏纯函数,但不会对Fortran代码本身产生任何其他影响。问题是:真的是这样吗?还是背后有更多的东西?我仍然感到困惑,也没有在OpenMP.org论坛上得到具体的答案。 - Rick-Rainer Ludwig
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接