2010-07-02 58 views
5

Hace unos minutos tropecé con un texto, que me recordó algo que se ha estado preguntando por un tiempo, pero no tenía dónde preguntar.Explicación de OpenMP y MPI

Entonces, con la esperanza de que este sea el lugar, donde la gente tiene manos en la experiencia con ambos, me preguntaba si alguien podría explicar ¿cuál es la diferencia entre OpenMP y MPI?

He leído los artículos de Wikipedia en su totalidad, los he entendido en segmentos , pero todavía estoy reflexionando; para un programador de Fortran que desea un día entrar en el mundo del paralelismo (acaba de aprender los conceptos básicos de OpenMP ahora), ¿qué es lo más a prueba de futuro forma de ir?

me gustaría que el de todos sus comentarios

+0

Fortran no suena "a prueba de futuro" para mí ... – Andrey

+7

La gente ha estado diciendo eso desde los años 80. Aún aquí. Sigue siendo importante para la programación científica y los métodos numéricos. – duffymo

Respuesta

10

OpenMP es principalmente para multiprocesamiento fuertemente acoplado - es decir, múltiples procesadores en la misma máquina. Es sobre todo para cosas como girar una serie de hilos para ejecutar un bucle en paralelo.

MPI es principalmente para multiprocesamiento de pareja poco común, es decir, un conjunto de computadoras que se comunican entre sí a través de una red. Es can puede usarse en una sola máquina como una especie de forma degenerada de una red, pero hace relativamente poco para aprovechar que es una sola máquina (por ejemplo, que tiene una comunicación de ancho de banda extremadamente alta entre los "nodos").

Editar (en respuesta al comentario): para un grupo de 24 máquinas, MPI se convierte en la opción obvia. Como se señaló anteriormente (y similar a los comentarios de @ Mark), OpenMP es principalmente para múltiples procesadores que comparten memoria. Cuando no tienes memoria compartida, MPI se convierte en la opción más clara.

Al mismo tiempo, suponiendo que va a utilizar máquinas multiprocesador (¿hay algo más?) Es posible que desee utilizar OpenMP para distribuir la carga en cada máquina en todos sus procesadores.

Tenga en cuenta, sin embargo, que OpenMP es generalmente mucho más rápido/fácil de usar que MPI. Dependiendo de cuánta aceleración necesite , escalar en lugar de salir (es decir, menos máquinas con más procesadores cada uno) puede hacer que el desarrollo del software sea más rápido/más económico que puede valer la pena, aunque rara vez da el precio más bajo por núcleo.

+0

Jerry, gracias por tu respuesta también. Por favor, como para no repetirlo, ¿podría leer mi comentario a Mark a continuación y ver si puede compartir algunas ideas al respecto? – Friedrich

7

Otra vista, no inconsistente con lo que @Jerry ya ha escrito es que OpenMP es para paralelización de memoria compartida y MPI es para paralelización de memoria distribuida. Emular la memoria compartida en sistemas distribuidos rara vez es convincente o exitoso, pero es un enfoque perfectamente razonable utilizar MPI en un sistema de memoria compartida.

Por supuesto, todos los equipos y servidores multinúcleo (?) Son sistemas de memoria compartida actualmente, por lo que el modelo de ejecución para OpenMP es ampliamente aplicable. MPI tiende a ser independiente en los clústeres en los que los procesadores se comunican entre sí a través de una red (que a veces se denomina interconexión y, a menudo, es de una especificación superior a la de la oficina Ethernet).

En términos de aplicaciones, estimo que una gran proporción de programas paralelos se pueden implementar con éxito con OpenMP o MPI y que su elección entre los dos probablemente se debe mejor a la disponibilidad del hardware. La mayoría de nosotros (paralelos) consideraría que OpenMP es más fácil de acceder que MPI, y es ciertamente (afirmo) más fácil paralelar de forma incremental un programa existente con OpenMP que con MPI.

Sin embargo, si necesita utilizar más procesadores de los que puede obtener en una caja (y cuántos procesadores están aumentando constantemente) entonces MPI es su mejor opción. También puede tropezar con la idea de la programación híbrida; por ejemplo, si tiene un clúster de PC multinúcleo, puede usar MPI entre PC y OpenMP dentro de una PC. No he visto ninguna evidencia de que la complejidad adicional de la programación sea recompensada por un mejor rendimiento, y he visto alguna evidencia de que definitivamente no vale la pena el esfuerzo.

