MPI vs OpenMP para una memoria compartida


Digamos que hay una computadora con 4 CPU cada una con 2 núcleos, por lo que totalmente 8 núcleos. Con mi comprensión limitada creo que todos los procesadores comparten la misma memoria en este caso. Ahora, es mejor usar OpenMP directamente o usar MPI para hacerlo general para que el código pueda funcionar tanto en configuraciones distribuidas como compartidas. Además, si uso MPI para una configuración compartida, ¿disminuiría el rendimiento en comparación con OpenMP?

Author: Shibli, 2012-07-04

4 answers

Con la mayoría de las plataformas de memoria distribuida hoy en día que consisten en nodos SMP o NUMA, no tiene sentido no usar OpenMP. OpenMP y MPI pueden funcionar perfectamente juntos; OpenMP alimenta los núcleos en cada nodo y MPI se comunica entre los nodos. Esto se llama programación híbrida. Fue considerado exótico hace 10 años, pero ahora se está convirtiendo en la corriente principal en la Computación de Alto Rendimiento.

En cuanto a la pregunta en sí, la respuesta correcta, dada la información proporcionada, siempre ha ha sido uno y el mismo: DEPENDE .

 28
Author: Hristo Iliev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 19:33:09

Si necesita o desea MPI o OpenMP (o ambos) depende en gran medida del tipo de aplicación que esté ejecutando, y si su problema está principalmente vinculado a la memoria o a la CPU (o ambos). Además, depende del tipo de hardware en el que se esté ejecutando. Algunos ejemplos:

Ejemplo 1

Necesita paralelización porque se está quedando sin memoria, por ejemplo, tiene una simulación y el tamaño del problema es tan grande que sus datos no caben en la memoria de un solo nodo más. Sin embargo, las operaciones que realiza en los datos son bastante rápidas, por lo que no necesita más potencia computacional.

En este caso, probablemente desee usar MPI e iniciar un proceso MPI en cada nodo, haciendo así el máximo uso de la memoria disponible y limitando la comunicación al mínimo.

Ejemplo 2

Normalmente tiene conjuntos de datos pequeños y solo desea acelerar su aplicación, que es computacionalmente pesada. Además, usted no quiere pasar mucho tiempo pensando en la paralelización, pero más sus algoritmos en general.

En este caso OpenMP es su primera opción. Solo necesita agregar algunas instrucciones aquí y allá (por ejemplo, delante de sus bucles for que desea acelerar), y si su programa no es demasiado complejo, OpenMP hará el resto por usted automáticamente.

Ejemplo 3

Lo quieres todo. Necesita más memoria, es decir, más nodos de computación, pero también quiere acelerar aumente sus cálculos tanto como sea posible, es decir, que se ejecute en más de un núcleo por nodo.

Ahora tu hardware entra en juego. Desde mi experiencia personal, si solo tiene unos pocos núcleos por nodo (4-8), la penalización de rendimiento creada por la sobrecarga general de usar OpenMP (es decir, iniciar los subprocesos OpenMP, etc.).) es más que la sobrecarga de la comunicación MPI interna del procesador (es decir, enviar mensajes MPI entre procesos que realmente comparten memoria y no necesitan MPI para comunicar).
Sin embargo, si está trabajando en una máquina con más núcleos por nodo (16+), será necesario usar un enfoque híbrido, es decir, paralelización con MPI y OpenMP al mismo tiempo. En este caso, la paralelización híbrida será necesaria para hacer un uso completo de sus recursos computacionales, pero también es la más difícil de codificar y mantener.

Resumen
Si tiene un problema lo suficientemente pequeño como para ejecutarse en un solo nodo, utilice OpenMP. Si sabe que necesita más de un nodo (y por lo tanto definitivamente necesita MPI), pero prefiere la legibilidad/esfuerzo del código sobre el rendimiento, use solo MPI. Si usar solo MPI no te da la velocidad que deseas / requieres, tienes que hacerlo todo e ir híbrido.

A su segunda pregunta (en caso de que no quede claro):
Si la configuración es tal que no necesita MPI en absoluto (porque siempre se ejecutará en un solo nodo), use OpenMP ya que será más rápido. Pero si sabes que necesitas MPI de todos modos, comenzaría con eso y solo agregaría OpenMP más tarde, cuando sepa que ha agotado todas las opciones de optimización razonables para MPI.

 48
Author: Michael Schlottke-Lakemper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-05 13:01:44

Para usar en una sola máquina de memoria compartida como esa, recomendaría OpenMP. Hace que algunos aspectos del problema sean más simples y podría ser más rápido.

Si alguna vez planea moverse a una máquina de memoria distribuida, use MPI. Te ahorrará resolver el mismo problema dos veces.

La razón por la que digo que OpenMP podría ser más rápido es porque una buena implementación de MPI podría ser lo suficientemente inteligente como para detectar que se está utilizando en un entorno de memoria compartida y optimizar su comportamiento consecuentemente.

 4
Author: Hbcdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-04 15:42:16

Solo para una imagen más grande, la programación híbrida se ha vuelto popular porque OpenMP se beneficia de la topología de caché, al usar el mismo espacio de direcciones. Como MPI podría tener los mismos datos replicados en la memoria (porque el proceso no puede compartir datos) podría sufrir de cancelación de caché.

Por otro lado, si particiona sus datos correctamente, y cada procesador tiene una caché privada, podría llegar a un punto en el que su problema encajara completamente en la caché. En este caso tienes super lineal aceleraciones.

Al hablar en caché, hay una topología de caché muy diferente en los procesadores recientes, y siempre tiene: DEPENDE...

 3
Author: RSFalcon7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-04 21:30:42