高性能コンピューティングで最も使用されているプログラミング言語は何ですか?なぜ?[閉まっている]


25

HPCでは多くのFortranが使用されていると思いますが、それがレガシーの理由だけのためかどうかはわかりません。

ガベージコレクションやランタイムポリモーフィズムなどの最新のプログラミング言語の機能は、速度が重要なのでC#、Java、C ++がどこから来るのかわからないため、HPCには適していません。

何かご意見は?


9
C ++にはガベージコレクターがなく、ランタイムポリモーフィズムを使用する必要もありません。
ジェイソンベイカー

@Jason私の意図は、C ++のどの機能がHPCにとって魅力的なケースであるかを把握することです。
Fanatic23

@ Fanatic23-わかりました。そのことを書き留めたかっただけです。:
ジェイソンベイカー

1
@Fanatic Wish私は「はい」と言えるかもしれませんが、あまり多くはありません... .NET /関数型言語のパフォーマンスの問題に関するリンクがたくさんあります。特定のパフォーマンス制限を把握するために、概念を精神的にまとめることができる場合があります。msdn.microsoft.com / en - us / library / 0xy59wtx.aspxstackoverflow.com/questions/2909282/…msdn.microsoft.com/en -us / magazine / cc163329.aspx en.wikipedia.org/wiki/Just-in-time_compilation
宮坂

1
しかし、本当に良い応答時間が必要な場合、あなたが探しているのはQNXのようなリアルタイムOS:en.wikipedia.org/wiki/QNX
宮坂

回答:


11

(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」ビットはありません。興味があれば私に連絡してください。


14
Nitpick:JIT最適化は、少しの作業を実行したい場合に静的コンパイラで利用できます。GCCとMS Visual Studioはどちらも、保存されたランタイムデータを使用して最適化するプロファイルガイド付き最適化をサポートしています。「静的コンパイラ(...)ができない」最適化があることを示唆するのは少し誤解を招くかもしれません。
コービン

4
なぜこれが受け入れられた答えなのかわかりません。この投稿には真実のように見えるものは何もありません。Javaは本質的に別の言語に依存する仮想マシンであるため、Cベースの言語は常にJavaよりも優れています。さらに、Javaで達成できることはすべて、Cでより少ないオーバーヘッドで達成できます。Cベースの言語が「性能のある」言語でなくなることはありません。
マイク14

31

私の長年の経験では、5年前までは常にFortranとCでした。どちらが主にエンジニアリングから来たのか、それともCS学派から来たのかによって決まりました。 、オーケー?:-)

私たちがやっていたことでは、Fortranがほぼ独占的に使用されていました。

最近私が読んだことから、標準F2003 / 08の新しい更新とCo-Arrayの導入により、再び勢いを増しているようです。

また、ある程度偏っていないとしても、1つの記事-The Ideal HPC Programming Language


16

金属への実際のペダルについては、唯一の本当の選択はFortranだと思います。理由は、低レベルILP(命令レベルパラリズム)の活用で最も重要なのは、メモリアドレスの曖昧性解消です。Fortranのデファクトルールにより、コンパイラは2つのアドレスが一意であることを判断できます(したがって、ロードとストアの順序、またはストアとストアさえも、誤ったコードを生成するリスクなしに交換できます)。Cは、コンパイラがコードから低レベルの並列性を抽出するために、ポインタをオーバーラップする余地を残しています。

また、効率的なループの生成と実行には、配列の整列、wrtキャッシュライン、およびSSE / AVX境界が重要です。配列が共通ブロックを介して渡される場合、コンパイラ/ローダーは、すべての配列が同じアドレスアライメント境界で開始することを保証でき、より効率的なSSE / AVXロードおよびストアを利用できます。新しいハードウェアはアライメントされていないメモリアクセスを処理できますが、メモリアクセスが適切にアライメントされていないため、キャッシュラインの一部を使用するとパフォーマンスが低下します。Cプログラマーが自分のすべての配列を適切に整列させたとしても、これをコンパイラーに伝えるメカニズムはありますか?

要約すると、2つの最も重要な問題は、メモリアドレスの独立性と、アクセスされたデータ構造がハードウェアが必要とする「自然な」アライメントを持っているというコンパイラによる認識です。これまでのところ、Fortranはこれら2つのタスクで最高の仕事をしています。


