Optimización de Software

Slides:



Advertisements
Presentaciones similares
Arquitectura RISC & CISC y DSP
Advertisements

Capítulo I Gestión de E/S 1.- Gestión de E/S 2.- Hardware de E/S 3.- Software de E/S.
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Optimización de Software (segunda parte)
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Complejidad Computacional
Complejidad Computacional
Inteligencia Artificial
UNIVERSIDAD DEL VALLE DE MEXICO CAMPUS CHAPULTEPEC
Estrella 0 - Fundamentos de la Programación
SISTEMAS OPERATIVOS GESTION DE MEMORIA INTEGRANTES Lizeth Chandi
Sistema operativo Componentes de un sistema operativo
III - Gestión de memoria
CLASE 3 SOFTWARE DEL MICROPROCESADOR
Memoria Cache.
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
3.4.- Administración de Memoria Virtual.
PROCESADORES SUPERESCALARES
Programación I Teoría III
Las estructuras de arreglos fueron usadas en las primeras computadoras digitales, cuando la programación se hacía todavía en lenguaje máquina, para tablas.
Introducción a los Sistemas Operativos Memoria Virtual
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
Funcionamiento, programación
UNIVERSIDAD LATINA (UNILA) IV. IMPLANTACION DE ALGORITMOS.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Tema II Unidad de memoria. 2 Unidad de memoria 2.1 Definiciones y conceptos básicos Localización Capacidad Unidad de transferencia
3. INTRODUCCIÓN A LA PROGRAMACIÓN
Windows XP sp3.
Johanna Lizeth Rodríguez Lorena Fda. Chávarro Ramos
Arquitectura de Conjunto de Instrucciones (ISA)
¿Qué es un algoritmo? “(del árabe al-Khowârizmî, sobrenombre del célebre matemático árabe Mohámed ben Musa). Conjunto ordenado y finito de operaciones.
Tema 3. Optimización de Código
Gustavo Andrés Uribe Gómez
Direcciones físicas y direcciones virtuales (lógicas)
HILOS Y COMUNICACIÓN ENTRE PROCESOS
Tema 10: Gestión de Memoria
Organización del Computador I Verano MIPS (1 de 2) Basado en el capítulo 3 del libro de Patterson y Hennessy Verano 2004 Profesora Borensztejn.
Introducción al análisis de algoritmos
Estructura y Tecnología de Ordenadores Noviembre 2004.
Administración de Memoria Memoria Virtual
SOFTWARE DE PROGRAMACIÓN
Memoria Cachés. Universidad de SonoraArquitectura de Computadoras2 Introducción Caché es el nivel de memoria situada entre el procesador y la memoria.
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Overview Sistemas Computacionales
Asignación de Espacio No Contiguo
Administración de Memoria
Tipos de Datos. Entrada-Salida.. La entrada-salida (I/O) le permite a un programa comunicarse con el mundo exterior. Esta comunicación puede realizarse.
Programación Lineal Entera Antonio H. Escobar Z Universidad Tecnológica de Pereira – Colombia Posgrado en Ingeniería Maestría en Ingeniería Eléctrica.
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 21 La mayor parte del contenido de estas láminas, ha sido extraído del libro Computer Organization and.
Memoria virtual.
Gestión de Memoria.
Estructura de los Sistemas Operativos
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
Gestión de Memoria.
ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 20 La mayor parte del contenido de estas láminas, ha sido extraído del libro Computer Organization and.
Rendimiento de la CPU y sus factores
ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 10.
Principio unidad 1.
Introducción a los TADs
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
SOFTWARE DE COMPUTADORAS
Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Memoria Virtual Concepto Paginado bajo demanda Performance del Paginado bajo.
Diccionario/Directorio de Datos
Gestión de Memoria – Parte 2
Arquitectura de Computadores Clase 18 Memoria Caché: Fundamentos IIC 2342 Semestre Rubén Mitnik Pontificia Universidad Católica de Chile Escuela.
Planificación de CPU Conceptos Básicos Criterios de Planificación Algoritmos de Planificación Planificación con Múltiples Procesadores Planificación Real-Time.
P ROCESO DE E NSAMBLADO Cámara Vázquez Berenice Rubí.
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) IV. IMPLANTACION DE ALGORITMOS.
1/50 Ing. Gerardo Chávez Malpartida Administración de Memoria SISTEMAS OPERATIVOS.
Transcripción de la presentación:

