F A C U L T A D D E U C V C I E N C I A S OPTIMIZACIÓN DEL RENDIMIENTO DE LOS PROGRAMAS Tema 3 – Clases 4 PROCESADOR SUPERESCALAR ¢ Un procesador superescalar puede emitir y ejecutar múltiples instrucciones en un ciclo. ¢ Las instrucciones se extraen de un flujo secuencial de instrucciones y son generalmente programadas dinámicamente. 2 LA MEJORA DEL PARALELISMO Si las cosas no se pueden hacer más deprisa, entonces hacer más cosas a la vez ¢ Paralelismo: Conjunto de tareas independientes entre sí que son susceptibles de ser llevadas a cabo de forma simultánea. 3 LA MEJORA DEL PARALELISMO Paralelismo implicito: ¢ Se usa un lenguaje de programación secuencial y el compilador inserta las instrucciones necesarias para ejecutar el programa en un computador paralelo ¢ El compilador tiene que realizar y comprender las dependencias para asegurar un mapeo eficiente en el computador paralelo ¢ Pequeño aprovechamiento (depende de la eficacia del computador) ¢ El trabajo del programador es fácil ¢ Aprovecha todo el código secuencial existente 4 LA MEJORA DEL PARALELISMO Paralelismo explícito: ¢ El algoritmo paralelo dede especificar explíctamente cómo cooperan los procesadores para resolver un problema especifico ¢ La tarea del compilador es sencilla, en cambio la del programador es bastante difícial ¢ Mejor aprovechamiento de las posibilidades paralelas de la máquina ¢ Más trabajo para el programador 5 MULTIPLES ACUMULADORES ¢ No podemos calcular el nuevo valor de una variable que estamos usando como acumulador si todavia no hemos realizado el calculo Ej. En un bucle tenemos un una variable i++ ¢ En una combinación de operaciones que son asociativas y commutativas tal como la suma o multiplicación de enteros. Podemos mejorar el desempeño dividiendo la operación es dos más partes. 6 MULTIPLES ACUMULADORES Ejemplo: ¢ Pn es el resultado de la multiplicaión de los elementos a0, a1, …, an ¢ ¿Qué podemos hacer para mejorar esta operación? ¢ Si n es par podemos Pn = PE x PO ¢ Si n es impar podemos 7 OPTIMIZACIÓN (REVISANDO { } EL EJEMPLO) /* Implementation with maximum use of data abstraction */ void combine1(vec_ptr v, data_t *dest) long int I; *dest = IDENT; for (i = 0; i < vec_length(v); i++) { data_t val; get_vec_element(v, i, &val); *dest = *dest OP val; } ¢ Ejemplo de programa a optimizar, dentro del programa se definen las siguientes constantes ¢ Para la suma ¢ #define IDENT 0 #define OP + Para la multiplicaión #define IDENT 1 #define OP * 8 DESENROLLADO DE BUCLE PARALELO ¢ En este caso /* Unroll loop by 2 */ " void combine5(vec_ptr v, data_t *dest) " tenemos solo el { " long int i; " desenrollado de long int length = vec_length(v); " bucle usando un long int limit = length-1; " data_t *data = get_vec_start(v); " “acc” data_t acc = IDENT; " " /* Combine 2 elements at a time */ " for(i=0;i<limit;i+=2){ " "acc = (acc OP data[i]) OP data[i+1]; " } " " /* Finish any remaining elements */ " for (; i < length; i++) { " "acc = acc OP data[i]; " } " *dest = acc; " } " 9 DESENROLLADO DE BUCLE PARALELO ¢ /* Unroll loop by 2, 2-way parallelism */ " void combine6(vec_ptr v, data_t *dest) " { " long int i; " long int length = vec_length(v); " long int limit = length-1; " data_t *data = get_vec_start(v); " data_t acc0 = IDENT; " data_t acc1 = IDENT; " " /* Combine 2 elements at a time */ " for(i=0;i<limit;i+=2){ " "acc0 = acc0 OP data[i]; " "acc1 = acc1 OP data[i+1]; " } " " /* Finish any remaining elements */ " for (; i < length; i++) { " "acc0 = acc0 OP data[i]; " } " *dest = acc0 OP acc1; " } " En este caso tenemos el desenrollado de bucle y estamos usando dos “acc” 10 REASOCIACIÓN acc = (acc OP data[i]) OP data[i+1]; " acc = acc OP (data[i] OP data[i+1]); " ¢ Podemos con solo cambiar el orden de los parentesis mejorar el desempeño. 11 REASOCIACIÓN /* Change associativity of combining operation */ " void combine7(vec_ptr v, data_t *dest) " { " long int i; " long int length = vec_length(v); " long int limit = length-1; " data_t *data = get_vec_start(v); " data_t acc = IDENT; " " /* Combine 2 elements at a time */ " for(i=0;i<limit;i+=2){ " "acc = acc OP (data[i] OP data[i+1]); " } " " /* Finish any remaining elements */ " for (; i < length; i++) { " "acc = acc OP data[i]; " } " *dest = acc; " } " ¢ En este caso desplazamos los parentesis dentro del bucle y asi combinamos los vectores y el resultado 12 RESUMEN Funcion Pag. Metodo Int + Int * F+ F* sp F* dp combine1 485 -01 12,00 12,00 12,00 12,01 13,00 combine2 486 Move vec_length 8,03 8,09 10,09 11,09 12,08 combine3 491 Direct data access 6,01 8,01 10,01 11,01 12,02 combine4 493 Accumulate in temporary 2,00 3,00 3,00 4,00 5,00 combine5 510 Unroll by x2 2,00 1,50 3,00 4,00 5,00 combine6 515 Unroll by x2, parallelism x2 1,50 1,50 1,50 2,00 2,50 13 TAXONOMÍA DE FLYNN ¢ Es una clasificación de arquitecturas de computadoras propuesta por Michael J. Flynn en 1972. ¢ Las cuatro clasificaciones definidas por Flynn se basan en el número de instrucciones concurrentes (control) y en los flujos de datos disponibles en la arquitectura. 14 TAXONOMÍA DE FLYNN ¢ SISD (Single Instruction, Single Data): Un flujo de instrucciones único trabaja sobre flujo de datos único. Computador secuencial que no explota el paralelismo en las instrucciones ni en flujos de datos. Ejemplos de arquitecturas SISD son las máquinas con una arquitectura clásica monoprocesador, como el PC o los antiguos mainframe. 15 TAXONOMÍA DE FLYNN ¢ SIMD (Single Instruction, Multiple Data): Un flujo de instrucciones único trabaja sobre un flujo de datos múltiple. Un computador que explota varios flujos de datos dentro de un único flujo de instrucciones para realizar operaciones que pueden ser paralelizadas de manera natural. 16 TAXONOMÍA DE FLYNN ¢ MISD (Multiple Instruction, Single Data): Un flujo de instrucciones múltiple trabaja sobre un flujo de datos único. Es poco común debido al hecho de que la efectividad de los múltiples flujos de instrucciones suele precisar de múltiples flujos de datos. 17 TAXONOMÍA DE FLYNN ¢ MIMD (Multiple Instruction, Multiple Data): Un flujo de instrucciones múltiple trabaja sobre un flujo de datos múltiple (multiprocesadores). Es decir, varios procesadores autónomos que ejecutan simultáneamente instrucciones diferentes sobre datos diferentes. 18 PARALELISMO DE DATOS ¢ Aplicaciones en las que los datos están sujetos a idéntico procesamiento ¢ Es más apropiado para ejecutar en máquinas SIMD ¢ También se pueden ejecutar en computadores MIMD. Se requiere sincronización global después de cada instrucción, lo que resulta en un código ineficiente. ¢ Los lenguajes de paralelismo de datos ofrecen contrucciones de alto nivel para compartir infromación y manejar concurrencia. Programas más fáciles de escribir y comprender. Aunque el código generado por estas construcciones no es tan eficiente como el obtenido usando primitivas debajo nivel. 19 PARALELISMO DE INSTRUCCIONES ¢ Ejecución simultánea de cadenas de instrucciones diferentes. Las instrucciones se pueden aplicar sobre la misma cadena de datos aunque normalmente se aplican a cadenas de datos diferentes. ¢ Adecuados para mapear en MIMD ya que el paralelismo de instrucciones requiere múltiples cadenas de instrucciones 20 FACTORES LIMITANTES ¢ Los beneficios que obtenemos al usar paralelismo de bucles son limitados por la cantidad de registros que tenemos. ¢ Si se excede la cantidad de registros a utilizar, el compilador recurre temporalmente a la pila. Esto puede bajar significativamente el desempeño. 21 SALTOS ¢ La predicción de saltos trae riegos. ¢ Las instrucciones se ejecutan siguiendo una simple secuencia cuando se encuntra un salto el procesador debera adivinar que camino debe escoger. 22 RECOMENDACIÓN ¢ Revisar la Bibliografía “Computer Systems A Programmer’s Perspective” de “Bryant - O’Hallaron ” ¢ Revisar el sitio web de la materia para ver las actualizaciones publicadas, clases y la planificación establecida. http://oeci.servehttp.com/ ¢ Repasar la información suministrada en clase antes de asistir a la clase de práctica. 23