我已经开始使用Fortran(95)生成一些数字代码(生成python模块)。下面是一个简单的例子:Fortran:32位/ 64位性能可移植性
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的酷睿2,雪豹,gfortran 4.2.3从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位整型,所以没有什么固有的FORTRAN]
谢谢 - 我曾经找过类似的东西,但一直没能找到它。不幸的是,它并没有真正解决我的问题 - 我用f2py封装子程序,当我使用该选项时,它会扼流(总线错误),因为我猜f2py为32位整数生成整数。所以如果我这样做,我仍然必须手动编辑每个平台的生成的接口,这是我想要避免的(只是想把它给人)。我真的很想从http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Kind-Notation.html那里得到类似kind = 7的东西,但它似乎已经过时(不适用于gfortran) – robince 2009-11-03 17:59:24
我一直没有能够得到G95的雪豹工作,但我期待得到一个支付(英特尔) – robince 2009-11-03 18:00:30