Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran和OpenMP:为什么纯过程中不允许使用OpenMP指令?_Fortran_Openmp_Procedure - Fatal编程技术网

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

Fortran和OpenMP:为什么纯过程中不允许使用OpenMP指令?,fortran,openmp,procedure,Fortran,Openmp,Procedure,我目前使用OpenMP并行化遗留应用程序。在我的工作中,我们在子例程和函数的参数中添加了意图,这些参数将在并行线程中调用,并广泛使用keywork pure,以使编译器检查函数和子例程的无副作用代码,确保不会更改任何全局状态 现在我注意到,在OpenMP标准(包括4.0草案)中,它是这样写的: “Fortran限制:以下限制适用于所有OpenMP 指令:•OpenMP指令可能不会以纯或元素形式出现 程序。” 为什么会这样?特别是INTENT和pure是迫使编译器检查无副作用代码的好工具。为什么不

我目前使用OpenMP并行化遗留应用程序。在我的工作中,我们在子例程和函数的参数中添加了意图,这些参数将在并行线程中调用,并广泛使用keywork pure,以使编译器检查函数和子例程的无副作用代码,确保不会更改任何全局状态

现在我注意到,在OpenMP标准(包括4.0草案)中,它是这样写的:

“Fortran限制:以下限制适用于所有OpenMP 指令:•OpenMP指令可能不会以纯或元素形式出现 程序。”

为什么会这样?特别是INTENT和pure是迫使编译器检查无副作用代码的好工具。为什么不允许合并?背后的技术原因是什么

当前实现的代码编译和运行没有bug,没有任何抱怨,并且它实际上是并行运行的,正如我们可以通过工具和流程管理工具看到的那样

如果不是这样,我们如何利用编译器检查无副作用的代码并与OpenMP并行运行?当前应用程序广泛使用(更改的)全局状态来进行运行时控制,我们需要对其进行识别


它主要是用英特尔Fortran编译器(ifort)测试的。

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

是的,这是肯定的,但是OpenMP实现对于Fortran本身应该是透明的。Fortran可以保证,子例程/函数是纯的,没有站点效应。OpenMP稍后对此所做的说明目前并不相关,但Fortran代码本身没有站点效应,这是并行执行的一个重要条件。那么,我的想法有什么错呢?在线程库中出现运行时异常之前,它是没有副作用的。请记住,即使是
write
stop
error stop
在纯过程中也是不允许的。是的,这很清楚,但我看不出真正的问题。Pure是用于Fortran的,我希望Fortran代码能够在并行站点上运行,不会产生任何影响。在应用OpenMP之后,它不再是纯粹的,这没关系。我对此没有异议。由于纯检查,算法的并行执行应该是安全的。但是,现在不在纯函数中使用OpenMP的原因是什么?什么东西真的可以打破?问题是什么?对于纯过程中的使用,必须有技术原因进行警告。这是什么?PURE向过程的调用者保证全局机器状态将如何改变。OpenMP指令的行为取决于这些指令的执行顺序,它打破了这些保证。我想到了这个解释,但是FALALL和BASE也被允许,所以它不仅是计算的顺序,而且是全局状态。为了清晰起见,编辑问题标题。“为什么纯过程中不允许OpenMP指令?”正如你被允许(更典型地说,是必需的!)做相反的事情一样。是的,你完全正确。@Rick RainerLudwig-我在这个问题上随意更改了标记,因为标记实际上是不连贯的,指的是and和“纯CSS”以及Fortran中的纯过程。我不懂Fortran,所以如果我的编辑没有意义,请告诉我!