【问题标题】:Fortran: 32 bit / 64 bit performance portabilityFortran:32 位/64 位性能可移植性
【发布时间】:2026-01-29 04:35:01
【问题描述】:

我已经开始将 Fortran (95) 用于一些数字代码(生成 python 模块)。这是一个简单的例子:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

我发现这在 32 位中表现得非常好,但当编译为 x86_64 时,它的速度要慢 5 倍(macbook pro core2duo、snow leopard、gfortran 4.2.3 from r.research.att.com)。我终于意识到这可能是由于使用 32 位整数类型而不是本机类型,实际上当我用整数 * 8 替换时,64 位性能仅比 32 位差 25%。

为什么在 64 位机器上使用 32 位整数会慢很多?索引是否存在我可能不知道的隐式转换?

对于这种类型的代码,64 位是否总是比 32 位慢(对此我感到很惊讶) - 或者我是否有机会让 64 位编译版本以相同或更快的速度运行?

(主要问题) 有没有办法将(整数)变量声明为“本机”类型...即编译为 32 位时为 32 位,编译为 64 位时为 64 位现代的fortran。没有这个,似乎不可能编写出不会变慢的可移植fortran代码,具体取决于它的编译方式——我认为这意味着我将不得不停止在我的项目中使用fortran。我查看了 kind 和 selected_kind 但找不到任何这样做的东西。

[编辑:较大的性能损失来自 f2py 包装器复制数组以将其从 64 位 int 转换为 32 位 int,因此 fortran 没有固有的内容。]

【问题讨论】:

    标签: performance fortran 32bit-64bit numerical f2py


    【解决方案1】:

    确实也尝试过使用 64 位来运行 watfor 77,但我的完全不可能。我为我的 64 位获得了一个 gf-FOR 编译器,并在 google ans 上尝试了一些选项,后来给出了使用 gcc 的选项-mp 4.3 和 gfortran 4.3。仍然很慢的版本。 我会建议您使用 32 位机器,它是 fortran 可压缩的以运行您的程序或将您的 64 位降级为 32 位以更快、更准确地运行您的程序。 让我们继续研究,以使 64 位机器与 WATFOR77 和 Subroutines progs 兼容运行。

    【讨论】:

      【解决方案2】:

      您的“主要问题”的答案是选择正确的编译器选项,以使用 32 位或 64 位声明默认整数。我从不使用 gfortran(我更喜欢 g95,甚至更好的是付费编译器),所以我用 Google 搜索了一下,似乎 -fdefault-integer-8 是您需要的选项。

      和你一样,我很惊讶 64 位版本比 32 位版本慢。在这一点上我没有任何启示。

      【讨论】:

      • 谢谢 - 我一直在寻找类似的东西,但没能找到。不幸的是,它并没有真正解决我的问题——我用 f2py 包装子例程,当我使用该选项时,它会阻塞(总线错误),因为我猜 f2py 为 32 位整数生成了 integerface。因此,如果我这样做,我仍然必须为每个平台手动编辑生成的界面,这是我想要避免的(只是想把它交给人们)。我真的想要来自gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Kind-Notation.html 的 kind=7 之类的东西,但它似乎已经过时(不适用于 gfortran)
      • 我无法让 g95 在雪豹上工作,但我正在考虑获得报酬(英特尔)
      【解决方案3】:

      虽然我没有仔细研究过,但我还没有看到如此大的速度差异。

      我建议尝试更新版本的 gfortran。 4.2 版本更早(gfortran 从 4.0 开始)并被认为已过时。 4.3 和 4.4 有了很大的改进,并有更多的功能。 4.4 是当前的非测试版。在 Mac 上获取它们的一种简单方法是通过 MacPorts:gcc43 和 gcc44 包包括 gfortran。编译器安装为gcc-mp-4.3、gfortran-mp-4.3等,以免与其他版本冲突。或者您可以从 gfortran wiki 页面尝试最新版本的 4.5。

      英特尔 fortran 有时比 gfortran 快得多。

      【讨论】:

        最近更新 更多