1

私は卒業プロジェクトでいくつかの作業を行い、いくつかの分子構造+レナードジョーンズポテンシャルとクーロンポテンシャルの下での力の計算+分子間結合を達成しました(写真のように)

(http://img17.imageshack.us/img17/3133/simulasyon.png)

すべてシングルスレッドでVerletアルゴリズムを使用して実行されます。

問題は次のとおりです。「計算テーブル」を使用しています-x^(3.5)、x ^(1.4)、(1 / x)....への迅速な回答のための配列Javaのネイティブメソッドでの計算は非常に遅いため。配列-アクセス時間が非常に長いため、「unsafe()」メソッドを試しましたが、それでも非常に低速でした(パフォーマンスが10%向上しただけです)。

IntBufferとDoubleBufferを試しましたが、それでもうまくいきません。

プログラムは、O(n)結合計算、O(nlog(n))レナードジョーンズ(+追加のパウリの排他原理)およびO(nlog(n))クーロン力計算を計算します。1500以上の粒子(および7000以上の結合)で速度が低下します。

速度のボトルネックはどこにあるかをすでに確認しました(レナードジョーンズ+クーロンです)。1500粒子での1つのタイムステップ計算には4ミリ秒かかります。1ミリ秒必要です。

他の言語(安全かどうか)と同じくらい速く配列を使用できる場合にのみ。

また、除算を乗算、ハッシュマップ、リストに置き換えてみました(配列と同じパフォーマンス)。

タイムステップごとの計算時間を短縮する他の方法を知っていますか?ありがとうございました。コンピューター:2.0 GHzシングルコアIntel、1.2 GB RAM、WindowsXPSP-3およびEclipseIndigo。

4

1 に答える 1

1

ルックアップテーブルを使用する代わりに、チェビシェフ多項式を使用してみてください。ln(k)ステップでのみx^kをべき乗できることを忘れないでください。

多くの操作のように見えるかもしれませんが、メモリにアクセスせずに(したがって、キャッシュに影響を与えずに)inを実行できるため、ルックアップテーブルよりも大幅に高速になります。

于 2016-11-14T02:50:16.973 に答える