機械工学ソフトウェアの改造の理解

有限要素解析(FEA)、計算流体力学(CFD)、コンピュータ支援設計(CAD)、多体力学シミュレーションなどの重要なタスクを支えています。これらのアプリケーションは、ますます複雑なモデル、より大きなデータセット、およびより堅い設計サイクルを処理するために進化するにつれて、性能の劣化は一般的な課題になります。 再構築 - 既存のコードを再構成するプロセスは、外部の動作を変更することなく、既存のコードを再構成するプロセスを、Ferは、将来のプロセスを最適化し、改善するプロセスを加速し、Ferlystabilityを向上させ、既存のプロセスを最適化します。

エンジニアリングアプリケーションにおける共通性能ボトルネック

再ファクター戦略を適用する前に、パフォーマンスが苦しむ場所を特定することが不可欠です。機械工学ソフトウェアは、しばしば異なるボトルネックを展示します。

  • [非効率的なデータ構造] - 網要素、ノード接続、またはサブ最適コンテナ内の材料特性を歪めると、O(n2)または悪意のある時間になります。
  • []冗長計算[] - 同じ剛さ行列または補間係数を繰り返し再計算するCPUサイクルを無駄にします。
  • []貧しいメモリのローカリティ - 散らばされたデータアクセスパターンは、特に反復的なソルバーでCPUキャッシュを破ります。
  • []シーケンシャル実行] - 並列で実行できるアルゴリズムは、マルチコアプロセッサを未使用のままに、単一スレッドのままに残します。
  • [オーバーアブストラクトインターフェース[ – ディープ・継承階層と不要な仮想ディスパッションは、パフォーマンス・クリティカル・ループでランタイム・オーバーヘッドを追加します。

バルグラインダー、パーフ、VTuneなどのツールを使用して徹底したプロファイリングセッションは、ボトルネックが最も影響力のあることを明らかにします。 再ファクタリングは、それらの領域を最初にターゲットにし、努力を最大限に引き出すべきです。

パフォーマンスのための必須のリファクタリング戦略

1.アクセスパターンのデータの構成を最適化

適切なデータ構造を選択すると、最も高いレベルのリファクタリングが移動します。 フィニト要素メッシュの場合、ハッシュテーブルのノードのアジャシデントを格納するか、またはコンファレンスリストを圧縮すると、リニアから近距離の時刻まで検索結果を削減できます。 マテリアルプロパティデータベースは]のキー値ストアの値をメモリに保存します。 配列の配列ではなく、メモリ内の任意の値が格納されます。 データをソートするとき(例えば、サブダリファレンスが、バイナリースが特定の要素にマッチする場合には、 、 常に 特定の要素が、 特定の要素にマッチします。

2. 性能のホットスポットを隔離するためのコードをモジュール化

Monolithic のコードベースは、時間が費やす場所の障害物です。専用のソルバーモジュール、プリプロセッサモジュール、ポストプロセッサモジュールなど、より小さく、よく定義されたモジュールに再構築することで、開発者がそれぞれを独自に最適化することができます。例えば、このソルバーは、GUI に触れることなく BLAS ルーチンを使用して書き出すことができます。モジュール化は、[依存注射を容易にし、それを交換することで、GPU を最適化することができます。

3. 冗長作業を排除するためにキャッシュを導入

エンジニアリングソフトウェアは、多くの場合、設計反復間で同一の計算を繰り返します。 剛性率の行列、補間重量、または流体特性テーブルなどの中間結果のメモリ内キャッシュを実装することで、計算時間を劇的にカットできます。 []]]を高速に使用(LRU)キャッシュ]を適切な方法で使用して、適切な偏向ポリシーをメモリ使用。 例えば、パラメトリック研究を実行すると、キャッシュされた要因が異なる場合、Pythonのキャッシュをキャッシュバックするような、他の複数のドキュメントのキャッシュをキャッシュバックするような方法で確認することができます。

4. よりよい複雑性のためのRefactorのアルゴリズム

時には、元のアルゴリズムは、パフォーマンスではなく、単純性のために選択されました。 O(n2)のネイティブソルバーをO(n log n)反復方式で置き換えることで、順差の改善を得られることができます。 機械的工学的コンテキストでは、これは、直接のガウス排除から、スパースシステム用のコンファゲート勾配メソッドに切り替えることを意味するか、または、空間ハッシュアルゴリズムでブルートフォースコンタクト検出を置き換えることを意味します。 アルゴリズムは、常に変化するような問題の解析を加速させる必要があります。 と、 常に、 プローブを検証する と 常に、 プローブを検証する と 同じようにしてください。

5. 独立したワークロードを並列化して下さい

現代のCPUは複数のコアを持っていますが、多くのエンジニアリングアプリケーションは単一スレッドのままです。 並列を導入する改造は、大規模なスピードアップを解除することができます。 2つの一般的なパターンは次のとおりです。

  • データ並列] - スレッド間での分割メッシュ要素を分割し、要素のコントリビューションを同時組み立てます。
  • タスク並列] – 独立シミュレーションを並列で実行(例、異なる負荷例)。