Optimización de Software 66.20 Organización de Computadoras

Introducción Optimizar la performance significa: Minimizar el tiempo de ejecución. Minimizar los requerimientos de memoria. Minimizar el consumo de energía. Se buscan optimizaciones: Conservadoras (no alteran la lógica del programa). Que no empeoren otros casos.

¿Quién optimiza? El usuario (programador), conociendo los detalles de la arquitectura de base. El compilador, con diferentes niveles de agresividad (-O0, -O1, -O2, etc.). Ambos están limitados a ciertas optimizaciones.

Tiempos de Ejecución Interesan para determinar si una optimización puede ser factible. Algunos lenguajes poseen herramientas elementales (e.g., función clock() de ANSI C). Algunos procesadores brindan facilidades para medir tiempos. Existen herramientas para este fin (profilers).

Herramientas de Profiling Un profiler es una herramienta para análisis de performance. Mide la ejecución de un programa y recoge información estadística. Reporta la duración y frecuencia de llamada a rutinas. Una de las técnicas más usadas es la instrumentación de código (estática o dinámica). Algunos de los más usados: Gprof, Valgrind y JProbe.

Tipos de Optimizaciones Locales. Aplican localmente a un procedimiento individual. (a.k.a., “intraprocedurales”) Globales. Aplican globalmente a varios procedimientos. (a.k.a., “interprocedurales”)

Optimizaciones Locales Asignación de registros. Eliminación de código inalcanzable y código muerto. Plegado y propagación de constantes. Reducción del costo de operaciones. Optimización de bucles.

Optimización Local #1: Asignación de Registros Implica determinar qué variables deberían estar en registros en cada instante de la ejecución. Los registros de CPU son un recurso escaso. Se busca minimizar el tráfico entre los registros y la memoria (spilling). Optimización de bajo nivel (poco puede hacer el programador).

Asignación de Registros (cont.) Lenguajes C/C++ ofrecen el modificador register “Aconseja” al compilador mantener una determinada variable en un registro del procesador. El compilador podría ignorarlo.

Asignación de Registros (cont.)

Optimización Local #2: Eliminación de Código … A las instrucciones que nunca se ejecutan se las denomina código inalcanzable. A las instrucciones que no producen efectos en el resultado, se las denomina código muerto. Generan código de máquina que ocupa espacio en la memoria caché de instrucciones. Código muerto Código inalcanzable

Optimización Local #3: Plegado y Propagación de Ctes. Plegado de constantes (constant folding): evaluación de expresiones con múltiples constantes. Propagación de constantes (constant propagation): reemplazo de una variable por una constante. Sin optimizar Optimizado

Optimización Local #4: Reducción del Costo de Op. Reemplazar multiplicación o división entera por operaciones de desplazamiento. Reemplazar la multiplicación por una constante pequeña por sumas.

Optimización Local #5: Optimización de Bucles Optimización de la variable de control. Cuando el cómputo es lineal respecto a la variable de inducción.

Optimización de Bucles (cont.) Extracción de estructuras condicionales. Los branches reducen la performance porque interfieren el pipeline. Aplicable por el programador.

Optimización de Bucles (cont.) Pelado de bucles (loop peeling). Se extrae el manejo de condiciones de borde. Aplicable por el programador (ya que es compleja).

Optimización de Bucles (cont.) Desenrollado de bucles. Alivia el costo relacionado al control del bucle. Facilita la aplicación de otros tipos de optimizaciones. No desenrollado Desenrollado en un factor de 10

Optimización de Bucles (cont.) Promoción de código invariante. Código invariante es aquel que no cambia entre iteraciones del bucle que lo contiene. Código invariante

Optimización de Bucles (cont.) Fusión de bucles. Los bucles deben tener el mismo espacio de iteraciones. Aplicable por el programador (ya que es compleja).

Tipos de Optimizaciones Locales. Aplican localmente a un procedimiento individual. (a.k.a., “intraprocedurales”) Globales. Aplican globalmente a varios procedimientos. (a.k.a., “interprocedurales”)

