Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Fortran:32位/64位性能可移植性_Performance_Fortran_32bit 64bit_Numerical_F2py - Fatal编程技术网

Performance Fortran:32位/64位性能可移植性

Performance Fortran:32位/64位性能可移植性,performance,fortran,32bit-64bit,numerical,f2py,Performance,Fortran,32bit 64bit,Numerical,F2py,我已经开始使用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 =

我已经开始使用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位整数类型而不是本机类型,事实上,当我使用integer*8替换时,64位的性能仅比32位的性能差25%

为什么在64位机器上使用32位整数要慢得多?在索引过程中是否存在我可能不知道的任何隐式强制转换

对于这种类型的代码,64位总是比32位慢(我对此感到惊讶),还是有可能让64位编译版本运行相同的速度或更快

主要问题)是否有任何方法将(整数)变量声明为“本机”类型。。。在现代fortran中编译32位时为32位,编译64位时为64位。如果没有这一点,似乎就不可能编写可移植的fortran代码,根据编译的方式,它的速度不会慢很多——我认为这意味着我将不得不停止在我的项目中使用fortran。我查看了kind并选择了_kind,但找不到任何能做到这一点的东西


[编辑:最大的性能损失来自f2py包装器复制数组以将其从64位int转换为32位int,因此fortran没有任何固有特性。]

您的“主要问题”的答案是选择正确的编译器选项,将默认整数声明为32位或64位。我从不使用gfortran(我更喜欢g95,甚至更喜欢付费编译器),所以我在谷歌上搜索了一下,似乎-fdefault-integer-8是您需要的选项


和你一样,我很惊讶64位版本比32位版本慢。在这一点上我没有任何启发。

虽然我没有仔细研究,但我没有看到如此大的速度差异

我建议尝试更新版本的gfortran。版本4.2更早(gfortran从4.0开始),被认为已经过时。4.3和4.4有了很大的改进,具有更多的功能。4.4是当前的非测试版。在Mac上获取它们的一个简单方法是通过MacPorts:gcc43和gcc44包包括gfortran。编译器安装为gcc-mp-4.3、gfortran-mp-4.3等,以免与其他版本冲突。或者您可以从gfortran wiki页面尝试最新版本的4.5


英特尔fortran有时比gfortran快得多。

确实也尝试过使用64位来运行watfor 77,但我的完全不可能。我的64位编译器有一个gf,我在google ans上尝试了一些选项,后来有了使用gcc mp 4.3和gfortran 4.3的选项。仍然很慢的版本。 我建议您使用32位机器,这是fortran compactible来运行您的程序,或者将您的64位降级为32位以更快、更准确地运行您的程序。
让我们继续研究,以使64位机器能够运行WATFOR77和子程序程序。

谢谢-我曾寻找过类似的程序,但未能找到。不幸的是,它并没有真正解决我的问题——我正在用f2py包装子程序,当我使用该选项时,它会阻塞(总线错误),因为我猜f2py生成了32位整数的整数面。因此,如果我这样做,我仍然必须手动编辑为每个平台生成的界面,这是我想要避免的(只是想给人们)。我真的很想要像kind=7这样的东西,但它似乎已经过时了(在gfortran上不起作用)我还没能让g95在雪豹上工作,但我正在考虑买一个付费的(英特尔)