HPCでは多くのFortranが使用されていると思いますが、それがレガシーの理由だけのためかどうかはわかりません。
ガベージコレクションやランタイムポリモーフィズムなどの最新のプログラミング言語の機能は、速度が重要なのでC#、Java、C ++がどこから来るのかわからないため、HPCには適していません。
何かご意見は?
HPCでは多くのFortranが使用されていると思いますが、それがレガシーの理由だけのためかどうかはわかりません。
ガベージコレクションやランタイムポリモーフィズムなどの最新のプログラミング言語の機能は、速度が重要なのでC#、Java、C ++がどこから来るのかわからないため、HPCには適していません。
何かご意見は?
回答:
(1)レガシーコードがほとんどない、(2)開発時間とコード品質が重要な領域で、HPCに多くのJavaが使用されているのを見てきました。典型的なアプリケーションドメインは、金融、データマイニング、またはバイオインフォマティクスです。
それは本当にアプリケーションに依存します(線形代数の外に生命があります)が、最近のJVMのパフォーマンスはしばしばCコードと同等です。JVMが実行時に静的コンパイラー(C、Fortran)が実行できない巧妙な最適化を実行できる場合、より高速になることがあります。そして、多くのシンボリック計算がある場合、確実に高速になります。
所定の固定されたプログラム開発のための時間の量は、得られたJavaコードは、一貫してより速くCコードよりなります。JavaのHPCは、コードが頻繁に開発または変更されるときに間違いなく意味があります。別の重要な機能は、異なるハードウェア上でのコードモビリティです。
http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.htmlに参照があります。
2つのアドレスが一意であるというFortranの仮定に関して、高レベル言語のコードに対して同様の最適化を可能にする静的分析ツールに取り組んでいますが、「Bad Things May Happen」ビットはありません。興味があれば私に連絡してください。
私の長年の経験では、5年前までは常にFortranとCでした。どちらが主にエンジニアリングから来たのか、それともCS学派から来たのかによって決まりました。 、オーケー?:-)
私たちがやっていたことでは、Fortranがほぼ独占的に使用されていました。
最近私が読んだことから、標準F2003 / 08の新しい更新とCo-Arrayの導入により、再び勢いを増しているようです。
また、ある程度偏っていないとしても、1つの記事-The Ideal HPC Programming Language
金属への実際のペダルについては、唯一の本当の選択はFortranだと思います。理由は、低レベルILP(命令レベルパラリズム)の活用で最も重要なのは、メモリアドレスの曖昧性解消です。Fortranのデファクトルールにより、コンパイラは2つのアドレスが一意であることを判断できます(したがって、ロードとストアの順序、またはストアとストアさえも、誤ったコードを生成するリスクなしに交換できます)。Cは、コンパイラがコードから低レベルの並列性を抽出するために、ポインタをオーバーラップする余地を残しています。
また、効率的なループの生成と実行には、配列の整列、wrtキャッシュライン、およびSSE / AVX境界が重要です。配列が共通ブロックを介して渡される場合、コンパイラ/ローダーは、すべての配列が同じアドレスアライメント境界で開始することを保証でき、より効率的なSSE / AVXロードおよびストアを利用できます。新しいハードウェアはアライメントされていないメモリアクセスを処理できますが、メモリアクセスが適切にアライメントされていないため、キャッシュラインの一部を使用するとパフォーマンスが低下します。Cプログラマーが自分のすべての配列を適切に整列させたとしても、これをコンパイラーに伝えるメカニズムはありますか?
要約すると、2つの最も重要な問題は、メモリアドレスの独立性と、アクセスされたデータ構造がハードウェアが必要とする「自然な」アライメントを持っているというコンパイラによる認識です。これまでのところ、Fortranはこれら2つのタスクで最高の仕事をしています。
ちょっとした逸話。自分で高性能コンピューティングを行ったことはありません。
計算(数値計算)、FortranおよびCの場合。はい、レガシーの理由です。
数値演算の現在の傾向は、クラスターの特性に応じてパフォーマンスを最適化するために、ソースコードの調整を自動化するプログラムジェネレーターを作成することです。これらのジェネレーターはしばしばCで出力します。
2番目の傾向は、特定のGPUまたはCell BEに特化したCの方言を書くことです。
データベースからのデータを処理するプログラム(データベース自体ではない)などの非数値作業の場合、高価なカスタマイズされたネットワーク機器なしで「コモディティ」マシンのクラスタで実行する方がはるかに安価です。これは通常、「高スループットコンピューティング」と呼ばれます。Pythonはここで一番の言語です(有名なMap Reduceを使用)。Pythonより前では、バッチ処理プロジェクトは任意の言語で作成でき、通常はCondorによってディスパッチされます。
私は(gasp!)C#で非常に計算集約的なコードに取り組んでいます。
光学モデリング用のFDTDの GPGPU実装を構築しています。小規模(128プロセッサ)クラスターでは、多くのシミュレーションの実行に数週間かかります。ただし、GPUの実装は約50倍高速になる傾向があります。これは、消費者グレードのNVidiaカード上にあります。現在、2枚のGTX295デュアルプロセッサカード(数百コア)を搭載したサーバーがあり、テスラをすぐに入手できます。
これはあなたの言語にどのように関係しますか?以前に使用していたC ++ FDTDコードがCPUにバインドされていたのと同じように、これらはGPUにバインドされているため、マネージコードとネイティブコードの(非常に小さな)馬力の違いは影響しません。C#アプリはコンダクターとして機能します-OpenCLカーネルのロード、GPUとのデータの受け渡し、ユーザーインターフェイスの提供、レポートなど-C ++で苦労するすべてのタスク。
過去数年間、マネージドコードとアンマネージドコードのパフォーマンスの違いは十分に大きかったため、C ++のひどいオブジェクトモデルに我慢して、数パーセントの速度を得る価値がありました。最近では、C ++とC#の開発コストは、ほとんどのアプリケーションのメリットをはるかに上回ります。
また、パフォーマンスの違いのほとんどは、選択した言語ではなく、開発者のスキルによるものです。数週間前、トリプルネスト(3Dアレイトラバーサル)ループの内側から1つの除算操作を移動し、特定の計算ドメインの実行時間を15%短縮しました。これは、プロセッサアーキテクチャの結果です。除算が遅いため、どこかで必要なものの1つです。
Fortranは、主にレガシー(まだ古いコードを実行している)と親しみ(HPCを実行するほとんどの人が他の種類の言語に精通していないため)が最も一般的です。
ガベージコレクションやランタイムポリモーフィズムなどの最新のプログラミング言語の機能は、速度が重要なのでC#、Java、C ++がどこから来るのかわからないため、HPCには適していません。
一般的にはそうではありません。従来のHPCは、主に機械精度の数値を使用した線形代数を行っていました。しかし、最新のHPCでは、マシンの精度の数値ではなく、任意の数式を使用したシンボリック計算など、より多様な処理にスーパーコンピューターを使用することが増えています。これにより、使用するツールにまったく異なる特性が置かれます。また、Fortran以外のプログラミング言語を使用することも珍しくありません。なぜなら、GCやOCamlの最適化パターンマッチコンパイラーなどの他の種類の最適化コンパイラーがないと、シンボリック計算が非常に困難になる可能性があるためです。
たとえば、Fischbacher らによるこの論文を読んでください。「著者は、これがこれまでに実行された最大のシンボリック計算である可能性が高いと信じる強い理由がある」と述べています。
Fortran、いくつかの良い理由とそうでない理由のため。重い演算処理の場合、正当な理由は、CおよびC ++から呼び出すことができますが、Fortranで記述された実証済みのサブルーチンの広範なライブラリ(BLAS、LAPACK)があることです。
それほど良くない理由は、FortranがC / C ++よりもパフォーマンスが優れていると思われることです。オプティマイザーは非常に優れており、コードの一部を最適化する利点は、それがビジーである時間の割合に比例することを理解している人はほとんどいません。
それほど良くないもう1つの理由は、CSプログラマーと非CSプログラマーの文化のギャップです。科学的プログラマーはFortranで悪い習慣を教えられ、CSプログラマーと彼らが教えられてきた悪い習慣を軽視する傾向があります。
基本的に、数値計算の実際の作業を行うプログラムはすべてFORTRANです(古いblas、lapack、arnoldiなどはまだ使用されています)...しかし、より高いレベルの構造になると...人々はますます使用していますC ++。
シミュレーションの複雑さは巨大なコードを伴い、1つを書くことからどんな種類の利益を得るには、それを再利用可能にすることです。また、使用される概念も非常に複雑になりました。FORTRANを使用してその情報を表現することはほとんど狂気です。C ++は、オブジェクト指向設計を本質的にサポートしているため、C ++が登場します。ただし、ランタイムポリモーフィズムが優先されることはほとんどありません。代わりに、人々はほとんど常に静的ポリモーフィズムを使用します(これはテンプレートメタプログラミングでC ++に実装されています)
また、現在のコンパイラは本当に優れているため、多くの最適化がコンパイラに任されています。
HPCアプリケーションで対処する必要のある2種類の問題があります。1つはそれ自体を処理する数であり、もう1つは計算の管理です。最初の方法は通常、Fortran、C、またはC ++で記述されたコードを使用します。これは、速度と、この言語で記述された多くの科学的アルゴリズムがすでに存在するためです。計算のステアリングは、高レベル言語でより便利に実装されます。Pythonは、アプリケーションロジックの処理や、コンパイルされた言語で実装された拡張機能の呼び出しに最適な「接着剤」言語です。Javaは、ネットワークと分散コンピューティングの管理が不可欠なプロジェクトで頻繁に使用されます。