科学計算におけるタスクベースの共有メモリ並列ライブラリ


10

近年、何らかの形式の汎用データ駆動型共有メモリ並列処理を提供するいくつかのライブラリ/ソフトウェアプロジェクトが登場しています。

主なアイデアは、明示的にスレッド化されたコードを書く代わりに、プログラマーがアルゴリズムを相互依存タスクとして実装し、共有メモリーマシン上の汎用ミドルウェアによって動的にスケジュールされるというものです。

そのようなライブラリの例は次のとおりです。

  • QUARK:もともとはMAGMA並列線形代数ライブラリ用に設計されましたが、並列高速多重極法にも使用されているようです。

  • Cilk:もともとはMITベースのプロジェクトで、現在Intelでサポートされています。Cの言語/コンパイラー拡張として実装され、Cilkchessコンピューターチェスソフトウェアで使用され、FFTW実験的に使用されました。

  • SMPスーパースカラー:バルセロナスーパーコンピューティングセンターで開発されました#pragma。拡張機能に基づいて、多くの点でCilkに似ています。

  • StarPU:GPUを含むいくつかの異なるアーキテクチャ用にコンパイルおよびスケジュールできる、同様のライブラリベースの「コードレット」。

  • OpenMPタスク:バージョン3.0以降、OpenMPは非同期にスケジュールできる「タスク」を導入しました(仕様のセクション2.7を参照)。

  • Intelのスレッディングビルディングブロック:C ++クラスを使用して非同期タスクを作成および起動します。チュートリアルのセクション11を参照してください。

  • OpenCL:マルチコアでのタスクベースの並列処理をサポートします。

これらのライブラリ/言語拡張の内部動作と特定の問題への適用について説明している文献はたくさんありますが、科学計算アプリケーションで実際に使用されている例はほとんどありません。

だからここに質問です:誰かが共有メモリ並列処理のためにこれらのライブラリ/言語拡張、または同様のものを使用する科学計算コードを知っていますか?


タスクベースの並列処理をお探しですか?OpenCLとIntel TBBをスキップした理由はありますか?ここであなたが何を探しているのか正確には言えません。
Aron Ahmadia 2012

1
@AronAhmadia:主に無知... :)リストにTBBとOpenCLを追加しましたが、問題は同じです:これらのタスクベースのコンポーネントが科学用の重要なソフトウェアで使用されているコンピューティング?
ペドロ

この質問とその回答をコミュニティーWikiに変えることと、さらに範囲を絞ろうとすることとではどう思いますか?
Aron Ahmadia 2012

@AronAhmadia:質問の形式をそのままにしておくと、タスクベースのプログラミングや共有メモリプログラミングの一般的な長所/短所に関する長い議論にすぐに退屈してしまうのではないかと心配です。ただし、さらにいくつかの回答を得た後、私はそれを切り替えることを望みます。
Pedro

タイトルが不適切です。この質問は、共有メモリではなく、タスクの並列処理に関するものです。
ジェフ

回答:


8

deal.IIは、ライブラリ全体でスレッディングビルディングブロックを使用しており、おおむね私たちはそれに満足しています。私たちはいくつかの代替案、特にOpenMPを検討しました。誰もがそれをより単純なコードに使用しているように見えるためですが、それらは欠けていることがわかりました。特に、OpenMPには、そのタスクモデルでは開始したタスクのハンドルを取得できないため、タスクの状態にアクセスする(たとえば、完了するのを待つ)か、値を返すことが難しいという大きな欠点があります。別のタスクで実行する関数。OpenMPは主に最も内側のループを並列化するのに適していますが、最も外側の複雑なループを並列化することで並列効率が得られ、OpenMPはそのためのツールではありませんが、TBBはそれに適しています。


これを指摘してくれてありがとう、deal.IIを見ていませんでした。deal.IIによるTBBの使用が詳細に説明されている出版物やドキュメントはありますか?
Pedro、

