首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么xlf和ifort在数组边界读取上采取不同的方式?

为什么xlf和ifort在数组边界读取上采取不同的方式?
EN

Stack Overflow用户
提问于 2012-11-10 02:16:04
回答 1查看 645关注 0票数 2

我正在尝试将一段代码从ifort编译器移植到ibm xlf编译器。它在redhat上的ifort下工作得很好,但在AIX系统上的xlf下给出的结果包含"NaNQ“。结果是有一个数组边界读取了这个问题的代码开销,下面是一个简化的例子:

代码语言:javascript
运行
复制
program main                                                                                                                                                    
implicit none                                                                                                                                                   
real(8)::a(1,0:10)=0.D0                                                                                                                                         

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

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

代码语言:javascript
运行
复制
0.000000000000000E+000

但是在xlf上,我得到了:

代码语言:javascript
运行
复制
0.247032822920623272E-322

但是,如果我在边界之外阅读更多内容,xlf将不会编译,但我会成功编译。

代码语言:javascript
运行
复制
program main                                                                                                                                                    
implicit none                                                                                                                                                   
real(8)::a(1,0:10)=0.D0                                                                                                                                         

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

在ifort上我得到:

代码语言:javascript
运行
复制
0.000000000000000E+000  0.000000000000000E+000  0.000000000000000E+000

在xlf上它不能编译:

代码语言:javascript
运行
复制
"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在这个跨边界读取上采取不同的方式?有没有办法让编译器严格检查它,并防止发生跨境读取?毕竟,我花了很长时间才在我们的代码中发现了这个bug,因为我们团队已经使用这个代码超过15年了,在ifort上没有任何问题。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-10 02:26:55

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13313703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档