我有一个与Portland Group FORTRAN 90编译器有关的非常奇怪的问题。我正在尝试运行依赖数组溢出的代码才能正常工作。 我没有写这段代码!发起者必须使用标志“-tp = piii”编译它,以强制编译器避免进行优化,从而破坏阵列溢出。我想这个想法是为旧P3编写的编译器太原始了,无法做到这一点。现在,当我尝试做同样的事情时,我收到消息“pgf90-Fatal --tp piii在此安装中不受支持。”所以我不能做同样的事情。
那么:pgf90在默认操作中是否会破坏代码所需的数组溢出?我与之合作的人显然认为这样做。并且,如果确实如此,是否可以使用其他标志来从“-tp = piii”标志中获取我需要的内容?
打赌,你从没想过会有这样的问题!试想一下我的感受。是的,一旦我说服我的管理员让我这样做,我就会重写它。答案 0 :(得分:2)
我不再熟悉PGI编译器并且没有手头的文档,因此无法直接指导您所需的编译器选项,但它将被编入 array bounds <之类的索引/ em>或边界检查。
在Fortran 90之前,通常的做法是编写忽略或忽略数组边界的代码。以这种方式编写的大部分代码仍然存在,我(像大多数Fortran程序员一样)经常遇到它。可悲的是(这是有争议的)态度,这是一种可以接受的编写代码的方式;如果我在野外遇到这种态度,我会以极端的偏见终止它。
Rant over ...这是目前广泛使用的至少一些Fortran编译器的默认行为,它们不会自动生成代码,这些代码在运行时会在程序超出数组边界时发出异议。但是,所有这些都可以选择生成在运行时包含边界检查的代码。
在运行时不检查数组边界通常意味着更快的代码,并且大多数Fortran用户对更快的代码非常感兴趣,这在某种程度上解释了编译器的默认行为。
因此,总而言之,再生您继承的代码所需的行为不应该有太多麻烦。如果PGI编译器没有默认不检查数组边界,我会有点惊讶;但它肯定有一个选项可以打开或关闭功能。
答案 1 :(得分:0)
以防任何人遇到与“piii”标志相同的问题,最近的PGI编译器确实支持这个标志....如果您安装了32位库。事实证明,我没有。