Sto cercando una libreria di grafici dinamici paralleli in C ++


11

Ciao comunità scicomp,

Ho lavorato nell'area degli algoritmi grafici usando framework come NetworkX (Python), JUNG e YFiles (Java). Ora sto entrando nell'area dell'informatica parallela e ad alte prestazioni. Per un nuovo progetto, sto cercando una libreria di grafici C ++ con le seguenti funzionalità:

  • ha un'interfaccia intuitiva che consente lo sviluppo di algoritmi
  • supporta operazioni dinamiche: ad es. inserimenti ed eliminazioni di nodi / bordi arbitrari
  • supporta la parallelizzazione: ad esempio protegge il programmatore da problemi derivanti dal multithreading
  • ha un sovraccarico di memoria basso ed è adatto per l'elaborazione ad alte prestazioni

Si prega di suggerire alcune biblioteche e discutere questi criteri, nonché i pro ei contro.

Risposte:


11

Boost Graph Library e LEMON

Come accenna Daniel nella sua risposta esaustiva , la libreria C ++ generale più completa è la Boost Graph Library . Esiste una nuova estensione di memoria distribuita in grado di eseguire alcuni algoritmi di base come la ricerca breadth-first e depth-first, il minimo spanning tree e la ricerca dei componenti collegati, ma non ho molta familiarità con il nuovo progetto. La stessa Boost Graph Library è rinomata e utilizzata in molti progetti in tutto il mondo.

Se stai eseguendo un lavoro di base sul grafico HPC, potresti voler iniziare con la libreria di grafici Boost, ma tieni presente che molti compilatori C ++ HPC hanno difficoltà con Boost (nonostante la sua aderenza piuttosto rigorosa agli standard C ++) e potrebbe essere necessario utilizzare un versione precedente di Boost o un compilatore non vendor come GCC per farlo funzionare sui sistemi HPC.

Una rapida occhiata ai repository di LEMON mostra che c'è un coinvolgimento del team di supercalcolo IBM BlueGene, ma non vedo dipendenze o configurazioni per MPI, quindi al momento è probabile che al momento sia solo una libreria di grafici seriali.

Bilanciamento del carico e (ri) partizionamento del grafico dinamico

Se sei interessato al bilanciamento del carico e al partizionamento grafico dinamico, hai diverse altre opzioni. Forse la libreria più conosciuta è ParMETIS , che è stata aggiornata alla versione 4 l'anno scorso. ParMETIS presenta una ponderazione basata sui vertici, che è importante per le simulazioni multi-fisica.

Il concorrente europeo di ParMETIS è PT-Scotch , che ha avuto prestazioni migliori per alcuni tipi di problemi, ma, simile a ParMETIS, non viene aggiornato di frequente.

Potresti anche essere interessato a Zoltan , che fa parte del meta-pacchetto Trilinos dei laboratori nazionali Sandia per il calcolo scientifico in C ++. Zoltan presenta i suoi partizionatori e interfacce gerarchici sia in ParMETIS che in PT-Scotch.

Graph500

Se stai lavorando al limite massimo della ricerca simultanea, dell'ottimizzazione (percorso più breve per singola fonte) e orientato ai margini (set indipendente massimo), ti interesserà anche il benchmark Graph500 liberamente disponibile .


1
Domanda: La libreria di grafici Parallel Boost è pensata per il parallelismo della memoria distribuita. La normale libreria di grafici Boost è adatta per la parallelizzazione della memoria condivisa con OpenMP?
clstaudt,

@clstaudt - Questo sarà specifico del problema. Dovrai approfondire i dettagli del tuo algoritmo per una risposta migliore (e probabilmente sarebbe una nuova domanda).
Aron Ahmadia,

5

Forse, la libreria di grafici Boost è ciò che stai cercando. Ha un parser per leggere i grafici specificati nel formato DOT di GraphViz. Anche se non so davvero dell'overhead della memoria, fornisce una variante per la parallelizzazione .

Un'altra libreria di grafi è LEMON ma non lo so davvero e se ha il supporto per la parallelizzazione, non viene pubblicizzata. Il suo sito Web fa comunque una buona impressione;)


Anche LEMON mi sta bene, ma non ho assolutamente idea di poterlo utilizzare per il codice parallelo a memoria condivisa (OpenMP).
clstaudt,

Nemmeno io, a dire il vero. Ma forse puoi usarlo per dichiarare strutture di dati condivise per il tuo problema ed eseguire i suoi algoritmi in thread diversi. Forse puoi suddividere il problema in sottoproblemi adeguati.
Daniel Eberts,

5

Vorrei anche citare STINGER , una struttura dati grafica dinamica progettata per il parallelismo. Secondo il sito Web, è progettato per i seguenti obiettivi:

Portabilità: gli algoritmi scritti per STINGER possono essere facilmente tradotti / portati tra più lingue e framework

Produttività: STINGER dovrebbe fornire una struttura di dati astratta comune in modo tale che la grande comunità di grafici possa sfruttare rapidamente gli sviluppi della ricerca reciproca. Questo è simile in filosofia agli algoritmi numerici della comunità nell'uso implicito di matrici sparse e dense.

Prestazioni: è noto che nessuna singola struttura di dati è ottimale per ogni algoritmo grafico. L'obiettivo di STINGER è configurare una struttura di dati sensibile in grado di eseguire bene la maggior parte degli algoritmi. Non dovrebbe esserci una riduzione significativa delle prestazioni per l'utilizzo di STINGER rispetto a un'altra struttura di dati generale in un'ampia gamma di algoritmi grafici tipici. STINGER dovrebbe assumere uno spazio di indirizzi di memoria condiviso e consentire algoritmi sia sequenziali che paralleli. La struttura dei dati dovrebbe consentire agli algoritmi paralleli di sfruttare la concorrenza ove possibile.

Non è generico come LEMON o Boost Graph Library e in una fase iniziale di sviluppo. Se lo guardi, sarei interessato ai tuoi commenti.


STINGER Esce dal laboratorio di David Bader alla Georgia Tech. È noto nella comunità HPC per il suo lavoro su Graph500, grazie per averlo menzionato!
Aron Ahmadia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.