C ++の並列動的グラフライブラリを探しています。


11

こんにちは、scicompコミュニティ、

NetworkX(Python)、JUNGYFiles(Java)などのフレームワークを使用して、グラフアルゴリズムの分野で働いてきました。現在、並列コンピューティングと高性能コンピューティングの分野に参入しています。新しいプロジェクトでは、次の機能を備えたC ++グラフライブラリを探しています。

  • アルゴリズム開発を可能にする直感的なインターフェースを備えています
  • 動的な操作をサポートします。たとえば、任意のノード/エッジの挿入と削除
  • 並列化をサポートします。たとえば、マルチスレッドで発生する問題からプログラマを保護します
  • メモリオーバーヘッドが低く、高性能コンピューティングに適しています

いくつかのライブラリを提案し、これらの基準と賛否両論について議論してください。

回答:


11

Boost Graph LibraryとLEMON

ダニエルが包括的答えで述べているように、最もフル機能を備えた一般的なC ++ライブラリはBoost Graph Libraryです。幅優先検索と深さ優先検索、最小スパニングツリー、接続コンポーネント検索などのいくつかの基本的なアルゴリズムを実行できる新しい分散メモリ拡張機能がありますが、この新しいプロジェクトにはあまり詳しくありません。Boost Graph Library自体は評判が高く、世界中の多くのプロジェクトで使用されています。

基本的なHPCグラフの作業を行っている場合、Boost Graph Libraryから開始することをお勧めしますが、多くのHPC C ++コンパイラーは(C ++標準にかなり厳密に準拠しているにもかかわらず)Boostに問題があることに注意してください。 Boostの古いバージョンまたはHPCシステムで動作させるためのGCCなどの非ベンダーコンパイラ。

LEMONのリポジトリをざっと見てみると、IBM BlueGeneスーパーコンピューティングチームからの関与があることがわかりますが、MPIの依存関係や構成は見当たらないため、現時点ではシリアルグラフライブラリにすぎない可能性があります。

負荷分散と動的グラフ(再)パーティション分割

負荷分散と動的なグラフ分割に関心がある場合は、さらにいくつかのオプションがあります。おそらく最も有名なライブラリはParMETISで、昨年バージョン4に更新されました。ParMETISは、マルチフィジックスシミュレーションに重要な頂点ベースの重み付けを備えています。

ParMETISのヨーロッパの競争相手はPT-Scotchであり、特定の種類の問題に対してより良いパフォーマンスを持っていますが、ParMETISと同様に、頻繁に更新されません。

Zoltanにも興味があるかもしれません。これは、C ++での科学計算用のSandia National Laboratories Trilinosメタパッケージの一部です。Zoltanは、独自の階層パーティショナーとParMETISとPT-Scotchの両方へのインターフェイスを備えています。

Graph500

同時検索、最適化(単一ソースの最短パス)、およびエッジ指向(最大独立セット)の最先端に取り組んでいる場合、自由に利用できるGraph500ベンチマークにも興味があります


1
質問:Parallel Boost Graph Libraryは、分散メモリ並列処理を目的としています。通常のBoost Graph Libraryは、OpenMPを使用した共有メモリの並列化に適していますか?
clstaudt

@clstaudt-これは問題固有のものになります。より良い回答を得るには、アルゴリズムの詳細を深く理解する必要があります(おそらく新しい質問です)。
アロンアーマディア

5

おそらく、Boost Graph Libraryはあなたが探しているものです。GraphVizのDOT形式で指定されたグラフを読み取るためのパーサーがあります。私は実際にメモリのオーバーヘッドについては知りませんが、並列化のためのバリアントを提供ます。

もう1つのグラフライブラリはLEMONですが、私はそれを本当に知りません。並列化をサポートしている場合、広告されていません。しかし、それは良い印象を与えるウェブサイトです;)


LEMONも私には良さそうですが、共有メモリ並列コード(OpenMP)に使用できるかどうかはまったくわかりません。
clstaudt

私も、正直に言うと。しかし、おそらくそれを使用して、問題の共有データ構造を宣言し、異なるスレッドでアルゴリズムを実行できます。問題を適切なサブ問題に細分することができます。
ダニエルエバーツ

5

また、並列処理用に設計された動的なグラフデータ構造であるSTINGERについても言及します。Webサイトによると、次の目的のために設計されています。

移植性:STINGER用に作成されたアルゴリズムは、複数の言語とフレームワーク間で簡単に翻訳/移植できます

生産性:STINGERは、大規模なグラフコミュニティが互いの研究開発を迅速に活用できるように、共通の抽象的なデータ構造を提供する必要があります。これは、スパース行列と密行列の暗黙的な使用の数値アルゴリズムコミュニティの哲学に似ています。

パフォーマンス:すべてのグラフアルゴリズムに最適な単一のデータ構造はないことが認識されています。STINGERの目的は、ほとんどのアルゴリズムを適切に実行できる実用的なデータ構造を構成することです。STINGERを使用した場合、一般的なグラフアルゴリズムの幅広いセットにわたる別の一般的なデータ構造と比較して、パフォーマンスが大幅に低下することはありません。STINGERは共有メモリアドレス空間を想定し、シーケンシャルアルゴリズムまたはパラレルアルゴリズムの両方を許可する必要があります。データ構造は、可能な場合、並列アルゴリズムが並行性を活用できるようにする必要があります。

LEMONやBoost Graph Libraryほど一般的ではなく、開発の初期段階にあります。あなたがそれをチェックアウトするなら、私はあなたのコメントに興味があるでしょう。


STINGERは、ジョージア工科大学のDavid Baderの研究室から出てきました。彼はGraph500の研究でHPCコミュニティでよく知られています。これについて言及してくれてありがとう!
アロンアーマディア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.