数学的モデリング問題における配列とコンテナ

はじめに

たまたま私の仕事が物理的プロセスの数学的モデリングと密接に関係していることが起こりました。 数学モデリングは、プログラミングの非常に特別な領域です。 比較的単純な物理プロセスでさえ、数日から数週間かかることがあります。 したがって、プログラムのパフォーマンスは、コードの読み書きの利便性を損なうとしても、前面に出ます。 しかし、最近まで、私のプログラムのパフォーマンスはあまり気にしませんでした。粗いグリッドで十分で、計算には約1日かかりました。 しかし、徐々にグリッドがより詳細になり、プログラムの稼働時間が着実に増加しました。 その後、プログラムのボトルネックを探し始めました。 最初のアルゴリズム。 次に、データ構造になりました。 そして、ここで私は「ベクトルを保存するために使用する方が良いのは配列かコンテナか?」という質問に非常に興味がありました。 数学的モデリングでは、ベクトルと大次元行列を使用した操作、特にSLAEを解くための反復法が重要な位置の1つを占めます。 理論的には、配列の操作は高速になりますが、コンテナの操作はより便利です。 全体の質問は、この「もっと」を数字の言語にどのように翻訳するかです。 利便性はコストに見合うものですか? インターネットでの検索では、わかりやすい答えは得られませんでした。 「多かれ少なかれ」、「実質的に重要ではない」、またはせいぜいベクトル要素で同じアクションを繰り返して繰り返すための最も単純なテストのカテゴリーからのあいまいな定式化がありました。 しかし、テストは一つのことであり、戦闘の現実は別のことです。 さらに、これらのテストのいくつかを自分で実行したので、さまざまなデータ構造がさまざまなテストで利点を持っていることを知って驚いた。 次に、テストとして、実際の物理的な問題を使用することにしました。

挑戦する

テストとして、液体で満たされ、側面から加熱される無限に長い正方形のチューブ内の対流の熱物理学の問題でよく知られているものを取り上げました。 パイプの長さは無限(z座標に沿った明確さ)であり、境界条件はzに依存しないため、問題は2次元と見なすことができます。 左右の壁は一定ですが、異なる温度に維持されます。 上部と下部の壁は断熱されています。 すべての壁で、非漏れと接着の条件が指定されています。 すべての速度成分のゼロに等しい。 液体の対流熱伝達は、温度、渦電流関数の座標におけるエネルギー、ナビエストークス、および連続性の方程式で記述されます。

画像

この問題は、線形基底関数を使用した三角形グリッド上の有限要素法によって解決されました。 セクションのサイズは100x100ノットです。 SLAUソルバーとして、LU事前調整付きのVOCが使用されました。

ソースコード

ここでプログラムのソースコードを取得できます

試験結果

だから。 実際には、何が始まったのか。 上記の問題に対するソリューションの3つのソフトウェア実装が作成されました。 プログラミング言語として、c ++が使用されました。 最初のプログラムでは、動的配列を使用して、2番目の-std :: vectorコンテナーに、3番目の-QVectorコンテナーに行列とベクトルを格納しました。 プログラムの稼働時間(ティック単位)を表に示します。
リリース
1 2 3 4 5 平均 時間のロス
配列 21820000 21760000 21730000 21660000 21850000 21764000 0%
std ::ベクトル 26680000 26660000 26,900,000 26870000 26790000 26780000 23%
QVector 43760000 43770000 43820000 43840000 43770000 43792000 101%
デバッグする
1 2 3 4 5 平均 時間のロス
配列 50290000 50630000 50760000 - - 50560000 0%
std ::ベクトル 118830000 119560000 118240000 - - 118877000 135%
QVector 306800000 297,400,000 294400000 - - 299530000 492%

結論

したがって、テスト結果からの主な結論は次のようになります。数学的モデリングの問題を解決する際に、コンテナの使用は受け入れられません。 コードの記述に利便性がなく、コードのセキュリティがないため、23%のパフォーマンス低下を正当化できません。 率直に言って、私はそのような顕著な落下を期待していませんでした。 特に私にとって不愉快な驚きは、プログラムで使用したQVectorのテスト結果でした。 この深刻な遅延は、SharedMemoryコンセプトの使用によるものと思われます。 コピーを保存すると、コンテナの要素にアクセスできなくなります。なぜなら、それぞれを変更すると! 要素は、遅延コピーを実行する必要があるかどうかも確認されます。

おまけ:数学モデリングの結果

温度:

現在の機能:

旋風:

Vx:

Vy:




All Articles