我目前使用 OpenMP 来并行化遗留应用程序。在我的工作中,我们将 INTENT 添加到子程序和函数的参数中,这些子程序和函数将在并行线程中调用,并广泛使用 keywork pure 来让编译器检查函数和子路由的无副作用代码,以确保不更改任何代码全局状态。
现在我注意到了,在 OpenMP 标准(包括 4.0 草案)中是这样写的:
“Fortran 限制:以下限制适用于所有 OpenMP 指令: • OpenMP 指令不得出现在 PURE 或 ELEMENTAL 过程中。”
为什么呢?尤其是 INTENT 和 pure 是强制编译器检查无副作用代码的好工具。为什么不允许合并?其背后的技术原因是什么?
当前实现的代码编译和运行没有错误,没有任何抱怨,它实际上是并行运行的,我们可以通过工具和流程管理工具看到它。
如果不是这样,我们如何利用编译器检查无副作用的代码并与 OpenMP 并行运行?当前的应用程序广泛使用(更改的)全局状态来进行我们需要识别的运行时控制。
它主要使用英特尔 Fortran 编译器 (ifort) 进行测试。