petsc4pyとc / c ++ / fortranはどれくらい遅いですか?
実行されているコードに大きく依存することはわかっていますが、マトリックスベクトル製品のような単純なものはどうでしょうか。
petsc4pyとc / c ++ / fortranはどれくらい遅いですか?
実行されているコードに大きく依存することはわかっていますが、マトリックスベクトル製品のような単純なものはどうでしょうか。
回答:
これは科学プログラミングコミュニティで広く受け入れられている懸念事項であり、パフォーマンスの不確実性は計算科学の主要な「神話」の1つであると考えています。
@fcruzで説明しているように、これpetsc4py
はPETScライブラリのラッパーであり、PythonでのPETScの再実装ではありません。そのため、PETScとの間で配列をコピーしたり、ドライバーコード/関数呼び出しのオーバーヘッドからパフォーマンスのペナルティが生じることが予想されます。petsc4py
非常に慎重に実装され、理解している限りnumpy
多次元配列インターフェースにより、コピーのオーバーヘッドを回避できます。私が働いているユースケースの大部分では、Pythonでの作業におけるパフォーマンスのペナルティは10〜40%程度であり、このパフォーマンスヒットを補う以外の方法でも大幅に向上することがよくあります。実際、私が話した経験豊富なHPC Python開発者数人は、このパフォーマンスの差を通常はさらに減らすことができるという意見を持っています。Pythonが計算コストの高いコードを駆動している場合、これは確かに当てはまります。
petsc4py
リポジトリ自体は、性能/柔軟性のトレードオフを説明するのに有用な例の数を特徴とします。見るpetsc4py
と呼ばれるデモのソースリポジトリperftest
Pythonのドライバと(に設けられたFortranのカーネルオーバーCドライバの両方使用して方程式の非線形システム解き、App.f90
そのディレクトリ内に)。ここでのパフォーマンスオーバーヘッドは10%程度です。
具体例として、私はPyClawに取り組んでいる科学者チームの一員です。PyClawは、並列グリッド管理用のPETScとセルインターフェースのリーマン問題を解決するためのレガシーFortranカーネルにインターフェースするソフトウェアパッケージです。Fortranドライバーからの切り替えによるパフォーマンスの低下については、かなり慎重に調査しました。結果は、会議資料の表1の5ページの下部にあります。このケースでは、コードをPETScおよびFortranに簡単に接続し、数万のコアで効率的に並列実行できる機能と、コア上のパフォーマンスを少し引き換えました。
Petsc4pyは、PETScにアクセスするための別の方法ですが、pythonから、またはpetsc4pyがバインディングを提供するため、pythonから、並列PDEソルバーの開発の労力を削減するためのPETScデータ構造とルーチンにアクセスできます(その規模)。
PETScはソルバーにいくつかのレベルの抽象化を提供し、PETScを使用して独自のソルバーを実装することもできます。ソフトウェアの抽象化の最低レベルでは、PETScはBLAS、LAPACK、およびMPIを使用し、せいぜいこれらの実装と同じくらい高速です。
現在、pets4pyはcythonを使用して、PETScへのバインディングを実装しています。cythonを使用するオーバーヘッドは、PETScから実行される計算の量に関連しています。PETScの高レベルPDEソルバーを使用する場合、オーバーヘッドは心配する必要がないほど十分に小さくなければなりません。
PETScとGEMVのパフォーマンス比較よりも重要な問題は、PETScがあなたの仕事に適したツールであるかどうかです。非自明な並列PDEソルバーを実装する必要がある場合は、おそらく、PETScが本当に役立ちます。ただし、大量のGEMVを実行する必要がある場合は、BLASライブラリが必要です。幸運を!