mpi - threads - openmp tutorial español
MPI vs openMP para una memoria compartida (4)
Con la mayoría de las plataformas de memoria distribuida que actualmente consisten en nodos SMP o NUMA, simplemente 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. Se consideraba exótico hace 10 años, pero ahora se está convirtiendo en la corriente principal de la computación de alto rendimiento.
En cuanto a la pregunta en sí, la respuesta correcta, dada la información proporcionada, siempre ha sido la misma: DEPENDE .
Digamos que hay una computadora con 4 CPU, cada una con 2 núcleos, por lo tanto, totalmente 8 núcleos. Con mi entendimiento limitado, creo que todos los procesadores comparten la misma memoria en este caso. Ahora, ¿es mejor usar directamente openMP o usar MPI para hacerlo general, de modo que el código pueda funcionar tanto en la configuración distribuida como en la compartida? Además, si uso MPI para una configuración compartida, ¿disminuiría el rendimiento en comparación con openMP?
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 pueden ser más rápidos.
Si alguna vez planea mudarse 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 en consecuencia.
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 que 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 ya no caben en la memoria de un solo nodo. Sin embargo, las operaciones que realiza en los datos son bastante rápidas, por lo que no necesita más potencia de cálculo.
En este caso, es probable que desee utilizar MPI e iniciar un proceso MPI en cada nodo, aprovechando al máximo la memoria disponible y limitando la comunicación al mínimo.
Ejemplo 2
Por lo general, tiene conjuntos de datos pequeños y solo desea acelerar su aplicación, que es computacionalmente pesada. Además, no desea dedicar mucho tiempo a pensar en la paralelización, sino a más algoritmos en general.
En este caso OpenMP es su primera opción. Solo necesita agregar algunas declaraciones aquí y allá (por ejemplo, frente a sus bucles para los que desea acelerar), y si su programa no es demasiado complejo, OpenMP hará el resto automáticamente.
Ejemplo 3
Lo quieres todo. Necesita más memoria, es decir, más nodos informáticos, pero también desea acelerar sus cálculos lo más posible, es decir, ejecutar en más de un núcleo por nodo.
Ahora su hardware entra en juego. Desde mi experiencia personal, si tiene solo 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 de OpenMP, etc.) es más que la sobrecarga de procesador interno Comunicación MPI (es decir, enviar mensajes MPI entre procesos que realmente comparten memoria y no necesitarían MPI para comunicarse).
Sin embargo, si está trabajando en una máquina con más núcleos por nodo (16+), será necesario utilizar un enfoque híbrido , es decir, paralelizar 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 el más difícil de codificar y mantener.
Resumen
Si tiene un problema que es lo suficientemente pequeño como para ejecutarse en un solo nodo, use OpenMP. Si sabe que necesita más de un nodo (y, por lo tanto, definitivamente necesita MPI), pero favorece la legibilidad / esfuerzo del código sobre el rendimiento, use solo MPI. Si el uso de MPI solo no le proporciona la aceleración que desea o necesita, debe 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 (ya que siempre se ejecutará en un solo nodo), use OpenMP ya que será más rápido. Pero si sabe que necesita 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.
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 puede tener los mismos datos replicados en la memoria (debido a que el proceso no puede compartir datos), puede sufrir la cancelación de la caché.
Por otro lado, si particiona sus datos correctamente, y cada procesador tiene una memoria caché privada, puede llegar a un punto en el que su problema se ajuste completamente a la memoria caché. En este caso tienes aceleraciones super lineales.
Al hablar en caché, hay una topología de caché muy diferente en los procesadores recientes, y siempre ha: DEPENDE ...