这是我编写的用于测试多线程独立读取文件的程序:
gfortran -fopenmp -o exe a.f90
我是由gfortran编译器编译而没有收到任何错误:./exe
,并运行./exe
,但每次运行ifort -qopenmp -o exe a.f90
时都会遇到不同的错误。但是,我也使用ifort编译它:./exe
,并成功运行它At line 15 of file fortran_learning_book.f90 (unit = 102)
Fortran runtime error: File already opened in another unit
Program aborted. Backtrace:
Program aborted. Backtrace:
#0 0x10c30aff2
#0 0x10c30aff2
Program aborted.
。
gfortran在运行时出现的错误之一是
{
"hello": "Hello, World!",
"lang_msg": "This message is in English."
}
答案 0 :(得分:2)
您的代码不是有效的标准Fortran,因此使用不同的编译器会显示未定义的行为。 Fortran标准非常明确:
如果某个文件已连接到某个单元,则该文件中具有不同单元的OPEN语句不会被执行。
(ISO / IEC 1539-1:2010第9.5.6.1节)
与其他语言不同,标准Fortran不允许多次打开同一个文件。
编辑:正如IanH所指出的那样,即将推出的Fortran标准(非正式名称为Fortran 2015)将正式删除限制,但仍会在实施时决定是否有多个连接到同一个文件允许与否。
GNU Fortran和英特尔Fortran都能够使用OpenMP扩展编译正确的 Fortran代码。
答案 1 :(得分:1)
我怀疑您的问题的根源是您没有向action
语句提供任何open
参数。实际上,在新打开的文件上允许(read
,write
或readwrite
)的默认操作是实现定义的。因此,您可能会在例如readwrite
模式下并行打开相同文件多次,特别是允许来自多个独立单元的write
模式,从而导致潜在的文件不一致。然后编译器和/或运行时库可能会或可能不会检查这种(in)一致性并将其报告为错误...从它的外观看,gfrotran和ifort在至少一个中有不同的方法两部分(默认操作和/或RTL检查)。
唯一的例子是同一个文件的这种并行打开是“合法的”,如果你限制访问阅读模式,则是安全的。因此,将action='read'
添加到open
语句可能只会解决问题。实际上,它适用于gfortran版本5.4.0。
现在,我们处于灰色区域(至少对我来说),我真的不知道这一切是多么便携/符合标准。因此,尽管我认为这解决了您的直接问题,但我无法评论不同编译器之间代码的整体可移植性。