公開されていませんが、これは役立つ可能性があります:dealii.org/developer/doxygen/deal.II/group__threads.html
Wolfgang Bangerth 2012

4

私の意見では、これらのシステムは、主に次の理由により、比較的失敗しています。

  • 並列計算は、メモリの局所性を公開して同期ポイントを削除するだけではなく、計算(たとえば、フロップ)を並列化することに関する単純な見方です。密行列アルゴリズムなどの一部の問題は依然としてFPに制限されていますが、メモリサブシステムとほとんどの計算カーネル(特にPDEの世界)を注意深く検討した後にのみ発生します。ワークキューは、メモリの局所性を交換して、フロップのナイーブバランスを改善し、より多くのアトミックメモリ操作を実行する傾向があります(キューを介した同期のため)。
  • 強力なスケーラビリティを犠牲にして、動的ロードバランスの過剰分解に依存する。通常、タスクには重複するデータ依存関係(ゴースト値)があります。内部のサイズが小さくなると、ゴースト/内部比率が増加します。これが冗長な作業を意味しない場合でも、メモリの移動が増えることを意味します。メモリ帯域幅要件の大幅な削減は、複数のスレッドがネイバーのソフトウェアプリフェッチによってL1またはL2キャッシュを共有する協調プリフェッチなどのアプローチによって実現できます(これにより、暗黙的にスレッドのグループをほぼ一貫性のある状態に保ちます)。これは、過剰分解の正反対です。
  • 予測できないパフォーマンス、主に上記のメモリ関連の問題が原因です。
  • ライブラリに適したコンポーネントの欠如。これはMPI_Comm、さまざまなライブラリが衝突することなく豊富な操作を実行したり、ライブラリ間でコンテキストを渡したり、必要な属性を回復したりできる類似の機能がないとほぼまとめることができます。「コミュニケーター」によって提供される抽象化は、共有メモリと分散メモリのどちらが使用されているかに関係なく、ライブラリの構成にとって重要です。

私はあなたの答えを誤解しているかもしれませんが、最初の点は、Buttari、Kurzak、Dongarraなどが密線形代数のためのタスクベースの共有メモリライブラリであるMAGMAで示したものとは正反対です...また、2番目の点では重複するデータ、つまりゴースト値、およびサーフェスとボリュームの比率を参照しますが、これらは分散メモリドメイン分解スキームからのホールドオーバーです。私自身もパーティクルベースのコードでこのようなメソッドを使用しており、MPIベースの並列実装よりもはるかに優れたパフォーマンスを実現しています。
Pedro

いずれにせよ、問題は別の問題でした...これらのアプローチを使用する科学計算ソフトウェアプロジェクトについて知っていますか?
ペドロ

1.これらのシステムを使用するプロジェクトはいくつかありますが、そのアプローチが「成功した」と見なすことはできないと思います。2.依存関係はまだ共有メモリで重複しています。アトミックによる同期などのボトルネックを回避するために、tcmallocまたはLinuxカーネルがスレッドをより独立させる方法を見てください。共有アドレス空間は、メモリが均一であるかのように操作する必要があること、またはアトミックを安価であると見なす必要があることを意味しません。
Jed Brown、

3.引用しようとしている「公平な比較」はわかりませんが、プラズマはピークFPUの約25%しか取得しません(たとえば、hpcgarage.org / cscads2012 / Luszczek-UTK-PowerTools.pdfのスライド5 )。ピークの少なくとも70%が予想される分散メモリでの同じ操作には、公表できないほど悪い。密な線形代数は、可能性のある例外として具体的に引用したFPUバインドのケースですが、巨大な行列サイズにもかかわらず、PLASMAは明らかにFPUバインドからはほど遠いです。
Jed Brown

ペドロ、ほとんどの物理学は長い範囲のコンポーネントを持っているので、粒子は上記の表面から溶液への影響を受ける更新と結合されます(PPPM、渦粒子など)
Matt Knepley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.