为什么xlf和ifort在Array Bounds Read上有不同的看法?

时间:2012-11-09 18:16:04

标签: fortran

我正在尝试将ifort编译器中的代码移植到ibm xlf编译器。它在redhat上的ifort下运行良好,但在AIX系统上给xlf下的结果包含“NaNQ”。事实证明,在代码中有一个数组边界读取成本问题,这是一个简化的例子:

program main                                                                                                                                                    
implicit none                                                                                                                                                   
real(8)::a(1,0:10)=0.D0                                                                                                                                         

print *, a(1,-1)                                                                                                                                                
end program main 

使用两个编译器我可以成功编译它,没有任何错误或警告。 在ifort我得到结果:

0.000000000000000E+000

但是在xlf上,我得到了:

0.247032822920623272E-322

但是,如果我阅读更多的边界,xlf将无法编译,但ifort编译成功。

program main                                                                                                                                                    
implicit none                                                                                                                                                   
real(8)::a(1,0:10)=0.D0                                                                                                                                         

print *, a(1,-3:-1)                                                                                                                                                
end program main

关于ifort我得到:

0.000000000000000E+000  0.000000000000000E+000  0.000000000000000E+000

在xlf上它不会编译:

"1.f90", line 5.9: 1516-023 (S) Subscript is out of bounds.
** main   === End of Compilation 1 ===
1501-511  Compilation failed for file 1.f90.

为什么ifort和xlf在这个跨界读取时有不同的看法?有没有办法让编译器严格检查它并防止跨边界读取发生?毕竟,我花了很长时间才在我们的代码中捕获这个错误,因为我们的小组已经使用这段代码超过15年而没有任何问题。感谢。

1 个答案:

答案 0 :(得分:4)

大多数Fortran编译器都有在运行时检查数组边界错误的选项。在具有常量索引的这些示例中,可以在编译时找到错误,一些编译器而不是其他编译器将在不使用非默认选项的情况下执行。使用ifort使用-check bounds来请求数组边界检查。您可以使用-check all进行额外检查。这些选项通常不是默认选项,因为存在运行时成本。但得到错误答案的成本可能会高得多!我发现运行时成本经常低得惊人,建议在代码开发期间使用运行时检查,如果运行时成本可以接受,甚至可以在生产中使用。