1

我有一个与 Portland Group FORTRAN 90 编译器有关的非常奇怪的问题。我正在尝试运行依赖于数组溢出才能正常工作的代码。这段代码不是我写的!发起者必须使用标志“-tp=piii”对其进行编译,以强制编译器避免进行破坏数组溢出的优化。我猜这个想法是为旧 P3 编写的编译器太原始而无法做这种事情。现在,当我尝试做同样的事情时,我收到消息“此安装不支持 pgf90-Fatal --tp piii”。所以我不能做同样的事情。

那么: pgf90 在其默认操作中是否会破坏代码所需的那种数组溢出?与我一起工作的人显然认为确实如此。而且,如果确实如此,是否可以使用其他一些标志来从“-tp = piii”标志中获取我需要的东西?

打赌你从来没有想过你会收到这样的问题!想想的感受。是的,一旦我能说服我的饲养员让我这样做,我就会重写它。

4

2 回答 2

2

我不再熟悉 PGI 编译器,也没有手头的文档,因此无法直接引导您使用所需的编译器选项,但它会在数组边界边界检查之类的东西下被索引。

在 Fortran 90 之前,编写忽略或不知道数组边界的代码是常见的做法。以这种方式编写的大部分代码仍然在野外,我(像大多数 Fortran 程序员一样)经常遇到它。可悲的是(这是有争议的),这是一种可以接受的编写代码方式的态度。如果我在野外遇到这种态度,我会以极端的偏见终止它。

咆哮……这是至少一些目前广泛使用的 Fortran 编译器的默认行为,它不会自动生成在运行时当程序超出数组边界时会发脾气的代码。但是,它们都可以选择生成包含运行时边界检查的代码。

在运行时不检查数组边界通常意味着更快的代码,大多数 Fortran 用户对更快的代码非常感兴趣,这在某种程度上解释了编译器的默认行为。

因此,总而言之,重现您继承的代码的所需行为应该不会有太多麻烦。如果 PGI 编译器没有默认不检查数组边界,我会感到有点惊讶。但它肯定可以选择打开或关闭该功能。

于 2012-08-31T20:29:00.080 回答
0

以防万一有人遇到与“piii”标志相同的问题,最近的 PGI 编译器确实支持此标志....如果您安装了 32 位库。而且,事实证明,我没有。

于 2012-09-01T00:19:59.127 回答