Y, como ya se ha dicho en uno de los comentarios, creo que Fortran es lo suficientemente resistente al futuro en el dominio de las aplicaciones paralelas, de alto rendimiento, científicas y de ingeniería. La última edición (2008) del estándar incorpora co-arrays (es decir, matrices que se distribuyen en un sistema de memoria con acceso no local y local) directamente en el idioma. Incluso hay una o dos implementaciones iniciales de esta característica. Todavía no tengo ninguna experiencia de ellos y espero que haya problemas de dentición durante algunos años.

EDITAR para recoger en una serie de puntos en los comentarios de OP ...

No, no creo que es una mala idea acercarse a la computación en paralelo a través de OpenMP. Creo que OpenMP y MPI (o, más exactamente, los modelos de computación paralela que implementan) son complementarios. Ciertamente uso ambos, y sospecho que la mayoría de los programadores paralelos profesionales también lo hacen. No había hecho mucho OpenMP desde que abandoné la universidad hace unos 6 años hasta hace unos 2 años, cuando las multicores realmente comenzaron a aparecer en todas partes. Ahora probablemente haga cantidades iguales de ambos.

En términos de aprender algo nuevo, (auto) Creo que el libro El uso de OpenMP por Chapman et al es mejor que el de Chandra, aunque sólo sea porque es mucho más hasta la fecha. Creo que el libro de Chandra es anterior a OpenMP 2, y el libro de Chapman es anterior a OpenMP 3, que vale la pena aprender.

En el lado MPI los libros de Gropp et al, Utilizando MPI y Utilizando MPI-2 son indispensables; esto es quizás porque son (hasta donde he llegado) las únicas introducciones al MPI en lugar de su excelencia. No creo que sean malos, pero no tienen mucha competencia. Me gusta Parallel Scientific Computing en C++ y MPI por Karniadakis y Kirby también; Dependiendo de su nivel de conocimiento de computación científica, puede encontrar que gran parte del material es demasiado básico. Pero creo que el campo carece por completo (espero que alguien pueda probar que estoy equivocado aquí) es un buen libro de texto (o un puñado de libros de texto) sobre el diseño de programas para ejecución paralela, algo para ayudar al experimentado Fortran (en caso), el programador realiza el salto del diseño de programas en serie al paralelo. Mucha información sobre cómo paralelizar un bucle o nido de bucles, no tanto sobre las opciones para los cálculos paralelos en matrices semi-definidas positivas estructuradas (o lo que sea). Para ese nivel de información tenemos que profundizar bastante en los trabajos de investigación (las bibliotecas digitales ACM e IEEE bien valen los modestos costos anuales; si estás en una institución académica, tu biblioteca probablemente tenga suscripciones a estas y mucho más, Tengo suerte de que mis empleadores paguen por las membresías y complementos de mi sociedad profesional, pero si no lo hicieran, me pagaría a mí mismo).

En cuanto a sus planes para un nuevo laboratorio con, digamos, 24 procesadores (¿CPUs o núcleos?, Realmente no importa, solo pregunta) entonces la ruta que tome debe depender de las profundidades de su bolsillo.Si puede pagarlo, sugeriría:

- Considere una computadora de memoria compartida, sin duda hace un año Sun, SGI e IBM podrían todos suministrar un sistema de memoria compartida con ese tipo de núcleos, ' No estoy seguro del estado actual del mercado, pero ya que tiene hasta febrero para decidir si vale la pena investigarlo. Un sistema de memoria compartida le brinda la opción de paralelismo de memoria compartida, que un clúster no tiene, y el paso de mensajes en una plataforma de memoria compartida debe funcionar a la velocidad de la luz. (Por cierto, si realiza esta ruta, compare este aspecto del sistema, ha habido algunas malas implementaciones de MPI en las computadoras de memoria compartida). Una buena implementación de MPI en una computadora de memoria compartida (mi última experiencia con esto fue en un procesador 512 SGI Altix) no envía ningún mensaje, solo mueve unos pocos punteros y es, por consiguiente, increíblemente rápido. El problema con el Altix era que más allá de los 128 procesadores, el bus de memoria solía verse abrumado por todo el tráfico; ese era el momento de cambiar a MPI en un clúster o en un cuadro de MPP.

