Paralelización automática
Paralelización automática : optimización del programa por parte del compilador , que consiste en convertirlo automáticamente en un formulario que se ejecuta en una computadora paralela , por ejemplo, en una máquina SMP o NUMA. El objetivo de automatizar la paralelización es liberar al programador del proceso lento y propenso a errores de la paralelización manual. A pesar de que la calidad de la paralelización automática ha mejorado en los últimos años, la paralelización completa de programas secuenciales sigue siendo una tarea demasiado difícil que requiere los tipos de análisis de programas más complejos.
El paralelizador automático generalmente se enfoca en construcciones de control como bucles que procesan matrices, ya que, en general, la mayor parte de la ejecución del programa tiene lugar dentro de bucles de algún tipo. El compilador paralelo intenta dividir el ciclo en partes para que sus iteraciones separadas puedan ejecutarse en diferentes procesadores al mismo tiempo.
Análisis de programas
Los compiladores analizan antes de realizar la paralelización para responder a las siguientes preguntas:
- ¿Es seguro paralelizar este ciclo? Se requiere un análisis de dependencia cuidadoso y un análisis de independencia de puntero o alias ( en:alias analysis ). Las iteraciones de bucle no deben tener dependencias de datos. [una]
- ¿Vale la pena paralelizar el bucle? [1] La respuesta a esta pregunta requiere una evaluación fiable (simulación) del funcionamiento del programa y teniendo en cuenta las propiedades del sistema paralelo.
Dificultades
La paralelización automática es difícil para los compiladores por las siguientes razones:
- El análisis de dependencia es difícil para el código que usa indirección , punteros, recursividad, llamadas a funciones [1] , especialmente llamadas por indirección (por ejemplo, funciones virtuales de una clase previamente desconocida).
- Los bucles pueden tener un número desconocido de iteraciones o un número complejamente variable de iteraciones. [1] Esto hace que sea más difícil seleccionar bucles que requieran paralelización.
- El acceso a recursos globales es difícil de coordinar en términos de asignación de memoria, E/S, variables compartidas.
Debido a la complejidad de la paralelización automática completa, existen varios enfoques para simplificarla:
- Ofrezca a los programadores la capacidad de agregar sugerencias de compilador al programa para influir en el proceso de paralelización (ya sea para simplificar los análisis al marcar los punteros como no superpuestos (restringir [1] ) o al especificar bucles "calientes"). Las soluciones que requieren instrucciones de compilación bastante detalladas incluyen High Performance Fortran para sistemas de memoria distribuida y OpenMP para sistemas de memoria compartida.
- Crear un sistema de compilación interactivo en el que participaría una persona. Dichos sistemas se crearon como parte del subproyecto SUIF Explorer (proyecto SUIF: compilador de formato intermedio de la Universidad de Stanford, http://suif.stanford.edu/ ), en compiladores Polaris y ParaWise (entorno CAPTools).
- Agregue subprocesos múltiples especulativos al hardware .
Primeros compiladores paralelizadores
Muchos de los primeros compiladores paralelizadores trabajaron con programas escritos en Fortran , debido a sus restricciones más estrictas sobre el alias de puntero en comparación con C. Además, una gran cantidad de programas de matemáticas computacionales están escritos en Fortran, lo que requiere grandes recursos para su trabajo. Ejemplos de compiladores:
- Compilador Rice Fortran D
- Compilador Viena Fortran
- compilador de paradigmas
- compilador polaris
- compilador SUIF
Compiladores modernos con soporte de paralelización
Véase también
- Optimización de anidamiento de bucles
- modelo de politopo
- Paralelismo escalable
- herramienta de paralelización automática
Notas
- ↑ 1 2 3 4 5 6 7 8 Patrick Lam. Clase 12. Hoy hablaremos sobre la paralelización automática (enlace no disponible) . ECE459: Programación para el rendimiento (10 de febrero de 2011). Consultado el 17 de noviembre de 2013. Archivado desde el original el 27 de mayo de 2015. (indefinido)
- ↑ 1 2 Robert van Engelen. Computación de alto rendimiento y computación científica . HPC @ Universidad Estatal de Florida (3 de octubre de 2012). Consultado el 17 de noviembre de 2013. Archivado desde el original el 27 de mayo de 2015. (indefinido)
Enlaces