我已经开始使用 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、来自 r.research.att.com 的 gfortran 4.2.3)。我终于意识到这可能是由于使用了 32 位整数类型而不是 native 类型,事实上,当我替换为整数*8 时,64 位性能只比 32 位差 25%。
为什么在 64 位机器上使用 32 位整数要慢得多?索引中是否存在我可能不知道的隐式转换?
对于这种类型的代码,64 位总是比 32 位慢(我对此感到惊讶) - 或者我是否有机会让 64 位编译版本运行相同的速度或更快?
(主要问题)有没有办法将(整数)变量声明为“ native ”类型...即在 32 位中编译时为 32 位,在 64 位中编译时为 64 位现代 Fortran。如果没有这个,似乎就不可能编写可移植的 Fortran 代码,该代码不会慢很多,具体取决于其编译方式 - 我认为这意味着我将不得不停止在我的项目中使用 Fortran。我查看过 kind 和 selected_kind 但找不到任何可以做到这一点的东西。
[编辑:巨大的性能损失来自 f2py 包装器复制数组并将其从 64 位 int 转换为 32 位 int,因此 fortran 没有任何固有的东西。]
最佳答案
“主要问题”的答案是选择正确的编译器选项,以使用 32 或 64 位声明默认整数。我从不使用 gfortran(我更喜欢 g95,甚至更好的是付费编译器),所以我在 Google 上搜索,似乎 -fdefault-integer-8 是您需要的选项。
和您一样,我很惊讶 64 位版本比 32 位版本慢。关于这一点我没有任何说明。
关于performance - Fortran:32 位/64 位性能可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1668899/