Paralelización automáticaParalelización automática, también auto paralelización, autoparalelización, o paralelización, se refiere a convertir código secuencial en multihilo o vectorizado (o los dos) con objeto de utilizar múltiples procesadores simultáneamente en una máquina con multiprocesador (SMP) de memoria compartida. La utilidad de la paralelización automática es liberar a los programadores del proceso tedioso y tendente a errores de la paralelización manual. Aunque la calidad de la automatización paralela ha mejorado en las últimas décadas, una paralelización automática completa de programas secuenciales por un compilador sigue siendo un gran reto, ya que necesita de un complejo análisis informático, y a los factores desconocidos(como el rango de los datos de entrada) durante la compilación.[1] Las estructuras de control de programación en las que la autoparalelización se centra son los bucles, ya que, en general, la mayor parte del tiempo de ejecución de un programa tiene lugar en el interior de algún bucle. Un compilador paralelo intenta dividir un bucle de forma que sus iteraciones puedan ser ejecutadas en microprocesadores separados de forma concurrente. Análisis de la compilación paralelaEl compilador realiza normalmente dos ciclos de análisis antes de una paralelización para determinar lo siguiente:
En el primer paso el compilador realiza un análisis de dependencias del bucle para determinar si cada iteración del bucle puede ejecutarse de forma independiente a las demás. La dependencia de datos puede tratarse a veces mediante paso de mensajes, sincronización de memoria compartida, o algún otro método de comunicación entre procesadores, pero puede incrementar la sobrecarga. El segundo paso intenta justificar el esfuerzo de paralelización, comparando el tiempo teórico de ejecución del código paralelizado con el tiempo de ejecución del código secuencial. Aunque parece contraproducente, el código no siempre se beneficia de la ejecución paralela. La carga de trabajo extra que se puede asociar al uso de múltiples procesadores puede anular el posible incremento de velocidad de ejecución del código paralelo. EjemploEl código Fortran que aparece a continuación puede ser auto-paralelizado por un compilador porque cada iteración es independiente de las demás, y el resultado final del vector do i=1, n
z(i) = x(i) + y(i)
enddo
Por otro lado, el siguiente código no puede ser auto-paralelizado, porque el valor de do i=2, n
z(i) = z(i-1)*2
enddo
Esto no significa que no pueda ser paralelizado. De hecho, es equivalente a do i=2, n
z(i) = z(1)*2**(i-1)
enddo
Sin embargo, los compiladores paralelos actuales no son capaces de conseguir estas paralelizaciones de forma automática, y es cuestionable que este código pueda beneficiarse de la paralelización. DificultadesLa paralelización automática de los compiladores o herramientas es muy compleja debido a las siguientes causas:
SolucionesDebido a las dificultades inherentes a la paralelización automática completa, existen varias aproximaciones más sencillas para conseguir un programa paralelo de más calidad, como son:
Compiladores paralelos históricosLa mayoría de las investigadores en compiladores para la paralelización automática prefieren los programas Fortran,[cita requerida] porque Fortran ofrece mayores garantías sobre aliasing que otros lenguajes como C. Ejemplos típicos son:
Véase tambiénReferencias
|