Compilation techniques for automatic extraction of parallelism and locality in heterogeneous architectures

La computacion de altas prestaciones se ha convertido en un habilitador clave para la innovacion en la ciencia y la industria. Este hecho ha propiciado una demanda continua de mas poder computacional que la industria del silicio ha satisfecho con arquitecturas paralelas y heterogeneas, y jerarquias de memoria complejas. Como consecuencia, los desarrolladores de software han sido desafiados a escribir codigos nuevos y reescribir los antiguos para que sean eficientes en estos nuevos sistemas. Desafortunadamente, los casos de exito son escasos y requieren inversiones enormes en fuerza de trabajo. Los compiladores actuales generan codigo binario con rendimiento maximo en las arquitecturas mononucleo. Siguiendo esta victoria, esta tesis explora nuevas ideas en el diseno de compiladores para superar este reto con la extraccion automatica de paralelismo y localidad. En primer lugar, presentamos una nueva representacion intermedia de compilador basada en diKernels denominada KIR, la cual es insensible a variaciones sintacticas en el codigo de fuente y expone multiples niveles de paralelismo. Sobre la KIR, construimos una aproximacion fuente-a-fuente que genera codigo paralelo anotado con directivas: OpenMP para multinucleos y OpenHMPP para GPUs. Finalmente, modelamos el comportamiento del programa desde el punto de vista de los accesos de memoria a traves de la reconstruccion de bucles afines para codigos secuenciales y paralelos. Las evaluaciones experimentales a lo largo de la tesis corroboran la efectividad y eficacia de las soluciones propuestas.