performance - Fortran:32 位/64 位性能可移植性

标签 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 = 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 位整数类型而不是 native 类型,事实上,当我替换为整数*8 时,64 位性能只比 32 位差 25%。

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

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

(主要问题)有没有办法将(整数)变量声明为“ native ”类型...即在 32 位中编译时为 32 位,在 64 位中编译时为 64 位现代 Fortran。如果没有这个,似乎就不可能编写可移植的 Fortran 代码,该代码不会慢很多,具体取决于其编译方式 - 我认为这意味着我将不得不停止在我的项目中使用 Fortran。我查看过 kind 和 selected_kind 但找不到任何可以做到这一点的东西。

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

最佳答案

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

和您一样,我很惊讶 64 位版本比 32 位版本慢。关于这一点我没有任何说明。

关于performance - Fortran:32 位/64 位性能可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1668899/

相关文章:

sql - 生成行组合的最快方法

c - 有什么方法可以在数学上改进这个 C 按位​​函数吗?

performance - CFScript查询性能很差

c++ - 32 位到 64 位内联汇编移植

c# - .NET Framework 类如何在不特定位数的情况下引用 native Windows DLL?

c# - BHO 插件不适用于 64 位操作系统上的 IE7

c++ - "std::string + char"表达式是否创建另一个 std::string?

fortran - Fortran MPI 代码中的标准输出

c++ - 是否可以从 C++ 调用 Fortran 接口(interface)

floating-point - 如何将复数的虚部设置为零?