2

我已经开始将 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 倍(来自 r.research.att.com 的 macbook pro core2duo、snow leopard、gfortran 4.2.3)。我终于意识到这可能是由于使用 32 位整数类型而不是本机类型,实际上当我用整数 * 8 替换时,64 位性能仅比 32 位低 25%。

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

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

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

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

4

3 回答 3

2

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

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

于 2009-11-03T17:42:59.747 回答
2

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

于 2012-12-12T06:02:06.043 回答
1

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

我建议尝试更新版本的 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 快得多。

于 2009-11-03T18:40:23.100 回答