C/C++ または Python の モジュールでディレクティブベースの並列挙に OpenMP を使用します。 GPU アクセラレーションでは、CUDA または SYCL を使用してカーネルに再ファクタリング ループを検討します。ただし、共有ミュータブルな状態に注意しましょう。 ] のローカルストレージ またはレース条件を回避するアトミック操作を優先します。 レース条件をプロファイリングする際に最も時間のかかるループを並列化して開始します。

6. I/O およびデータベースアクセスの最適化

エンジニアリングソフトウェアは、多くの場合、大規模なモデルファイルを読み、シミュレーション結果を書き、または材料データベースをクエリします。 I / Oオペレーションをリファクタリングすると、壁クロック時間を大幅に削減できます。 テクニックは次のとおりです。

  • []バッファされた読み込み/書き込み[ - ブロックレベルのI/Oで文字を文字単位で置換します。
  • []バイナリシリアライズ[] – テキストベースのファイル形式(例、ステップ、IGES)を変換して、より高速な読み込みのためのバイナリ表現をコンパクトにします。
  • レイジーロード] – 実際に必要なまで非必須データの読み込みを遅らせる。
  • [データベースクエリの最適化] – インデックス、バッチのインサートを追加し、材料特性やテストデータを取得するときにN+1クエリの問題を回避します。

大規模なシミュレーションアーカイブを管理するアプリケーションでは、接続プールと準備されたステートメントを使用するためにデータアクセスレイヤーを再構築することで、一貫性のある利益を得ることができます。

効果的なリファクタリングのためのベストプラクティス

プロフィール 前後

あらゆるリファクタリングの努力は、データによって駆動されなければなりません。サンプリングプロファイラを使用して、ホットスポット、メモリプロファイラを特定して、漏れや断片を検出し、スループットを測定するためのベンチマークスイート。各変更後、同じベンチマークを実行して改善を定量化します。プロファイリングなしで、実際のボトルネックを無視しながら、既に高速な機能を簡単に最適化できます。

包括的なテストスイートを維持

外部の動作ではなく、内部構造を変更します。 ユニットテスト、統合テスト、および回帰テストの堅牢なスイートは、パフォーマンスの改善が機能が壊れていないことを保証します。 エンジニアリングソフトウェアでは、これは特に、ソルバーの小さな数値エラーが欠陥のある設計決定に伝播することができるため、特に重要です。 コア数学的なルーチンとソルバーの経路に関する高コードカバレッジについて。

再ファクターのIncrementally

ビッグバンは、リスクと時間のかかる書き直します。代わりに、増分的なアプローチを採用してください。1つのネックを識別し、それをリファクタリングし、テストし、次の方向に移動します。これにより、継続的な開発サイクルへの混乱を最小限に抑え、パフォーマンス改善の継続的な配信を可能にします。バージョン管理システムは、予期しない減速を導入する場合、簡単に再変換できます。

文書の前提と取引オフ

データ構造を変更したり、ループを並列化したりするとき、そのアプローチを選択した理由のドキュメント。将来の開発者(または将来の自己)は、パフォーマンスの合理性を理解します。 期待されるアクセスパターン、メモリ制約、および最適化が劣化する可能性のある条件に関するコメントを含める。 グッドドキュメントは、ブラックボックスの変更ではなく、知識資産を再構築する。

測定性能向上

定量化ゲインは、再ファクター化投資を正当化することが不可欠です。 代表的なワークロードに元のコードを実行することでベースラインを確立します。例えば、100k-element FEAモデルを解決するか、複雑なCADアセンブリをレンダリングするなど、 。 再ファクター化後、同じワークロードを同じハードウェア構成で実行します。 などのメトリックを追跡します。

  • シミュレーションを完了する壁クロック時間
  • ピークメモリ使用量
  • インタラクティブな操作中にフレームレートまたは応答性
  • モデルサイズを増加させるスケーラビリティ

さらなるリファクタリングのためのサポートをビルドするために、内部でこれらの結果を公開します。 []のようなツール (C++の場合) または pytest-benchmark (Pythonの場合) パフォーマンスの回帰の検出を自動化します。

コンテンツ

再ファクタリングは、一度のアクティビティではなく、要件として機械工学ソフトウェアの実行者を維持し、継続的な規準が進化しています。 体系的にデータ構造、モジュール化コード、キャッシュ結果、アルゴリズムの改善、ワークロードの並列化、およびI/Oの合理化によって、開発チームはより高速なシミュレーション、より応答性の高いインターフェイス、そして究極のより良いエンジニアリング結果を提供することができます。 ここで概説された戦略は、ロードマップを提供します。 重要なことは、適切な機能と、適切な機能が異なる機能で、より高速な機能と、より高速な機能が実現されるようにするために、適切な機能を提供します。