超並列 GPU ODE ソルバー
多数の独立した常微分方程式系の GPU 加速積分器
モジュール:
スレッドごとの単一システム v3.1
これは、異なる初期条件やパラメーター セットを使用して、同じ ODE システムの多数のインスタンスを解きます。
ブロックごとの結合システム v1.0
これは、異なる初期条件やパラメーター セットを使用して、(多くのサブシステムで構成された) 結合システムの多数のインスタンスを解決します。
リリースノート:
2020年8月18日。
スレッドごとの単一システム v3.1:
- 単精度と倍精度の両方をサポートします。
- Windows ユーザー向けのより詳細なインストール ガイドなど、マニュアルを改善/再作成しました。
- Windows でのコンパイル プロセスを簡素化するバッチ ファイル make.bat が含まれています。
- 新しいチュートリアル (チュートリアル 5) は、非常に大きな時間スケールの差を持つインスタンスを持つ例をテストするために追加されました。 MPGOS のパフォーマンス曲線は、プログラム パッケージ odeint (C++) および DifferentialEquations.jl (Julia) と比較されます。 MPGOS はこれらのパッケージよりも優れています。
- チュートリアル 6 (衝撃ダイナミクス) もパフォーマンス曲線で拡張されています。前のポイントを参照してください。この場合、MPGOS は、(GPU 上で) 衝撃ダイナミクスを伴うシステムを処理できる唯一のプログラム パッケージです。したがって、パフォーマンスの比較は、odeint と DifferentialEquations.jl の CPU バージョンのみで行われました。
- マイナーな変更点: TimeDomain 変数と ActualState 変数を明確に分離しました。
ブロックごとの結合システム v1.0:
- この最初の MPGOS モジュールは準備ができています。このコードは、異なる初期条件やパラメーター セットを持つ結合システム (ユニットと呼ばれる多くのサブシステムで構成される) の多数のインスタンスを解決するように設計されています。
- このモジュールは、Single System Per-Thread v3.1 モジュールのほぼすべての機能を継承しています。特殊なことはほとんどありません。たとえば、イベント処理はユニット レベルでのみ可能です。行列形式で扱うことができるのは明示的な結合のみです。詳細については、興味のある読者はマニュアルを参照してください。
- 2 つのチュートリアルの例が提供されています。
2020年2月14日。
スレッドごとの単一システム v3.0:
- 大幅なパフォーマンスの向上。導入されたテンプレート メタプログラミング手法により、高度に最適化されたコードを作成できるようになりました。平均浸透率は 3 倍ですが、低次元システムの場合は 1 桁になることもあります。
2019年10月10日。
スレッドごとの単一システム v2.1:
- テンプレート メタプログラミングを使用すると、コードは完全にテンプレート化され、コンパイル時に (アルゴリズムとイベント処理と高密度出力の必要性の関数として) 高度に特殊化されたソルバー コードを生成します。これに伴い、ファイルシステムが作り直される。
- 小規模な拡張: 整数共有パラメータと整数アクセサリを使用して、複雑なシステムに対して複雑なインデックス作成手法を効率的に実現できるようになります。
2019年8月13日。
スレッドごとの単一システム v2.0:
- 高密度出力は、いくつかの制限付きでサポートされるようになりました。マニュアルを参照してください。これは、たとえば遅延微分方程式を解くための前提条件です。
- コードとそのインターフェイスは大幅に簡素化され、明確になりました。たとえば、問題プールはコードから完全に省略され (歴史的な理由から保持されていました)、多くの可能なオプションがソルバー オブジェクトにバインドされ、すべてを単一のメンバー関数でセットアップできるようになりました。
- マニュアルもフィードバックに基づいて再構成され、簡素化されました。
2019年4月9日。
スレッドごとの単一システム v1.1:
- デバイス (GPU) を各ソルバー オブジェクトに関連付けることができます。したがって、デバイスの選択は自動的に処理されるようになりました。
- CUDA ストリームはソルバー オブジェクトごとに自動的に作成されます。
- CPU-GPU 計算をオーバーラップし、単一ノード内の異なる GPU にワークロードを簡単に分散するための新しいメンバー関数セット。これには、非同期メモリとカーネル操作、および CPU スレッドと GPU ストリーム間の同期の可能性が含まれます。
- テーリング効果を快適に処理するために、各統合フェーズでアクティブなスレッド数変数を指定できます。
- 2 つの新しいチュートリアルの例が追加されました: a) 複数のソルバー オブジェクトを使用した CPU と GPU の計算のオーバーラップ b) 単一のマシン/ノードで使用可能な複数の GPU の使用。
2019年2月14日。
スレッドごとの単一システム v1.0:
- この最初の MPGOS モジュールは準備ができています。このコードは、GPU 上の膨大な数の独立しているが同一の (パラメーター セットと初期条件が異なる場合がある) ODE システムを解決するように設計されています。
- ユーザーフレンドリー。 C++ プログラミングが初めての方でも、プログラム パッケージを使用するには短いコースだけで十分です。
- チュートリアルの例を含む詳細なマニュアルがあります。したがって、ユーザーはコード ブロックをコピー&ペーストすることで独自のプロジェクトを簡単に構築できます。
- 効率的かつ堅牢なイベント処理。
- 柔軟性を高めるため、各時間ステップの後にユーザー定義のアクションが実行されます。
- タイム ステップまたはイベント処理が成功するたびにユーザー定義の「インタラクション」が実行されます (衝撃ダイナミクスなどに非常に役立ちます。マニュアルのチュートリアルの例を参照してください)。
- 詳細に関する明示的な知識がなくても、GPU のメモリ階層を利用できる可能性。
- 柔軟な実装と軌道の特別なプロパティを保存するためのユーザーがプログラム可能なパラメーター。
- 陽的ソルバーのみ: 固定タイム ステップを使用した 4 次の Runge-Kutta 法、および 5 次の埋め込み誤差推定を使用した 4 次の Runge-Kutta-Cash-Karp 法。 (陰的ソルバーの複雑な制御フローにより、スティッフな問題であっても陽的ソルバーの方が陰的ソルバーよりも優れたパフォーマンスを発揮することがあります)。
- 倍精度算術演算のみがサポートされます。
- 各統合フェーズのエンドポイントのみを保存します (速度を向上させるため)。ただし、ユーザーがプログラム可能なパラメーターと前述のユーザー定義のインタラクションにより、軌道の最も複雑なプロパティを保存できるため、これが問題になることはほとんどありません。ドキュメントを参照してください。