我已经开始将 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 没有任何固有的内容。]