要件を分析してみましょう。
- 保守性
- テキストデータの読み取り/書き込み
- LU分解のための強力なインターフェース/機能
- スパース線形ソルバー
- 大規模データに対するパフォーマンスとスケーラビリティ
このリストから、次の言語を検討します。
C、C ++、Fortran、Python、MATLAB、Java
ジュリアは有望な新しい言語ですが、コミュニティはまだその周辺で形成されており、主要な新しいコードでは展開されていません。
テキストデータの読み取り/書き込み
これは、どのプログラミング言語でも簡単に正しく実行できます。I / Oアクセスを適切にバッファリングおよび合体していることを確認してください。そうすれば、考慮すべき言語のいずれかから優れたパフォーマンスが得られます。C ++でストリームオブジェクトを使用する方法を知らない限り、ストリームオブジェクトは避けてください。
LU分解のための強力なインターフェース/機能
密なLU分解を実行している場合、並列機能にはLAPACKまたはScaLAPACK / Elementalを使用する必要があります。LAPACKとScaLAPACKはFortranで書かれており、ElementalはC ++で書かれています。3つのライブラリはすべて高性能であり、十分にサポートされ、文書化されています。検討する必要のある任意の言語からそれらに接続できます。
スパース線形ソルバー
最高の無料で利用可能なスパース線形ソルバーは、ほとんどすべてが文書化されサポートされているCで記述されたPETScを介して利用できます。考慮すべき言語のいずれかからPETScに接続できます。
大規模データに対するパフォーマンスとスケーラビリティ
あなたが言及する唯一の並列プログラミングのパラダイムは、共有メモリベースです。つまり、MPIベース(メッセージパッシング)の分散メモリコンピューティングアプローチを検討していません。私の経験では、分散メモリソリューションを使用すると、12を超えるコアをはるかに超えるコードを書く方がはるかに簡単です。ほとんどすべての大学の「クラスター」は最近MPIベースであり、大規模な共有メモリマシンは高価であり、それに応じてまれです。アプローチにはMPIを考慮する必要がありますが、選択するプログラミングパラダイムに関係なく、私のアドバイスが適用されます。
オンノードのパフォーマンスに関して、数値ルーチンを自分で作成する場合、Fortranで優れたシリアルパフォーマンスを得るのが最も簡単です。C、C ++、またはPythonの経験が少しあれば、非常に匹敵するパフォーマンスを得ることができます(Fortranでは、CとC ++は完全に同等です)MATLABは、JITコンパイラーと非常に優れた線形代数表現性によりこれを行います。Pythonから要求されたパフォーマンスを得るには、おそらくCython、numpy、numexprを使用するか、数値カーネルを埋め込む必要があります。Javaのパフォーマンスについてコメントすることはできません。言語をよく知らないからです。しかし、専門家によって書かれたものであれば、Pythonからそれほど遠くないのではないかと思います。
インターフェースに関する注意
あなたがあなたが考えているプログラミング言語のいずれかであなたが望むすべてをすることができるだろうと確信していることを願っています。Javaを使用している場合、Cインターフェイスは少し難しくなります。Pythonには、ctypes、Cython、およびf2pyを介した優れたCおよびFortranインターフェースのサポートがあります。LAPACKはすでにラップされており、scipyから入手できます。MATLABは、ネイティブライブラリに必要なすべての機能を備えていますが、スケーラブルではないか、クラスター上で実行するのが特に簡単ではありません。Javaは、JNIを使用してCおよびFortranインターフェースをサポートできますが、クラスターや科学計算用の並列ソフトウェアでは一般的に見られません。
保守性
これの多くは個人的な趣味になりますが、保守性に関する一般的なコンセンサスは、ソフトウェアのコードの行数を最小限に抑え、明確に定義されたインターフェースでモジュラーコードを記述し、計算ソフトウェアに提供することです実装の正確さと機能を検証するテスト。
勧告
私は個人的にPythonで運が良かったので、多くの計算プロジェクトにPythonをお勧めします。私はあなたのプロジェクトのためにそれを強く検討すべきだと思います。PythonとMATLABは、おそらく科学計算に利用できる言語の中で最も表現力のあるものです。Pythonを他のプログラミング言語に簡単に接続できます。f2pyを使用して、現在のFortran実装をラップし、機能を維持していることを確認しながら、Pythonで必要な部分を個別に書き換えることができます。現時点では、Python 2.7の公式実装とscipyの組み合わせをお勧めします。自由に利用可能なEnthought Python Distributionからこのスタックを簡単に開始できます。
これのほとんどは、C、C ++、またはFortranでも実行できます。CとC ++は、多くの経験を持つプロの開発者にとって非常に魅力的な言語ですが、頻繁に新しい開発者を旅行し、この意味で、よりアカデミックなコードにはおそらく素晴らしいアイデアではありません。FortranとMATLABは学術的な計算で人気がありますが、Pythonが提供する高度なデータ構造と表現力には弱いです(たとえば、Python dictオブジェクトを考えてください)。
関連する質問: