Optimización de Software (segunda parte)

Slides:



Advertisements
Presentaciones similares
Arquitectura RISC & CISC y DSP
Advertisements

III - Gestión de memoria
Complejidad Computacional
Configuración de Control
TEMA 1 Introducción a la Programación Concurrente
UNIVERSIDAD DEL VALLE DE MEXICO CAMPUS CHAPULTEPEC
Estrella 0 - Fundamentos de la Programación
SISTEMAS OPERATIVOS GESTION DE MEMORIA INTEGRANTES Lizeth Chandi
Organización y arquitectura de sistemas de memoria
III - Gestión de memoria
CLASE 3 SOFTWARE DEL MICROPROCESADOR
Memoria Cache.
Arquitectura de Computadores I
Arquitectura de Computadores I PIPELINING. Pipelining Un pipeline es una serie de etapas, en donde en cada etapa se realiza una porción de una tarea.
Tecnologías para desarrollo de aplicaciones web. Un caso de uso
PROGRAMACIÓN PARALELA Tema 5: Análisis de algoritmos paralelos
Microprocesadores para comunicaciones Escuela Técnica Superior de Ingenieros de Telecomunicación Organización y estructura de las memorias caché.
INTRODUCCIÓN A JAVA.
PROCESADORES SUPERESCALARES
Introducción a Matlab Lectura 1.
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
Optimización de Software
Optimización de aplicaciones
Assembly y el Simulador SPIM
Departamento de Ingeniería de Sistemas Universidad de Antioquia
MEMORIA 1.
Funcionamiento, programación
Pipelines: Riesgos.
Tema II Unidad de memoria. 2 Unidad de memoria 2.1 Definiciones y conceptos básicos Localización Capacidad Unidad de transferencia
EMISION MULTIPLE DE INSTRUCCIONES
Algorítmo de Mapeo Directo
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.
Su objetivo es conseguir el rendimiento de una memoria de gran velocidad al costo de una memoria de baja velocidad Los puntos básicos relacionados con.
Tema 3. Optimización de Código
Ciclo de desarrollo de sistema. El ciclo del sistema.
Gustavo Andrés Uribe Gómez
Direcciones físicas y direcciones virtuales (lógicas)
Memoria Organización del caché. Universidad de SonoraArquitectura de Computadoras2 Organización del caché Hasta ahora solo se ha visto la estrategia de.
Tema 10: Gestión de Memoria
Memoria Otros temas sobre cachés. Universidad de SonoraArquitectura de Computadoras2 Otros temas 1. Estrategias de búsqueda de bloque. 2. Estrategias.
Introducción a la Programación. Lenguaje de Máquina.
Introducción al análisis de algoritmos
Estructura y Tecnología de Ordenadores Noviembre 2004.
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
 La cuestión de la cantidad es simple, cuanto más memoria haya disponible, más podrá utilizarse. La velocidad óptima para la memoria es la velocidad.
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.
Structured Query Language MySQL Sistema de gestión de bases de datos SQL Open Source más popular Lo desarrolla, distribuye y soporta.
Organización del Computador
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.
Organización del Computador
Memoria virtual.
Gestión de Memoria.
Sistemas Operativos Avanzados
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.
Sánchez Manjarrez Silvana Ing. Daniel Domínguez C. México, D.F. a 13 de septiembre del 2006 Arquitectura de Computadoras Arquitecturas CISC Y RISC Campus.
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.
Introducción a los TADs
DISCOS RAID (Redundant Array of Independent Disks)
MEMORIA DINÁMICA.
Por: Viridiana Fernández Carreón
Diccionario/Directorio de Datos
Gestión de Memoria – Parte 2
1/50 Ing. Gerardo Chávez Malpartida Administración de Memoria SISTEMAS OPERATIVOS.
Transcripción de la presentación:

Optimización de Software (segunda parte) 66.20 Organización de Computadoras

Tipos de Optimizaciones  Intraprocedurales (locales). Aplican a procedimientos individuales. Interprocedurales (globales). Aplican a varios procedimientos simultáneamente. Cambio de algoritmos. Utilizar algoritmos con mejor orden de complejidad. De la Jerarquía de Memoria. Consideran la jerarquía de memoria de base.  

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). Localidad: Espacial: datos contiguos en memoria. Temporal: accesos repetidos a los mismos datos. Organizaciones: El Pentium 4 tiene un cache L1 de 8KB de datos 4-way set associative, con líneas de 64 bytes. El cache L1 de instrucciones fue reemplazado por el Execution Trace Cache, que almacena µOPs (12000) en lugar de instrucciones x86. No se especifica el tamaño de este cache en términos de bytes. Esto tiene la ventaja de almacenar instrucciones decodificadas. El cache L2 viene de distintos tamaños, desde 256KB a 2MB. El de 256KB es 8way set associative, con lineas de 128 bytes. No necesariamente esto es así para los demás caches. Incluso el P 4 Extreme Edition tiene cache L3.

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. Transformación de bucles. Rellenado de arreglos (array padding). Reducción de solapamiento (aliasing).

Lectura Adelantada (prefetching) Especula con los accesos futuros a datos e instrucciones. Se implementa a nivel de hardware y, en algunas arquitecturas, puede controlarse desde el software. Útil en estructuras repetitivas (bucles). Suficiente un prefetch por bloque de la caché.

Lectura Adelantada (prefetching) (cont.) El lenguaje ANSI C permite aplicarlo a datos. Compilar de la siguiente manera: gcc -march=pentium4 ejemplo01.c -o ejemplo01

Lectura Adelantada (prefetching) (cont.) Si el prefetch se hace cerca del instante de uso, podría ser demasiado tarde. Conviene aplicarlo con mayor anticipación. Es necesario desenrollar el bucle. Por otro lado, si se realiza muy por adelantado, pueden producirse reemplazos indeseados (los nuevos datos pueden reemplazar algunos que aun no fueron utilizados o están siendo utilizados, o los nuevos datos podrían ser reemplazados por otros datos antes de ser utilizados). Factor de desenrollado r: nro de elementos del array que entran en 1 línea de cache. Es decir, para un cache con líneas de 32 bytes, y un arreglo de doubles, tendría 4 elementos por línea (r=4). En el ejemplo falta una optimización: los ultimos d = DELTA_PREFETCH / r = 2 fetchs no son necesarios (no se accede a esos datos). Hay que modificar el límite del 2do for a MAX-DELTA_PREFETCH y hay que agregar: for(;i<MAX;i++) acum += x[i]; ¿FACTOR DE DESENROLLADO?

Lectura Adelantada (prefetching) (cont.) ¿Con cuánta anticipación debe leerse (prefetch) un bloque desde memoria principal a caché? Deberá considerarse: Cuántos ciclos insume el prefetch para traer el bloque a la caché. Cuántos ciclos insume una iteración del bucle. Por ejemplo: TP = Tiempo prefetch TI = Tiempo iteración TP TI = 1/3 TP

Lectura Adelantada (prefetching) (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] En el ejemplo anterior, d = DELTA_PREFETCH / r = 16 / 8 = 2 PROCESA x[0] … x[7] x[8] … x[15] x[16] … x[23] x[24] … x[31] … En general  d = TP / TI

Reemplazo de Elementos de Arreglos por Escalares Pocos compiladores intentan mantener los elementos de un arreglo en registros, entre iteraciones sucesivas.

Reemplazo de Elementos de Arreglos por Escalares (cont.) Reemplazar el elemento de una arreglo por una variable temporal, para que pueda mantenerse en un registro.

Transformación de Bucles  Fusión / Fisión. Desenrollado. Intercambio. Operación en bloques. 

Transformación de Bucles (cont.) Intercambio. 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)

Transformación 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)

Transformación de Bucles (cont.) En lenguajes como ANSI C y Pascal se utiliza el esquema row-major order. Lenguajes como Fortran, utilizan column-major order. Por lo tanto, deben intercambiarse los bucles, de ser necesario:

Transformación de Bucles (cont.) Operación en bloques. Permite decrementar la cantidad de desaciertos (misses) en bucles anidados. Mejora la localidad temporal (mantiene en la caché, datos que se usarán en el corto plazo).

Transformación de Bucles (cont.) Ejemplo: multiplicación de matrices. Elevada cantidad de accesos conflictivos a la caché.

Transformación de Bucles (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é. Notar que en este caso hace falta inicializar la matriz C en cero.

Rellenado de Arreglos (array padding) Suma de matrices. C (64 bytes) B (64 bytes) A (64 bytes)

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

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

Rellenado de Arreglos (array padding) (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. El padding es una técnica muy utilizada en general. Por ejemplo, cuando se debe mantener una colección de un grán número de estructuras en memoria, se suelen crear de un tamaño tal que evite el alineamiento y reducir así el reemplazo de líneas de caché. Una regla a seguir sería evitar que estos objetos tengan un tamaño que sea potencia de 2.

Reducción de Solapamiento (aliasing) 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 (aliasing) (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).

Tipos de Optimizaciones  Intraprocedurales (locales). Aplican a procedimientos individuales. Interprocedurales (globales). Aplican a varios procedimientos simultáneamente. Cambio de algoritmos. Utilizar algoritmos con mejor orden de complejidad. De la Jerarquía de Memoria. Consideran la jerarquía de memoria de base.   

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.

La Herramienta Gprof Site: http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html Soporta los lenguages C/C++ y Fortran. Integrado a la biblioteca GNU Binutils. Aplica la técnica de instrumentación estática de código. Compilar con la opción –pg gcc -Wall -ansi -pedantic -pg prog.c -o prog

La Herramienta Valgrind Site: http://valgrind.org/ (última versión: 3.1.1) Soporta cualquier lenguaje compilado. Público y de código abierto, para ambientes Linux-x86, Linux-AMD64 y Linux-PPC32. Aplica la técnica de instrumentación dinámica de código. Ejecutar de la siguiente manera: valgrind --tool=memcheck prog

La Herramienta JProbe Site: http://www.quest.com/jprobe/ Lenguaje Java. Comercial (aunque existe una versión freeware sin soporte). Independiente de la plataforma. Aplica la técnica de instrumentación dinámica de código (dentro de la JVM, a nivel de bytecode). Dispone de una interfaz gráfica.

Ejercicio #1: Padding en P4 2-KB Memoria caché L1 en el Pentium 4. 64 bytes 32 líneas Cada fila tiene el tamaño de una vía. Debido a que el bucle se mueve primero por lineas, así como está, cada 5 loops internos se produce un reemplazo de una línea de cache, a la que solo se accedió una vez. La solución viene de agregar padding de forma tal que se rompa esta alineación entre las filas y las vías. Optimizar aplicando padding.

Ejercicio #2: 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 Software (segunda parte) 66.20 Organización de Computadoras