私は訓練を受けた機械エンジニアであり、主に 25 年以上前の C の既存の大規模な数値コード ベースを拡張する研究環境で働いています。最近、本格的な科学ソフトウェアをゼロから設計する方法を学びたいと決心しました。
私は大学の CS 部門の多くの学者と話をしましたが、大規模な数値アプリケーションを構築する可能性が最も高いのは、機械/化学/生物学の部門にいると考えられているようです。同様に、これらのアプリケーションを作成するほとんどの人は、ソフトウェア設計の原則に関するトレーニングをほとんど、またはまったく受けていません。
ほとんどのエンジニアと同じように、私は実践することで学習するので、次のタスクを完了するように自分自身に設定しようとしています。このグリッド全体で、熱方程式 (または他の偏微分方程式) を解きます。
私が含めたいもの:
- 並列 (私は MPI の経験が短いので、おそらくこれに固執します) -- おそらく OpenCL で結合します (Nvidia カードがないため、CUDA はありません)。
- Python と C++ の組み合わせ (Python でのスクリプト駆動 UI、C++ での実行)
- オブジェクト指向、デザインパターンベース(どうしても学びたい部分)
- 単体テスト フレームワーク (私は gtest を使用しており、おそらくこれに固執しますが、単体テストをどの程度詳細に作成するかはわかりません。単体テストの科学的コードに関するさまざまなアドバイスを読みました)
- Linux ベース -- この段階では移植性はあまり気にしなくてよい
- おそらくBoostライブラリを使用しています
- 結果の保存には HDF5 または VTK を使用します (VTK は知っていますが、HDF5 の方が適していると感じています)。
- プロファイリングされたパフォーマンス
私が答えようとしているいくつかの質問:
- これは巨大なタスクのように感じますが、それは問題ありませんが、それを分解するための一般的なプロセスは何ですか? 基本的なインフラストラクチャ (MPI ラッパー、マトリックス クラスなど) から始めますか、それとも高レベルの対話 (メイン コントローラー、UI など) から始めますか、それともまったく別の場所から始めますか?
- Python + C++ のパラダイムは、クラスターでの MPI の起動にうまく適合しますか?
- 科学的な文脈でアプリケーション設計を扱っている本を見つけたことがありません。
- 私は理想的な「実行してからプロファイリングする」最適化方法をよく知っていますが、最初に下した非常に基本的な設計上の決定のいくつかがパフォーマンスに影響を与えると思います。数値コードの高レベル設計で注意すべき主な落とし穴は何ですか?
注意: この質問が stackexchange 形式に適合するかどうかはわかりません。適合しない場合は、喜んで言い換えます...