2

いくつかの数値コード (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 に固有のものは何もありません。]

4

3 に答える 3

2

「主な質問」に対する答えは、正しいコンパイラ オプションを選択して、デフォルトの整数を 32 ビットまたは 64 ビットで宣言することです。私は gfortran を使用したことがないので (g95 の方が好きで、有料のコンパイラの方が優れています)、Google で検索したところ、-fdefault-integer-8 が必要なオプションのようです。

あなたと同じように、64 ビット バージョンが 32 ビット バージョンより遅いことに驚きました。その点で私は何も照らしていません。

于 2009-11-03T17:42:59.747 に答える
2

本当に 64 ビットを使用して watfor 77 を実行しようとしましたが、私の場合は完全に不可能でした.およびgfortran 4.3。まだ遅かったバージョン。プログラムを実行するには Fortran 互換性のある 32 ビット マシンを使用するか、64 ビットを 32 ビットにデグレードしてプログラムをより高速かつ正確に実行することをお勧めします。WATFOR77 とサブルーチン プログラムで 64 ビット マシンが動作するように、研究を続けましょう。

于 2012-12-12T06:02:06.043 に答える
1

私は注意深い研究をしていませんが、それほど大きな速度の違いは見ていません。

新しいバージョンの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などとしてインストールされます。または、gfortranwikiページから4.5の最新ビルドを試すことができます。

Intel fortranは、gfortranよりも大幅に高速な場合があります。

于 2009-11-03T18:40:23.100 に答える