我已经开始使用的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酷睿,雪豹,gfortran 4.2.3从r.research.att.com)。我终于意识到这可能是由于使用32位整数类型,而不是原生型的,而事实上,当我更换整数* 8 64位性能比32位更差只有25%。

为什么使用一个32位整数,以便慢得多64位机器上?是否有与索引,我可能不知道的?怎么回事任何隐式转换

时,它总是这样认为64位会比32位慢了这种类型的代码(我在这惊讶) - 或有机会我能得到64位编译版本上运行相同的速度或更快?

主要问题)是否有任何方式来声明(整数)变量是“天然”类型...即32位编译在64位时编译32位,64位时现代FORTRAN。如果没有这个现在看来似乎是不可能写出可移植的Fortran代码不会是很慢取决于其如何编译 - 我想这意味着我将不得不停止使用FORTRAN为我的项目。我已经看过实物和selected_kind,但未能找到任何这一点。

[编辑:大性能命中是从f2py包装复制阵列以从64位的int它转换为32位的int,所以没有什么固有的FORTRAN]

有帮助吗?

解决方案

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

像您我很惊讶的是,64位的版本比32位版本更慢。我没有什么照明在这一点上。

其他提示

真的还使用64位watfor 77运行试过,但我的是完全impossible.I得到了GF-FOR-编译器为我的64位,并试图在谷歌ANS使用一些选项后来考虑到使用gcc的选项-MP 4.3和4.3 gfortran。版本这仍然缓慢。 我会建议你使用一个32位的机器,这是FORTRAN压性运行您的程序或取消等级的64位到32位运行速度progs的和准确的。 让我们继续研究,以便得到一个64位机WATFOR77和子程序progs的campactibly乳宁。

虽然我没有做过细致的研究,我还没有看到这样的大的速度差。

我建议尝试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维基页面尝试的4.5最新版本。

英特尔Fortran有时显著快于gfortran。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top