2
私は最近、少し実験を行い、64000ビットの文字列のポップカウントを、符号なしのlong long配列として表しています。多くの興味深いブール演算とパック演算を使用して、まったく同じアルゴリズムを使用しました。-O3を使用するCでは、long longごとに10クロックかかりましたが、Fortran Intel Fortran 10.1では、デフォルトの最適化では6.5でした!そして、すべてのプログラマーは、Cが少し調整するのに優れていると考えています!Fortranの事実上の仮定により、より効率的な低レベルの命令コーディングを安全に生成できます。
オメガケンタウリ

4
「Fortranの事実上の規則により、コンパイラは2つのアドレスが一意であると仮定することができます...」マニュアルにはすべて、コンパイラがこれを前提とすることが許可されていることが示されており、その前提に違反した場合、悪いことが起こる可能性があることを詳細に警告しています。
ジョンR.ストローム

15

ちょっとした逸話。自分で高性能コンピューティングを行ったことはありません。

計算(数値計算)、FortranおよびCの場合。はい、レガシーの理由です。

  • パブリックドメインのソースコードとレシピの十分な可用性。
  • どちらもMPIをサポートしています。
  • 両方の言語がコンパイルされます。
  • 両方の言語のコンパイラは、すべてのHPC OSおよびベンダーによって提供されます。
  • ベクトル化コンパイラが利用可能です。
  • 両方とも、異なるクラスター(異なるメモリサイズ、CPU数など)に移植されたときに高いパフォーマンスを得るために、クレイジーレベルの調整が必要です。
    • これは、実際にオープンソースコードが重要である理由を説明しています。つまり、調整が必要であるため、元のレシピは手動調整に適した言語で記述する必要があります。

数値演算の現在の傾向は、クラスターの特性に応じてパフォーマンスを最適化するために、ソースコードの調整を自動化するプログラムジェネレーターを作成することです。これらのジェネレーターはしばしばCで出力します。

2番目の傾向は、特定のGPUまたはCell BEに特化したCの方言を書くことです。

データベースからのデータを処理するプログラム(データベース自体ではない)などの非数値作業の場合、高価なカスタマイズされたネットワーク機器なしで「コモディティ」マシンのクラスタで実行する方がはるかに安価です。これは通常、「高スループットコンピューティング」と呼ばれます。Pythonはここで一番の言語です(有名なMap Reduceを使用)。Pythonより前では、バッチ処理プロジェクトは任意の言語で作成でき、通常はCondorによってディスパッチされます。


1
「クレイジーなレベルの微調整」の部分について少し詳しく説明していただけますか?
ルーク

コンピューティングセンターは、大学院生を雇ってMPI呼び出しを再配置し、MPIの実行を高速化します。
rwong

(?)ここに最初の言葉がありますが、プラクティスは異なると思います。
ルーク

気候モデリング研究センターでした。
rwong

4

