Perspectiva historica
Es realmente imposible decir cómo serán los nuevos paradigmas en el futuro, por ejemplo, una buena perspectiva histórica. Sugiero leer El ascenso y la caída de HPF de Ken Kennedy . Kennedy da cuenta de dos patrones emergentes, MPI versus un compilador inteligente, y detalla cómo MPI tuvo la cantidad correcta de primeros usuarios y flexibilidad para dominar. HPF finalmente solucionó sus problemas, pero ya era demasiado tarde.
En muchos sentidos, varios paradigmas, como PGAS y OpenMP, siguen la misma tendencia de HPF. Los primeros códigos no han sido lo suficientemente flexibles como para usarlos bien y dejaron mucho rendimiento sobre la mesa. Pero la promesa de no tener que escribir cada ápice del algoritmo paralelo es un objetivo atractivo. Por lo tanto, siempre se persigue la búsqueda de nuevos modelos.
Tendencias claras en hardware
Ahora, el éxito de MPI a menudo se ha citado como estrechamente vinculado a cómo modela el hardware en el que se ejecuta. Aproximadamente cada nodo tiene un número reducido de procesos y pasar los mensajes a un punto local a través de operaciones colectivas coordinadas se realiza fácilmente en el espacio del clúster. Debido a esto, no confío en nadie que ofrezca un paradigma que no siga de cerca las nuevas tendencias de hardware, de hecho, el trabajo de Vivak Sarakar me convenció de esta opinión .
De acuerdo con esto, aquí hay tres tendencias que claramente están avanzando en nuevas arquitecturas. Y déjenme ser claro, ahora hay doce arquitecturas diferentes que se comercializan en HPC. Esto es inferior a hace menos de 5 años con solo x86, por lo que los próximos días verán muchas oportunidades para usar hardware de maneras diferentes e interesantes
- Fichas de propósito especial: piense en grandes unidades vectoriales como aceleradores (vista expuesta por Bill Dally de Nvidia)
- Chips de baja potencia: grupos basados en ARM (para acomodar los presupuestos de potencia)
- Mosaico de chips: piense en el mosaico de chips con diferentes especificaciones (trabajo de Avant Argwal )
Modelos actuales
El modelo actual tiene en realidad 3 niveles de profundidad. Si bien hay muchos códigos que usan bien dos de estos niveles, no muchos han surgido usando los tres. Creo que para llegar al exascale primero hay que invertir en determinar si su código puede ejecutarse en los tres niveles. Este es probablemente el camino más seguro para iterar bien con las tendencias actuales.
Permítanme repetir los modelos y cómo deberán cambiar según las nuevas vistas de hardware predichas.
Repartido
Los jugadores en el nivel distribuido caen principalmente en los lenguajes MPI y PGAS. MPI es un claro ganador en este momento, pero los lenguajes PGAS como UPC y Chapel están avanzando en el espacio. Una buena indicación es el HPC Benchmark Challenge. Los lenguajes PGAS están dando implementaciones muy elegantes de los puntos de referencia.
El punto más interesante aquí es que si bien este modelo actualmente solo funciona a nivel de nodo, será un modelo importante dentro de un nodo para arquitecturas en mosaico. Una indicación es el chip Intel SCC, que actuó fundamentalmente como un sistema distribuido. El equipo de SCC creó su propia implementación de MPI y muchos equipos lograron portar bibliotecas comunitarias a esta arquitectura.
Pero para ser honesto, PGAS realmente tiene una buena historia para entrar en este espacio. ¿Realmente quieres programar el entrenudo MPI y luego tienes que hacer el mismo truco intranodo? Un gran problema con estas arquitecturas en mosaico es que tendrán diferentes velocidades de reloj en los chips y grandes diferencias en el ancho de banda de la memoria, por lo que los códigos de rendimiento deben tener esto en cuenta.
Memoria compartida en el nodo
Aquí vemos que MPI a menudo es "suficientemente bueno", pero los PThreads (y las bibliotecas derivadas de PThreads como Intel Parallel Building Blocks) y OpenMP todavía se usan con frecuencia. La opinión común es que habrá un momento en que haya suficientes subprocesos de memoria compartida para que el modelo de socket de MPI se descomponga para RPC o necesite un proceso más liviano ejecutándose en el núcleo. Ya puede ver las indicaciones de los sistemas IBM Bluegene que tienen problemas con la memoria compartida MPI.
Como comenta Matt, el mayor impulso de rendimiento para los códigos intensivos de cómputo es la vectorización del código de serie. Si bien muchas personas suponen que esto es cierto en los aceleradores, también es fundamental para las máquinas en el nodo. Creo que Westmere tiene una FPU de 4 de ancho, por lo que solo se puede obtener una cuarta parte de los flops sin vectorización.
Si bien no veo el OpenMP actual entrando bien en este espacio, hay un lugar para que los chips de baja potencia o de mosaico utilicen más hilos de luz. OpenMP tiene dificultades para describir cómo funciona el flujo de datos y, a medida que se usan más subprocesos, solo veo que esta tendencia se vuelve más exagerada, solo mire ejemplos de lo que uno tiene que hacer para obtener una captación previa adecuada con OpenMP.
Tanto OpenMP como PThreads en un nivel de curso suficiente pueden aprovechar la vectorización necesaria para obtener un buen porcentaje de pico, pero hacerlo requiere desglosar sus algoritmos de manera que la vectorización sea natural.
Coprocesador
Finalmente, la aparición del coprocesador (GPU, MIC, acumuladores de células) se ha establecido. Cada vez está más claro que ningún camino hacia exascale estará completo sin ellos. En SC11, cada contendiente del premio Bell los utilizó de manera muy efectiva para llegar a los petaflops bajos. Si bien CUDA y OpenCL han dominado el mercado actual, tengo esperanzas de que los compiladores de OpenACC y PGAS entren al espacio.
Ahora para llegar a exascale, una propuesta es acoplar los chips de baja potencia a muchos coprocesadores. Esto eliminará la capa intermedia de la pila actual y usará códigos que manejan problemas de decisión en el chip principal y eliminan el trabajo a los coprocesadores. Esto significa que para que el código funcione de manera bastante efectiva, una persona debe repensar los algoritmos en términos de núcleos (o codelets), es decir, fragmentos de nivel de instrucción sin ramificaciones. Hasta donde yo sé, una solución a esta evolución está bastante abierta.
Cómo afecta esto al desarrollador de la aplicación
Ahora para llegar a tu pregunta. Si desea protegerse de las complejidades inminentes de las máquinas exascale, debe hacer algunas cosas:
- Desarrolle sus algoritmos para que se ajusten al menos a tres niveles de jerarquía paralela.
- Diseñe sus algoritmos en términos de núcleos que se pueden mover entre la jerarquía.
- Relaje su necesidad de procesos secuenciales, todos estos efectos sucederán de forma asincrónica porque la ejecución sincrónica simplemente no es posible.
Si quiere ser eficaz hoy, MPI + CUDA / OpenCL es lo suficientemente bueno, pero UPC está llegando allí, por lo que no es una mala idea tomarse unos días y aprenderlo. OpenMP te permite comenzar, pero genera problemas una vez que el código necesita ser refactorizado. PThreads requiere reescribir completamente su código a su estilo. Lo que hace que MPI + CUDA / OpenCL sea el mejor modelo actual.
Lo que no se discute aquí
Si bien toda esta charla sobre exascale es agradable, algo que no se discute realmente aquí es la entrada y salida de datos de las máquinas. Si bien ha habido muchos avances en los sistemas de memoria, no los vemos en el clúster de productos básicos (demasiado caro). Ahora que la computación con uso intensivo de datos se está convirtiendo en un foco principal de todas las conferencias de supercomputación, es probable que haya un mayor movimiento hacia el espacio de ancho de banda de memoria alta.
Esto lleva a la otra tendencia que podría suceder (si se involucran las agencias de financiación adecuadas). Las máquinas se volverán cada vez más especializadas para el tipo de computación requerida. Ya vemos máquinas "intensivas en datos" financiadas por la NSF, pero estas máquinas están en una pista diferente a la del Exascale Grand Challenge 2019.
Esto se hizo más largo de lo esperado, solicite referencias donde las necesite en los comentarios