2010-03-30 32 views
9

Necesito escribir una aplicación científica en C++ haciendo muchos cálculos y usando mucha memoria. Tengo parte del trabajo, pero debido a los altos requisitos en términos de recursos, estaba pensando en comenzar a pasar al OpenMPI.Programación en C++ para clusters y HPC

Antes de hacer eso tengo una simple curiosidad: si entendí correctamente el principio de OpenMPI, es el desarrollador quien tiene la tarea de dividir los trabajos entre diferentes nodos que llaman ENVIAR y RECIBIR según el nodo disponible en ese momento.

¿Sabes si existe alguna biblioteca o sistema operativo o lo que sea que tenga esta capacidad, permitiendo que mi código siga siendo el mismo en este momento? Básicamente algo que conecta todas las computadoras y deja que compartan como uno su memoria y CPU?

Estoy un poco confundido debido al gran volumen de material disponible sobre el tema. ¿Debo ver la computación en la nube? o memoria compartida distribuida?

Respuesta

5

Actualmente no existe una biblioteca o utilidad C++ que le permita paralelizar automáticamente su código en un conjunto de máquinas. Concedido que hay muchas maneras de lograr la informática distribuida con otros enfoques, realmente desea optimizar su aplicación para usar el paso de mensajes o la memoria compartida distribuida.

Sus mejores apuestas serían:

  1. convertir su aplicación en una solución basada en tareas. Hay muchas formas de hacerlo, pero esto definitivamente se hará a mano.
  2. Identifique claramente dónde puede dividir las tareas y cómo estas tareas esencialmente se comunican entre sí.
  3. Utilice una biblioteca de nivel superior que se base en OpenMPI/Mpich - Boost.MPI viene a la mente.

La implementación de una solución distribuida en paralelo es una cosa, pero hacer que funcione de manera eficiente es otra cosa. Lea sobre diferentes topologías y diferentes patrones de cómputo paralelo para hacer que implementar soluciones sea un poco menos doloroso que si tuviera que empezar de cero.

+0

HI! Muchas gracias por su respuesta. –

2

Si la transmisión de mensajes lo detiene, intente con objetos distribuidos. Hay muchos marcos de objetos distribuidos disponibles. CORBA, DCOM, ICE por nombrar algunos ... Si elige distribuir sus objetos, sus objetos tendrán visibilidad global a través de las interfaces (tanto datos como métodos) que definirá. Cualquier objeto en cualquier nodo puede acceder a estos objetos distribuidos.

He estado buscando un software que permita distribuir memoria, pero no he encontrado ninguna. Supongo que es porque tienes todos estos marcos de objetos distribuidos disponibles, y las personas no tienen ninguna necesidad de distribuir la memoria como tal.

+0

¡Estupendo! Escuché mucho sobre estas tecnologías utilizadas por un viejo amigo mío ... ¡Preguntaré y empezaré a echar un vistazo! –

2

Tuve una buena experiencia usando Top-C en la escuela de postgrado.

Desde la página de inicio: "TOP-C se distingue especialmente como un paquete para paralelizar fácilmente las aplicaciones secuenciales existentes".

http://www.ccs.neu.edu/home/gene/topc.html

Edit: Debo añadir, que es mucho más sencillo poner en paralelo un programa si se utiliza "paralelismo trivial". p.ej. Los nodos no necesitan compartir memoria. Mapreduce se basa en este concepto.Si puede minimizar la cantidad de estado compartido que usan sus nodos, verá mejoras de órdenes de magnitud en el procesamiento paralelo.

+0

HI! Muchas gracias por su respuesta ... ¡No sabía de este proyecto! ¡Me encantará! –

4

Bueno, en realidad no ha indicado exactamente a qué hardware se dirige, si es una máquina de memoria compartida, OpenMP es una opción. La mayoría de los programadores paralelos considerarían la paralelización con OpenMP como una opción más fácil que usar MPI en cualquiera de sus encarnaciones. También sugiero que sea más fácil adaptar OpenMP a un código existente que MPI. Los mejores, en el sentido de mejores resultados, los programas MPI son aquellos diseñados desde cero para ser paralelos con el envío de mensajes.

Además, el mejor algoritmo secuencial puede no ser siempre el algoritmo más eficiente, una vez que ha sido paralelizado. A veces, un algoritmo simple pero secuencialmente subóptimo es una mejor opción.

Es posible que tenga acceso a una computadora de memoria compartida:

  • todas las CPU de varios núcleos son efectivamente los ordenadores de memoria compartida;
  • en una gran cantidad de clústeres, los nodos son a menudo de dos o cuatro CPUs fuertes, si cada uno tiene 4 núcleos, es posible que tenga una máquina de memoria compartida de 16 núcleos en su clúster;
  • si tiene acceso a un supercomputador MPP, probablemente encontrará que cada uno de sus nodos es una computadora de memoria compartida.

Si tiene problemas con el envío de mensajes, le recomiendo encarecidamente que se quede con C++ y OpenMPI (o con MPI ya instalado en su sistema), y definitivamente debería mirar también BoostMPI. Aconsejo esto con firmeza porque, una vez que salgas de la corriente principal de la computación científica de alto rendimiento, puedes encontrarte en un ejército de una sola programación con una colección idiosincrásica de bibliotecas de ajuste justo para investigación y otras herramientas. C++, OpenMPI y Boost están lo suficientemente bien utilizados como para que puedas considerarlos como de "grado armamentístico" o como sea tu analogía preferida. Hay poco tráfico en SO, por ejemplo, en MPI y OpenMP, revisa las estadísticas de las otras tecnologías antes de apostar la granja por ellas.

Si no tiene experiencia con MPI, es posible que desee consultar un libro llamado Parallel Scientific Computing en C++ y MPI por Karniadakis y Kirby. El uso de MPI por Gropp y otros está bien como referencia, pero no es un texto para principiantes sobre la programación para el envío de mensajes.