歴史的視点
新しいパラダイムが将来どのようなものになるかを言うことは本当に不可能です。たとえば、Ken KennedyのRise and Fall of HPFを読むことをお勧めします。Kennedyは、MPIとスマートコンパイラの2つの新しいパターンを説明し、MPIが適切な量のアーリーアダプターと優位性を備えていることを詳しく説明します。HPFは最終的に問題を修正しましたが、手遅れでした。
多くの点で、PGASやOpenMPなどのいくつかのパラダイムは、同じHPFトレンドに従っています。初期のコードは、十分に使用できるほど柔軟ではなく、テーブルに多くのパフォーマンスを残していました。しかし、並列アルゴリズムのすべてのイオタを書く必要がないという約束は魅力的な目標です。したがって、新しいモデルの追求は常に追求されています。
ハードウェアの明確なトレンド
現在、MPIの成功は、MPIが実行されるハードウェアのモデリング方法と密接に関係しているとよく言われています。おおよそ、各ノードには少数のプロセスがあり、メッセージをローカルのポイントツーポイントに送信したり、調整された集合操作を介してクラスター空間で簡単に送信したりします。このため、新しいハードウェアのトレンドに厳密に従わないパラダイムを提供する人を信用していません。実際、Vivak Sarakarの研究によってこの意見を確信しました。
これに合わせて、新しいアーキテクチャで明らかに前進している3つのトレンドを紹介します。そして、HPC には現在12の異なるアーキテクチャが販売されています。これは5年未満前からx86のみを搭載していたため、今後数日間はハードウェアをさまざまな興味深い方法で使用する機会が多くなります
- 特別な目的のチップ:アクセラレータのような大きなベクトルユニットを考える(Nvidiaのビルダリーが支持するビュー)
- 低電力チップ:ARMベースのクラスター(電力バジェットに対応するため)
- チップのタイリング:異なる仕様のチップのタイリングを考える(Avant Argwalの仕事)
現在のモデル
現在のモデルは実際には3レベルの深さです。これらのレベルのうちの2つをうまく使用するコードは数多くありますが、3つすべてを使用して多くのコードが登場したわけではありません。最初にエクサスケールに到達するには、3つのレベルすべてでコードを実行できるかどうかを判断することに投資する必要があると思います。これはおそらく、現在の傾向をうまく反復処理するための最も安全な方法です。
モデルと、予測される新しいハードウェアビューに基づいてモデルを変更する必要がある方法を繰り返します。
分散型
分散レベルのプレーヤーは、主にMPIおよびPGAS言語に分類されます。MPIは今のところ明らかな勝者ですが、UPCやチャペルなどのPGAS言語がこの分野に前進しています。1つの良い兆候は、HPCベンチマークチャレンジです。PGAS言語は、ベンチマークの非常にエレガントな実装を提供しています。
ここで最も興味深い点は、このモデルは現在ノードレベルでのみ機能しますが、タイルアーキテクチャのノード内の重要なモデルになることです。1つの兆候は、基本的に分散システムのように動作するIntel SCCチップです。SCCチームは独自のMPI実装を作成し、多くのチームがコミュニティライブラリをこのアーキテクチャに移植することに成功しました。
しかし、正直に言うと、PGASはこのスペースに足を踏み入れるのに良いストーリーを持っています。本当にMPIノード間をプログラムしてから、同じトリックイントラノードを実行する必要がありますか?これらのタイルアーキテクチャの大きな問題の1つは、チップ上のクロック速度が異なり、メモリへの帯域幅が大きく異なるため、パフォーマンスコードがこれを考慮する必要があることです。
ノード上の共有メモリ
ここでは、MPIが「十分」であることがよくありますが、PThreads(およびIntel Parallel Building BlocksなどのPThreadsから派生したライブラリ)およびOpenMPが依然として頻繁に使用されています。一般的な見方では、RPIのためにMPIのソケットモデルが機能しなくなるほど十分な共有メモリスレッドが存在するか、コアで実行される軽量プロセスが必要になるということです。すでに、IBM Bluegeneシステムが共有メモリーMPIに問題があるという兆候を見ることができます。
Mattがコメントしているように、計算集中型コードの最大のパフォーマンス向上は、シリアルコードのベクトル化です。多くの人々はこれがアクセラレータで真実であると仮定しますが、ノード上のマシンでも同様に重要です。Westmereには4ワイドFPUがあるため、ベクトル化なしではフロップの4分の1しか得られません。
現在のOpenMPがこのスペースに足を踏み入れているとは思えませんが、低電力またはタイルチップがより軽いスレッドを使用する場所があります。OpenMPにはデータフローの仕組みを説明するのが困難で、使用されるスレッドが増えるにつれて、この傾向がより誇張されるようになっていることがわかります。
十分なレベルのOpenMPとPThreadsの両方が、十分な割合のピークを取得するために必要なベクトル化を利用できますが、そうするには、ベクトル化が自然な方法でアルゴリズムを分解する必要があります。
コプロセッサー
最後に、コプロセッサー(GPU、MIC、Cell acclerators)の出現が定着しました。それらがなければエクサスケールへの道は完全ではないことが明らかになりつつあります。SC11では、すべてのベル賞のコンテスト参加者が非常に効果的にそれらを使用して低ペタフロップスに到達しました。CUDAとOpenCLが現在の市場を支配している一方で、OpenACCとPGASコンパイラがこの分野に参入することを期待しています。
エクサスケールに到達するための1つの提案は、低電力チップを多くのコプロセッサーに結合することです。これにより、現在のスタックの中間層がかなり削除され、メインチップ上の決定問題を管理し、コプロセッサーへの作業をシャッフルするコードが使用されます。これは、コードが非常に効果的に機能するためには、カーネル(またはコードレット)の観点からアルゴリズムを再考する必要があります。つまり、ブランチレス命令レベルの並列スニペットです。私の知る限り、この進化の解決策はかなり広く開かれています。
これがアプリ開発者に与える影響
さあ、質問に行きましょう。エクサスケールマシンの今後の複雑さから身を守りたい場合は、いくつかのことを行う必要があります。
- 少なくとも3レベルの並列階層に適合するようにアルゴリズムを開発します。
- 階層間で移動できるカーネルの観点からアルゴリズムを設計します。
- 順次処理の必要性を緩和します。同期実行は不可能であるため、これらの効果はすべて非同期的に発生します。
今日のパフォーマンスを望んでいるなら、MPI + CUDA / OpenCLは十分ですが、UPCはそこに到達しているので、数日かけて学習するのは悪い考えではありません。OpenMPを使用すれば開始できますが、コードのリファクタリングが必要になると問題が発生します。PThreadsでは、コードをスタイルに完全に書き直す必要があります。これにより、MPI + CUDA / OpenCLが現在の最適なモデルになります。
ここで説明されていないもの
このエクサスケールの話はすべて素晴らしいですが、ここで実際に議論されていないことは、マシンにデータを出し入れすることです。メモリシステムには多くの進歩がありますが、コモディティクラスタには見られません(あまりにも高価です)。データ集約型コンピューティングは、すべてのスーパーコンピューティング会議の大きな焦点になりつつあるため、高メモリ帯域幅スペースへの大きな動きが必ずあります。
これは、発生する可能性のある他の傾向をもたらします(適切な資金提供機関が関与する場合)。マシンは、必要とされるコンピューティングの種類に応じてますます専門化されるでしょう。「データ集約型」マシンはNSFによって資金提供されていますが、これらのマシンは2019年のExascale Grand Challengeとは異なる軌道に乗っています。
これは、コメントでそれらを必要とする参照を求めるために予想よりも長くなりました