2009-11-03 102 views
2

我已经开始使用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]

回答

2

回答你的主要问题'是选择正确的编译器选项,以32或64位声明默认的整数。我从来没有使用gfortran(我更喜欢g95,甚至更好的付费编译器),所以我谷歌搜索,似乎-fdefault-integer-8是你需要的选项。

就像你我很惊讶,64位版本比32位版本慢。在这一点上我没有任何亮点。

+0

谢谢 - 我曾经找过类似的东西,但一直没能找到它。不幸的是,它并没有真正解决我的问题 - 我用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

+0

我一直没有能够得到G95的雪豹工作,但我期待得到一个支付(英特尔) – robince 2009-11-03 18:00:30

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快得多。

2

真的也试过使用64位来运行watfor 77但我的是完全不可能的。我有一个gf-FOR-compiler用于我的64位,并尝试了一些选项在谷歌上使用后来给出了一个选项使用gcc-mp 4.3和gfortran 4.3。版本仍然很慢。 我建议你使用32位机器,这是一个fortran压缩运行你的程序或降级你的64位到32位来运行你的progs更快,更准确。 让我们继续研究,以便通过WATFOR77和子例程来实现64位机器的运行。