1

要素を持つ1 次元配列Rを使用するコードがあります。のような粒子3Nの位置ベクトルと考えることができます。配列を簡潔に使用するには、パターンをこのように定義する必要があることに注意してください。NR=[r1x,r1y,r1z,r2x,r2y,...]

コードのセクションでは、x 座標に対してのみいくつかの操作を実行する必要があります。私は現在、次のようなものを使用しています:

Rx => R(1:3N-2:3)

Rxその後、操作で使用されます。これにより、アクセスが不連続になりますが、操作をベクトル化する方法が期待できるかどうか疑問に思っていました。別の方法として、粒子上でループを使用して OMP を使用することもできます。この問題に関する専門家の考え、特にパフォーマンスに関する可能な限りのベストプラクティスを知りたいです。

4

1 に答える 1

5

ケーキを持って食べることもできません。連続していない配列要素にまたがってアクセスしたい場合は、パフォーマンスに代償を払うことになります。すべての要素がキャッシュに収まる小さな配列の場合、おそらく価格に気付かないでしょう。より大きな配列の場合、メモリ レイアウトの順序で配列要素を 1 つずつステップ実行する場合よりも、キャッシュを介してより多くのデータ移動を行うことになります。連続していない配列セクションへのポインターを使用しても、これらの事実が魔法のように変更されることはありません (ご存知のように)。

つまり、Fortran プログラマーが常に行ってきたことであり、最も一般的なアクセス パターンに合わせて配列のメモリ レイアウトを最適化します。あなたの場合、私たちの多くは、すべての(またはまたは) 要素に一緒にアクセスすることが、粒子ごとにアクセスするよりも頻繁であるかどうかに応じて、3,xランク 2 配列またはランク 2 配列のいずれかを使用します。x,3xyz

メモリ レイアウト以外の順序で要素を操作する前に、配列を転置する価値がある場合があります。場合によっては、同じデータを 2 回保持する価値さえあります。しかし、あなたのプログラムに最適な解決策を見つけ出す必要があります。高品質の推奨事項を提供するために必要なすべての事実がありません. それがあなたにとって重要な場合は、いくつかのテストを実施し、状況の定量化されたビューを開発することは十分に重要なはずです.

あなたはあなたのお金を払い、あなたはあなたの選択をします。

于 2016-01-18T16:26:17.560 に答える