いくつかの数値コード (Python モジュールの生成) に Fortran (95) を使い始めました。簡単な例を次に示します。
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 ビット整数型を使用していることが原因である可能性があることに最終的に気付きました。実際、整数 * 8 に置き換えると、64 ビットのパフォーマンスは 32 ビットのパフォーマンスよりも 25% だけ悪くなります。
64 ビット マシンで 32 ビット整数の使用が非常に遅いのはなぜですか? 私が気付いていない可能性のあるインデックス作成で暗黙のキャストが行われていますか?
このタイプのコードでは、64 ビットが 32 ビットよりも遅くなるというのは常にあるのでしょうか (私はこれに驚きました)。それとも、64 ビットでコンパイルされたバージョンを同じ速度またはより速く実行できる可能性はありますか?
(主な質問)(整数)変数を「ネイティブ」型として宣言する方法はありますか...つまり、32ビットでコンパイルすると32ビット、最新のfortranで64ビットでコンパイルすると64ビットです。これがなければ、コンパイル方法に応じてそれほど遅くならない移植可能なfortranコードを書くことは不可能に思えます.これは、プロジェクトでfortranを使用するのをやめなければならないことを意味すると思います. kind と selected_kind を見てきましたが、これを行うものは見つかりませんでした。
[編集: 大きなパフォーマンス ヒットは、配列をコピーして 64 ビット int から 32 ビット int にキャストする f2py ラッパーによるもので、fortran に固有のものは何もありません。]