私は(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つです。


1
C ++にはオブジェクトモデルがありますか?しかし、コントローラーを作成するためにスクリプト言語を使用する必要があります-開発速度のためにC#がC ++よりも優れている場合、python(またはluaなど)はC#よりも優れています。
gbjbaanb

3
@gbjbaanb必ずしもではありません。この実装はGPUにバインドされていますが、スクリプト言語に移行することで簡単に変更できます。C#はコンパイルされ、非常に優れたオプティマイザーを備えています。コンパイルされ、強く型付けされた言語があなたの友達です!それほど厳密でないスクリプト言語は、合理的に複雑なプロジェクトの開発時間を増加させる傾向があります。
3Dave

1
7年ぶりです。私は多くを学びました。c ++は非常に素晴らしく、C#も素晴らしく、私はpythonが本当に好きで、CPUパフォーマンスは依然として重要です。
3Dave

3

Fortranは、主にレガシー(まだ古いコードを実行している)と親しみ(HPCを実行するほとんどの人が他の種類の言語に精通していないため)が最も一般的です。

ガベージコレクションやランタイムポリモーフィズムなどの最新のプログラミング言語の機能は、速度が重要なのでC#、Java、C ++がどこから来るのかわからないため、HPCには適していません。

一般的にはそうではありません。従来のHPCは、主に機械精度の数値を使用した線形代数を行っていました。しかし、最新のHPCでは、マシンの精度の数値ではなく、任意の数式を使用したシンボリック計算など、より多様な処理にスーパーコンピューターを使用することが増えています。これにより、使用するツールにまったく異なる特性が置かれます。また、Fortran以外のプログラミング言語を使用することも珍しくありません。なぜなら、GCやOCamlの最適化パターンマッチコンパイラーなどの他の種類の最適化コンパイラーがないと、シンボリック計算が非常に困難になる可能性があるためです。

たとえば、Fischbacher らによるこの論文を読んでください「著者は、これがこれまでに実行された最大のシンボリック計算である可能性が高いと信じる強い理由がある」と述べています。


多くの人がスーパーコンピューティング時間を使用して物理天気予報などの物理システムのシミュレーションを実行し、Fortranで必要なアルゴリズムを非常に明確かつ簡潔に実装しているため、Fortranは一般的です。
シャーピー

3

Fortran、いくつかの良い理由とそうでない理由のため。重い演算処理の場合、正当な理由は、CおよびC ++から呼び出すことができますが、Fortranで記述された実証済みのサブルーチンの広範なライブラリ(BLAS、LAPACK)があることです。

それほど良くない理由は、FortranがC / C ++よりもパフォーマンスが優れていると思われることです。オプティマイザーは非常に優れており、コードの一部を最適化する利点は、それがビジーである時間の割合に比例することを理解している人はほとんどいません。

それほど良くないもう1つの理由は、CSプログラマーと非CSプログラマーの文化のギャップです。科学的プログラマーはFortranで悪い習慣を教えられ、CSプログラマーと彼らが教えられてきた悪い習慣軽視する傾向あります。


「CSプログラマーと非CSプログラマーの文化的ギャップ。科学プログラマーはFortranで悪い習慣を教えられる傾向があり、CSプログラマーと彼らが教えられてきた悪い習慣を軽視する傾向があります。部分的にこれは、彼らが問題のさまざまな側面に集中しているということです。FortranはFORmula TRANslationを意味し、数式をコードに変換するのに非常に効率的です。CSタイプが通常行うプログラミングの種類については、他の言語が優れています。
オメガケンタウリ

1
@オメガ:そのとおりです。Fortranを教えている人々は、フォーマットの概念を持たず、「暗黙のなし」を嫌い、72文字の行を処理し、理解しやすいコードを作成することは弱虫のためだと考えているため、コードを詰め込む傾向があります。CSの教えを受けた人々は、単純なものが仕事をする場合に、ポリモーフィズム、通知、および抽象化を組み合わせたクラスのモンスターピラミッドを作成します。だから彼らはお互いに値する:)
マイクダンラベイ

7
かつての引用は、「物理学者は昨日のハードウェアで明日の問題を解決しているが、CS担当者は明日のハードウェアで昨日の問題を解決している」
マーティンベケット

@マーティン:どこかで聞いたことがあると思います。確かに鳴ります。
マイクダンラベイ

マーティン:それで、ハードウェアの人が最も効率的です:)
Dhaivat Pandya

2

基本的に、数値計算の実際の作業を行うプログラムはすべてFORTRANです(古いblas、lapack、arnoldiなどはまだ使用されています)...しかし、より高いレベルの構造になると...人々はますます使用していますC ++。

シミュレーションの複雑さは巨大なコードを伴い、1つを書くことからどんな種類の利益を得るには、それを再利用可能にすることです。また、使用される概念も非常に複雑になりました。FORTRANを使用してその情報を表現することはほとんど狂気です。C ++は、オブジェクト指向設計を本質的にサポートしているため、C ++が登場します。ただし、ランタイムポリモーフィズムが優先されることはほとんどありません。代わりに、人々はほとんど常に静的ポリモーフィズムを使用します(これはテンプレートメタプログラミングでC ++に実装されています)

また、現在のコンパイラは本当に優れているため、多くの最適化がコンパイラに任されています。


1

HPCアプリケーションで対処する必要のある2種類の問題があります。1つはそれ自体を処理する数であり、もう1つは計算の管理です。最初の方法は通常、Fortran、C、またはC ++で記述されたコードを使用します。これは、速度と、この言語で記述された多くの科学的アルゴリズムがすでに存在するためです。計算のステアリングは、高レベル言語でより便利に実装されます。Pythonは、アプリケーションロジックの処理や、コンパイルされた言語で実装された拡張機能の呼び出しに最適な「接着剤」言語です。Javaは、ネットワークと分散コンピューティングの管理が不可欠なプロジェクトで頻繁に使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.