Optimización Global #1: Expansión en Línea (inlining) Reemplaza la llamada por el cuerpo de la rutina. Reduce el costo en llamadas a procedimientos (sobre todo si son pequeños y de uso frecuente). Como contra, genera binarios grandes, lo cual puede perjudicar la localidad en la caché de instrucciones. En general, se hace a nivel de compilador.

Expansión en Línea (inlining) (cont.) En ANSI C, utilizando la directiva __inline__ y compilando con optimización nivel 1 (-O1). Sin optimizar Optimizado ¿Qué otra optimización está aplicando?

Regla de Oro….. …no subestimar la posibilidad de cambiar el algoritmo. Ganancias muy importantes. No puede realizarlo el compilador. Busca reducir el orden de complejidad. En ocasiones, solo se reduce la cant. de operaciones. Ejemplo: Ordenamiento RADIX. RADIX-2 con complejidad 5 x N x log2 N RADIX-4 con complejidad 4.25 x N x log2 N RADIX-4 reduce en un 15% el número de operaciones

Jerarquías de Memoria La memoria incrementa su velocidad en un 10% a 20% anual. El procesador lo hace en un 50% anual. La brecha creciente la compensan las memorias caché.

Jerarquías de Memoria (cont.) Las memorias caché capturan la localidad espacial y temporal de datos e instrucciones. En algunos procesadores, están separadas (I-cache y D-cache). Organizaciones típicas: Correspondencia Directa (Direct Mapped) Asociativa por Conjunto, de k vías (k-Way Set Associative). Completamente Asociativa (Fully Associative).

Jerarquías de Memoria (cont.) La organización de correspondencia directa sufre de thrashing. El esquema asociativo por conjunto lo reduce o elimina.

Optimizaciones de la Jerarquía de Memoria Lectura adelantada (prefetching) de datos e instrucciones. Reemplazo de elementos de arreglos por escalares. Intercambio de bucles. Operación en bloques. Rellenado de arreglos (array padding). Reducción de solapamiento (aliasing).

Optimización de Memoria #1: Lectura Adelantada (prefetching) Especula con los accesos futuros a datos e instrucciones. Se implementa a nivel de hardware y, en algunos casos, puede controlarse desde el software. Suficiente un prefetch por bloque de la caché.

Lectura Adelantada (cont.) Útil en bucles con patrones de acceso simples (aplicaciones científicas). En lenguaje C, es posible realizar una lectura adelantada mediante __builtin_prefetch(), si la arquitectura lo soporta. Desde MIPS IV, se soporta prefetching mediante la instrucción pref

Lectura Adelantada (cont.) ¿Con cuánta anticipación debe leerse un bloque desde memoria principal a caché? Si se hace cerca del instante de uso, podría ser tarde. Conviene aplicarlo con mayor anticipación. Deberá considerarse: Cuántos tiempo insume el prefetch. Cuántos tiempo insume una iteración del bucle. Por ejemplo: TP = Tiempo prefetch TI = Tiempo iteración TP TI = 1/3 TP

Lectura Adelantada (cont.) Se debe generar un pipeline para que el bucle no deba esperar. x[0] … x[7] x[8] … x[15] x[16] … x[23] x[24] … x[31] Distancia d = 3 x[32] … x[39] x[40] … x[47] PROCESA x[0] … x[7] x[8] … x[15] x[16] … x[23] x[24] … x[31] … En general  d = TP / TI

Lectura Adelantada (cont.) FACTOR DE DESENROLLADO IGUAL A LA CANT. DE ELEMENTOS POR BLOQUE DE CACHÉ Agregar una estructura condicional (if..else) o desenrollar el bucle, para no ejecutar el prefetch en todas las iteraciones.

Ejercitación: Prefetching Optimizar utilizando lectura adelantada (prefetching). Determinar: Factor de desenrollado del bucle. Distancia d. DATOS: Línea caché: 32 bytes Tamaño double: 8 bytes Costo acumulación: 25 ciclos Costo prefetch: 300 ciclos

Optimización de Memoria #2: Reemplazo de Elem. de Arreglos… Pocos compiladores intentan mantener los elementos de un arreglo en registros, entre iteraciones sucesivas. Reemplazar el elemento de una arreglo por una variable temporal, para que pueda mantenerse en un registro.

