Estoy buscando una biblioteca de gráficos dinámicos paralelos en C ++

11

Hola comunidad scicomp,

He trabajado en el área de algoritmos gráficos usando frameworks como NetworkX (Python), JUNG e YFiles (Java). Ahora estoy entrando en el área de computación paralela y de alto rendimiento. Para un nuevo proyecto, estoy buscando una biblioteca de gráficos C ++ con las siguientes características:

  • tiene una interfaz intuitiva que permite el desarrollo de algoritmos
  • admite operaciones dinámicas: p. ej. inserciones y eliminaciones arbitrarias de nodo / borde
  • admite paralelización: por ejemplo, protege al programador de problemas que surgen con subprocesos múltiples
  • tiene una carga de memoria baja y es adecuado para la informática de alto rendimiento

Sugiera algunas bibliotecas y analice estos criterios, así como los pros y los contras.

clstaudt
fuente

Respuestas:

11

Boost Graph Library y LEMON

Como Daniel menciona en su respuesta integral , la biblioteca general de C ++ más completa es la Biblioteca de gráficos Boost . Hay una nueva extensión de memoria distribuida capaz de hacer algunos algoritmos básicos, como búsqueda de amplitud y profundidad, árboles de expansión mínima y búsqueda de componentes conectados, pero no estoy muy familiarizado con el nuevo proyecto. La biblioteca de gráficos Boost en sí tiene buena reputación y se utiliza en muchos proyectos en todo el mundo.

Si está haciendo un trabajo básico de gráficos HPC, es posible que desee comenzar con Boost Graph Library, pero tenga en cuenta que muchos compiladores HPC C ++ tienen dificultades con Boost (a pesar de su estricto cumplimiento de los estándares C ++), y es posible que necesite usar un versión anterior de Boost o un compilador no proveedor como GCC para que funcione en sistemas HPC.

Una exploración rápida de los repositorios de LEMON muestra que existe una participación del equipo de supercomputación IBM BlueGene, pero no veo ninguna dependencia o configuración para MPI, por lo que es probable que solo sea una biblioteca de gráficos en serie en este momento.

Equilibrio de carga y (re) partición dinámica de gráficos

Si está interesado en el equilibrio de carga y la partición dinámica de gráficos, tiene varias opciones más. Quizás la biblioteca más conocida es ParMETIS , que se actualizó a la versión 4 el año pasado. ParMETIS presenta una ponderación basada en vértices, que es importante para las simulaciones multifísicas.

El competidor europeo de ParMETIS es PT-Scotch , que ha tenido un mejor rendimiento para ciertos tipos de problemas, pero, al igual que ParMETIS, no se actualiza con frecuencia.

También le puede interesar Zoltan , que forma parte del metapaquete Sandil National Laboratories Trilinos para la informática científica en C ++. Zoltan presenta sus propios particionadores jerárquicos e interfaces tanto en ParMETIS como en PT-Scotch.

Graph500

Si está trabajando en el borde de la búsqueda concurrente, la optimización (ruta más corta de una sola fuente) y orientado al borde (conjunto independiente máximo), también le interesará el punto de referencia Graph500 disponible de forma gratuita .

Aron Ahmadia
fuente
1
Pregunta: La biblioteca de gráficos Parallel Boost está diseñada para el paralelismo de memoria distribuida. ¿La Boost Graph Library ordinaria es adecuada para la paralelización de memoria compartida con OpenMP?
clstaudt
@clstaudt: esto va a ser específico del problema. Tendrá que profundizar en los detalles de su algoritmo para obtener una mejor respuesta (y probablemente sería una nueva pregunta).
Aron Ahmadia
5

Quizás, la Boost Graph Library es lo que está buscando. Tiene un analizador para leer gráficos especificados en el formato DOT de GraphViz. Si bien no sé realmente sobre la sobrecarga de memoria, proporciona una variante para la paralelización .

Otra biblioteca de gráficos es LEMON pero realmente no lo sé y si tiene soporte para la paralelización, no se anuncia. Sin embargo, su sitio web causa una buena impresión;)

Daniel Eberts
fuente
LEMON también me parece bien, pero no tengo ni idea de si puedo usarlo para código paralelo de memoria compartida (OpenMP).
clstaudt
Yo tampoco, para ser honesto. Pero quizás pueda usarlo para declarar estructuras de datos compartidos para su problema y ejecutar sus algoritmos en diferentes hilos. Quizás pueda subdividir su problema en subproblemas adecuados.
Daniel Eberts el
5

También me gustaría mencionar STINGER , una estructura de datos de gráficos dinámicos diseñada para el paralelismo. Según el sitio web, está diseñado para los siguientes objetivos:

Portabilidad: los algoritmos escritos para STINGER se pueden traducir / portar fácilmente entre múltiples idiomas y marcos

Productividad: STINGER debe proporcionar una estructura de datos abstractos común para que la gran comunidad gráfica pueda aprovechar rápidamente los desarrollos de investigación de los demás. Esto es similar en filosofía al uso implícito de la comunidad de algoritmos numéricos de matrices dispersas y densas.

Rendimiento: se reconoce que ninguna estructura de datos única es óptima para cada algoritmo gráfico. El objetivo de STINGER es configurar una estructura de datos sensible que pueda ejecutar bien la mayoría de los algoritmos. No debería haber una reducción significativa del rendimiento para usar STINGER en comparación con otra estructura de datos general en un amplio conjunto de algoritmos gráficos típicos. STINGER debe asumir un espacio de direcciones de memoria compartida y permitir algoritmos secuenciales o paralelos. La estructura de datos debe permitir que los algoritmos paralelos exploten la concurrencia donde sea posible.

No es tan genérico como LEMON o Boost Graph Library y en una etapa anterior de desarrollo. Si lo revisas, me interesarían tus comentarios.

clstaudt
fuente
STINGER Sale del laboratorio de David Bader en Georgia Tech. Es conocido en la comunidad HPC por su trabajo en Graph500, ¡gracias por mencionar este!
Aron Ahmadia