- Una vez más, si puede pagarlo, le recomiendo que un integrador de sistemas le proporcione un sistema que funcione y evite crear un clúster (o lo que sea) usted mismo. Si, como yo, primero eres un programador y un integrador de sistemas reacio en segundo lugar, este es un enfoque más fácil y te proporcionará un sistema en el que puedes comenzar a programar mucho antes.

Si no puede pagar las costosas opciones, entonces iría por tantos servidores montados en bastidor con 4 u 8 núcleos por caja (la elección depende del precio, y tal vez incluso 16 núcleos por caja vale la pena considerar hoy) y, hoy, estaría planeando al menos 4 GB de RAM por núcleo. Entonces necesitas la interconexión más rápida que puedas pagar; GB Ethernet está bien, pero Infiniband (o el otro cuyo nombre olvido) es más fino, aunque el aumento en el precio es notable. Y necesitará una PC para actuar como nodo principal para su nuevo clúster, ejecutar el sistema de administración de trabajos y otras cosas. Hay un montón de material excelente en Internet sobre la creación y el funcionamiento de clusters, a menudo bajo el título de Beowulf, que era el nombre de lo que se considera que fue el primer clúster de "elaboración casera".

Ahora, ya que tiene hasta febrero para poner en funcionamiento su laboratorio, despida a 2 de sus colegas y conviértelos en un mini-Beowulf. Descargue e instale una instalación MPI de aspecto probable (OpenMPI es bueno, pero hay otros a considerar y su o/s puede dictar otra opción). Ahora puede comenzar a prepararse para cuando el laboratorio esté listo.

PD No tiene que despedir a 2 personas si puede buscar 2 PC de otra forma. Y las PC pueden ser viejas e inadecuadas para el uso de escritorio; simplemente serán una plataforma de capacitación para usted y sus colegas (si le queda algo). Cuanto más idénticos sean, mejor.

+0

Mark, gracias por una respuesta realmente bien escrita, clara y al grano.Entonces, ¿crees que mi decisión de comenzar con OpenMP "para entrar en un comienzo paralelo" no es necesariamente mala o exclusiva, si un día quisiera, o me viera obligado a hacerlo, por necesidad/amplia mis habilidades con MPI? (ps. Nunca tuve dudas del futuro de Fortran, como alguien que ya dijo "estuvo muerto en los 80", luego en los 90, luego en el ...;) – Friedrich

+0

Déjame explicar por qué estoy preguntando. En mi lugar de trabajo, hay una idea para configurar un laboratorio. con aproximadamente 24 máquinas, con la esperanza de/para resolver algunos cálculos que actualmente están tomando demasiado tiempo (aproximadamente 26 horas en una máquina relativamente fuerte, que es práctica). Así que uno de mis colegas, y yo, hemos comenzado a investigar sobre informática paralela (ninguno de nosotros tiene experiencia en paralelismo; sin embargo, tenemos bastante buenos antecedentes, él de f66, comencé con F90, ambos trabajando con éxito con las características de 2003). – Friedrich

+0

hoy en día) tratando de aprender tanto como sea posible en modelos más simples antes de comprar el hardware. Tenemos relativamente mucha libertad en esto, con respecto a qué camino tomar, y el presupuesto (dentro de los medios razonables). Comencé con OpenMP no solo porque parecía algo más simple, sino también porque encontré un libro bastante bueno sobre él ("Parallel programming in OpenMP" de Chandra). Con todo esto conocido, ¿crees que quizás puedas ofrecer más consejos, ya que desde tu perfil, veo que eres bastante experimentado en este campo de la informática. La ventana de tiempo que tenemos es aproximadamente hasta el febrero del próximo año. – Friedrich

2

Como se dijo anteriormente, OpenMP es sin duda la forma más fácil de programar en comparación con MPI debido a la paralelización incremental. OpenMP se ha utilizado principalmente para el paralelismo de grano fino (nivel de bucle), mientras que MPI es más un paralelismo de grano grueso (descomposición de dominio). Ambas son buenas formas de obtener un rendimiento paralelo.

Tenemos versiones OpenMP y MPI de nuestro software (Fortran) y los Clientes las usan en función de sus necesidades.

Con las tendencias actuales en arquitectura multi-core, OpenMP-MPI híbrido es otro enfoque viable.