Optimización de Memoria #3: Intercambio de Bucles Según el lenguaje, un arreglo multidimensional podría almacenarse en memoria, ordenado por filas o por columnas. Orden por filas (row-major order) Orden por columnas (column-major order)

Intercambio de Bucles (cont.) Se busca acceder al arreglo en pasos unitarios (unit stride). Esto permite aprovechar la localidad espacial en la memoria caché de datos. Orden por filas (row-major order) Orden por columnas (column-major order)

Intercambio de Bucles (cont.) C/C++, Java, Pascal utilizan row-major order. Fortran y versiones viejas de BASIC, utilizan column-major order. Por lo tanto, deben intercambiarse los bucles, de ser necesario:

Intercambio de Bucles (cont.) Usando row-major order: Desaciertos de escritura en la matriz (1 cada 8 escrituras)

Intercambio de Bucles (cont.) Usando column-major order: Desaciertos de escritura en la matriz (8 cada 8 escrituras)

Optimización de Memoria #4: Operación en Bloques Permite decrementar la cantidad de desaciertos de capacidad cuando se opera con arreglos grandes. Mejora la localidad temporal (mantiene en la caché, datos que se usarán en el corto plazo).

Operación en Bloques (cont.) Ejemplo: multiplicación de matrices. Elevada cantidad de desaciertos. Para una caché 2WSA 2-KB con bloques de 32 bytes, multiplicar dos matrices de 64x64 enteros, produce una tasa de desaciertos del 11,3%

Operación en Bloques (cont.) Solución: operar en bloques pequeños. Se reducen los accesos conflictivos, ya que los bloques pequeños pueden ser mantenidos en la caché.

Operación en Bloques (cont.) 2WSA 2-KB (bloque de 32 bytes)

Optimización de Memoria #5: Rellenado de Arreglos (padding) Suma de matrices. C (64 bytes) B (64 bytes) A (64 bytes)

Rellenado de Arreglos (cont.) THRASHING Memoria caché DM 64 bytes 8 bytes por línea

Rellenado de Arreglos (cont.) Memoria caché DM 64 bytes 8 bytes por línea

Rellenado de Arreglos (cont.) Se cambia la forma en que los arreglos son almacenados en memoria principal. Reduce los accesos conflictivos. Disminuye el thrashing y, por consiguiente, la cantidad de desaciertos. Como desventaja, utiliza mayor cantidad de memoria.

Rellenado de Arreglos (cont.) Sin rellenado: Desaciertos de lectura (8 cada 8 lecturas) Desaciertos de escritura en la matriz (8 cada 8 escrituras)

Rellenado de Arreglos (cont.) Con rellenado: Rellenos Desaciertos de lectura de matrices A y B (1 cada 8 lecturas) Desaciertos de escritura en la matriz C (1 cada 8 escrituras)

Ejercitación: Padding 2-KB 64 bytes 32 líneas Asumir que el primer elemento de la matriz se almacena en la dirección 0x00000000

Optimización de Memoria #6: Reducción de Solapamiento Un dato en memoria puede ser accedido de diferentes maneras. Es importantes disminuir el aliasing para lograr optimizaciones más agresivas. ¿Redundante?

Reducción de Solapamiento (cont.) … p = &a; No sería redundante, si p fuese un “alias” de a. El programador puede “prometerle” al compilador que no existen “alias”. Así, le permite realizar optimizaciones más agresivas (como eliminación de código redundante).

valgrind --tool=<tool> my_prog Algo sobre Valgrind Herramienta para profiling y debugging. Site: http://valgrind.org/ Soporta cualquier lenguaje compilado. Pública y de código abierto. Aplica la técnica de instrumentación dinámica de código. Ejemplo de ejecución: valgrind --tool=<tool> my_prog

Algo sobre Valgrind (cont.) Cachegrind es el módulo para simulación de memorias caché. Junto con la herramineta cg_annotate, es posible detectar el origen de los desaciertos en caché. $ valgrind --tool=cachegrind --D1=2048,2,32 prueba (genera un archivo cachegrind.out.<pid>) $ cg_annotate --<pid> prueba.c IMPORTANTE: no olvidar compilar prueba.c utilizando la opción -g para incluir información de debugging útil para Valgrind).

Optimización de Software 66.20 Organización de Computadoras