我一直开始使用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位编译版本以相同的速度或更快的速度运行?
(主要问题)有没有办法将(整数)变量声明为'本机'类型...即32位编译时32位,64位编译时64位现代的fortran。如果没有这个,似乎不可能编写便携式fortran代码,根据编译方式不会慢得多 - 而且我认为这意味着我将不得不停止为我的项目使用fortran。我看过kind和selected_kind,但却找不到任何可以做到这一点。
[编辑:大的性能命中来自f2py包装器复制数组,将其从64位int转换为32位int,因此fortran没有固有的东西。]
答案 0 :(得分:2)
“主要问题”的答案是选择正确的编译器选项,以使用32或64位声明默认整数。我从不使用gfortran(我更喜欢g95,甚至更好的付费编译器)所以我用Google搜索,似乎-fdefault-integer-8是你需要的选项。
和你一样,我很惊讶64位版本比32位版本慢。我对这一点没有任何启发。
答案 1 :(得分:2)
真的还尝试使用64位来运行watfor 77但是我的完全不可能。我为我的64位获得了一个gf-FOR-compiler并在google上尝试了一些选项以后使用gcc可以选择使用gcc -mp 4.3和gfortran 4.3。版本仍然很慢。 我建议你使用一台32位机器,这可以帮助你运行你的程序或将你的64位降级到32位以更快更准确地运行你的程序。 让我们继续研究,以便使用WATFOR77和Subroutines progs来获得64位机器的运行。
答案 2 :(得分:1)
虽然我没有仔细研究,但我没有看到如此大的速度差异。
我建议尝试更新版本的gfortran。版本4.2更早(gfortran从4.0开始)并且被认为是过时的。 4.3和4.4有很大的改进,并有更多的功能。 4.4是目前的非beta版本。在Mac上获取它们的简单方法是通过MacPorts:gcc43和gcc44软件包包括gfortran。编译器安装为gcc-mp-4.3,gfortran-mp-4.3等,以免与其他版本冲突。或者您可以从gfortran wiki页面尝试最新版本的4.5。
英特尔Fortran有时比gfortran快得多。