3

Intel の Visual Fortran Composer XE 2011、12.1.3537.2010 を使用していますが、組み込みfindloc関数はサポートされていないようです (2008 fortran 中規模拡張で追加)。

私がやりたいことは、配列内の特定の値を検索し、インデックスを返すことです。ほとんどの場合、小さなサイズの配列で作業します。

2 つの質問があります。

  1. 線形検索とバイナリ検索をこの機能に置き換えたいのですが、他のスレッドで読んだように、最適なパフォーマンスのためにどのアルゴリズムが優先されるかは明確ではありません。組み込み関数はどのように問題を処理しますか?
  2. 私のコンパイラではこれがサポートされていないため、エミュレートする方法findlocは次のようになります。

    minloc( (array-value)**2 )
    

    しかし... パフォーマンスはどうですか?他のアイデアはありますか?

4

2 に答える 2

5

あなたの最初の質問を正しく理解できたら、まだ実装されていない関数がどのように実装されているか知りたいですか? findloc具体的には、線形検索とバイナリ検索を自分で実装した可能性があるため、それらと比較した場合のパフォーマンス特性を知りたいですか? 関数の実装方法を義務付ける言語標準には確かに何もないため、質問に対する答えは完全にコンパイラ固有です。

2 番目の質問については、ほとんどのコンパイラが、式に応答して一時的な配列を作成することを期待していますarray-value。このような一時ファイルの作成は、比較的時間のかかる操作である可能性が高く、 への呼び出しの実行時間に追加されminlocます。のインテルの実装がどのようにminloc機能するかはわかりませんが、配列を介した線形スキャンであると予想しています。配列がソートされていること、および二分探索の方が高速である可能性があることを組み込み関数が認識する方法はありません。

配列が小さく、並べ替えられていない場合、線形検索が最速のオプションになると思います。それらが小さく、ソートされている場合は、線形検索よりも優れたバイナリ検索 (または同様のもの) を作成できる可能性があります。2 つのアプローチのパフォーマンス グラフにはクロス オーバーがあると予想されます

ただし、常にパフォーマンスの問題と同様に、私 (または他の誰か) が役に立たないと思うことはデータです。必要なのはデータです。先に進んで測定を行ってみませんか?

于 2013-02-18T12:19:06.290 に答える
0

パフォーマンスに関心がある場合は、いずれにしても独自のマルチスレッド バージョンを作成してください。回避策はよく知られており、minlocで何度か議論されていcomp.lang.fortranますが、パフォーマンスが必要な場合は、実際には良くありません。丸めやオーバーフローの問題もあるかもしれません。

一般的な配列がある場合は、それを直線的に処理する必要があります。並べ替えられていて大きい場合は、バイナリ検索を使用できます (ただし、通常、比較ごとのオーバーヘッドが大きくなることに注意してください)。

于 2013-02-18T12:18:25.973 に答える