ARQUITECTURA DE COMPUTADORES

Documentos relacionados
Multiplicación de matrices con DLX

OBJETIVOS ALGUNAS CONSIDERACIONES SOBRE WINDLX

Arquitectura de Computadores Problemas (hoja 2). Curso

6. PROCESADORES SUPERESCALARES Y VLIW

Ejercicios de Paralelismo a Nivel de Instrucción

Arquitectura de Computadores Problemas (hoja 4). Curso

2. ARQUITECTURA BÁSICA DE MIPS 64

Introducción a los procesadores ILP (Instruction-Level Parallel)

Tutorías con Grupos Reducidos (TGR) Sesión 2: Paralelismo a Nivel de Instrucción

Ejercicios del tema 4. El procesador

ARQUITECTURA DE COMPUTADORES. Práctica 8

Ejercicios del Tema 3. Fundamentos de la programación en ensamblador

2. SEGMENTACIÓN ENCAUZADA AVANZADA Y PARALELISMO DE INSTRUCCIONES: EJERCICIOS Y CUESTIONES

Tema 10. Introducción a la op5mización de código

int vector[100]; // en principio vector tiene al menos // cien elementos aunque pueda tener más... for (i=0; i<100; i++) vector[i] = vector[i] + 1;

Organización de Computadoras. Clase 6

Práctica ENS:Ensamblar y depurar

Arquitectura de Computadores MIPS64-1

Sección de procesamiento: El camino de datos

Aspectos avanzados de arquitectura de computadoras Pipeline. Facultad de Ingeniería - Universidad de la República Curso 2017

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 3. PLANIFICACIÓN ESTÁTICA AVANZADA. TMS320C6713

Construyendo Programas más Complejos

Bus de direcciones. Bus de datos

Introducción a la arquitectura de computadores

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Arquitectura de Computadoras. Clase 4 Segmentación de Instrucciones

Práctica 1. Introducción a la programación en ensamblador

Arquitecturas RISC. Arquitectura de Computadoras y Técnicas Digitales - Mag. Marcelo Tosini Facultad de Ciencias Exactas - UNCPBA

Planificación Dinámica - 1. Arquitectura de Computadores

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Diferentes Perspectivas de un Ordenador

Práctica 4. DESENROLLADO DE BUCLES.

Arquitectura del CPU. Organización del Computador 1 Verano 2016

Arquitectura de Computadores II Clase #3

Explotación del paralelismo a nivel de instrucción

ARQUITECTURA DE SISTEMAS PARALELOS I. 4º INGENIERÍA INFORMÁTICA. PRÁCTICA 3.

BIBLIOGRAFIA. Sistemas Operativos. Informática E.P.S. Universidad de Sevilla TEMA 4: Bibliografía básica de referencia:

Tema V Generación de Código

Tema 2 Introducción a la Programación en C.

5 - Lenguaje Ensamblador

Ejercicios del tema 5. Jerarquía de de Memoria

HISTORIA DEL PIPELINE. Juan Antonio Romano Largo. Arquitectura de Computadores.

Modelos de Programación Paralela Prof. Gilberto Díaz

Ejercicios Jerarquía de Memoria

Unidad Nº II Capacidad de la unidad central. de procesamiento. Instituto Universitario Politécnico. Santiago Mariño

ARQUITECTURA DE VON NEUMANN Y HARVARD

TEMA 4. ARQUITECTURA IA-64

Objetivos. Objetivos. Arquitectura de Computadores. R.Mitnik

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

Tema 7: Procesadores superescalares

Los números naturales y enteros en el 80X86 y en LAN

FUNDAMENTOS DE COMPUTADORES

FUNDAMENTOS DE COMPUTADORES 18 de junio de Examen parcial del 2º cuatrimestre.

Procesador MIPS - Registros

Objetivo. Introducción. Tema: GENERACION DE CODIGO. Compiladores, Guía 11 1

Tratamiento de Excepciones en MIPS

ARQUITECTURA SPARC: FORMATO DE INSTRUCCIÓN

TEMA III: OPERACIONES CON LOS DATOS

Organización de Computadoras. Clase 7

Estructura de Computadores

ARQUITECTURA SPARC: MODOS DE DIRECCIONAMIENTO

Capítulo 13 INSTRUCCIONES DE CONTROL REPETITIVAS. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Arquitectura de Computadores Segmentación del Cauce - 1

Metodología de Desarrollo de Programas

Estructuras de Control

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Principios de Computadoras II

Práctica 3 - Arquitectura del CPU

Universidad Nacional del Santa FACULTAD DE INGENIERIA E.A.P de Ingeniería de Sistemas e Informática NETBEANS 7.0

ESTRUCTURAS REPETITIVAS EN PHP

Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Tipos de Esquema

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Organización del Computador I Verano. MIPS (2 de 2) Basado en el capítulo 2 del libro de Patterson y Hennessy

Unidad 4 - Procesamiento paralelo. Arquitectura de computadoras. D o c e n t e : E r n e s t o L e a l. E q u i p o : J e s s i c a F i e r r o

Práctica 5 - Memoria Cache

Procesadores superescalares. Introducción

Objetivos. El alumno conocerá y aplicará el concepto de archivo para el almacenamiento y recuperación de datos persistentes.

Grupo de Arquitectura y Tecnología de Computadores (ARCOS)

Tema 1. Introducción a la arquitectura de computadores: diseño, coste y rendimiento

LABORATORIO DE ARQUITECTURA DE COMPUTADORES. I. T. I. SISTEMAS / GESTIÓN GUÍA DEL ALUMNO

La última versión disponible cuando se redactó este manual era la 5 Beta (versión ), y sobre ella versa este manual.

Modos de Direccionamiento

Tipos Recursivos de Datos

Arquitectura de Computadoras. Clase 9 Procesamiento paralelo

Tema 4 (II) El procesador

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

FUNDAMENTOS DE INFORMÁTICA

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Microprocesadores, Tema 3 (2):

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

Tema 2. El lenguaje JAVA

Ciclos de máquina. Otro ejemplo: decremento de un registro par (donde rp = HL, DE, BC, SP) DCX rp

PRÁCTICAS DE ARQUITECTURA DE COMPUTADORES

Examen Teórico (1/3 de la nota final)

PARTE II: Programación en ensamblador

Plataformas de soporte computacional: arquitecturas avanzadas,

El Diseño de un Lenguaje Máquina

Programación (PRG) PRÁCTICA 10. Algoritmos de búsqueda

Sistemas con Microprocesadores I

Transcripción:

Escuela Universitaria de Informática Ingeniería de Computadores ARQUITECTURA DE COMPUTADORES PRÁCTICA Nº 3 DESENROLLADO DE BUCLES

INTRODUCCIÓN Este documento contiene el enunciado de la práctica de desenrollado de bucles sobre el simulador WinMIPS64. OBJETIVO El objetivo de la práctica es que el alumno aplique la técnica del desenrollado de bucles, conociendo sus ventajas y también sus limitaciones. EL DESENROLLADO DE BUCLES El desenrollado de bucles es una técnica que permite obtener un mayor rendimiento en el tiempo de ejecución de los programas. El mayor rendimiento se obtiene mediante el aprovechamiento del paralelismo que se puede obtener en los bucles de acceso a los elementos de un array. Esta técnica, generalmente, la aplica el compilador realizando varias copias del código del bucle, además de utilizar algún registro adicional del procesador (renombrado de registros) para eliminar ciertos riesgos que puedan aparecer en el nuevo código. El desenrollado no siempre es fácil aplicarlo debido a que en ciertas situaciones el número de veces que se ejecuta un bucle no es un valor estático sino que depende de una variable cuyo contenido no es conocido en tiempo de compilación. Otra dificultad añadida puede ser la no disponibilidad de registros para evitar ciertas dependencias de datos (RAW). UN EJEMPLO Para comprender mejor en qué consiste la técnica, partiremos del siguiente programa de ejemplo: LOOP: lw r10,0(r1) ; Leer un elemento de un vector daddi r10,r10,4 ; Sumar 4 al elemento sw r10,0(r1) ; Escribir el nuevo valor daddi r1,r1,-4 ; Actualizar la var. índice bne r1,r0,loop ; Fin de vector? FOR I := N DOWNTO 1 DO A[I] := A[I]+4; END Existen tres dependencias de datos (RAW) que no permiten ninguna reordenación del código (por parte del compilador) para evitar las paradas que aparecerán en el cauce durante su ejecución. En una primera aproximación se va a desenrollar el bucle en cuatro copias, quedando de la forma siguiente: Arquitectura de Computadores 2 Desenrollado de bucles

LOOP: lw r10,0(r1) ; Leer elemento vector daddi r10,r10,4 ; Sumar 4 al elemento sw r10,0(r1) ; Escribir nuevo valor lw r11,-4(r1) ; 2ª copia daddi r11,r11,4 ; sw r11,-4(r1) ; lw r12,-8(r1) ; 3ª copia daddi r12,r11,4 ; sw r12,-8(r1) ; lw r13,-12(r1) ; 4ª copia daddi r13,r11,4 ; sw r13,-12(r1) ; daddi r1,r1,-16 ; Actualizar índice bne r1,r0,loop ; Fin de vector? Para evitar dependencias de datos se han empleado para cada copia registros distintos al original del bucle. También se han modificado los desplazamientos en las instrucciones de load y store para permitir el acceso a los elementos anteriores al indicado por la variable índice del bucle (registro r1). Así mismo, la actualización de r1 se ha modificado, sustituyendo la constante 4 por 16 con el fin de reflejar el procesamiento de los cuatro elementos del array (cada elemento ocupa 4 octetos de memoria). Las dependencias de datos entre cada copia se mantienen (instrucciones lw, daddi y sw), para evitarlas puede reorganizarse el código de la forma siguiente: LOOP: lw r10,0(r1) ; lw r11,-4(r1) ; daddi r10,r10,4 ; daddi r11,r11,4 ; lw r12,-8(r1) ; lw r13,-12(r1) ; daddi r12,r11,4 ; daddi r13,r11,4 ; sw r10,0(r1) ; sw r11,-4(r1) ; sw r12,-8(r1) ; sw r13,-12(r1) ; daddi r1,r1,-16 ; bne r1,r0,loop ; Arquitectura de Computadores 3 Desenrollado de bucles

En este código la única dependencia de datos corresponde a las dos últimas instrucciones del bucle (registro r1). Con el desenrollado que se ha realizado el bucle necesitará ejecutarse únicamente la cuarta parte de veces que el original. DESARROLLO DE LA PRÁCTICA Para realizar la práctica se partirá del programa siguiente: main () { int array[240]; int i; int suma; for (i = 0; i < 240; i++) { array[i] = 2; } suma = 0; for (i = 0; i < 240; i++) { suma += array[i]*array[i]; } } La traducción a lenguaje ensamblador MIPS64 es la siguiente. El fichero con el código está disponible con el enunciado de la práctica (p3.s):.data array:.space 960 i:.word32 0 suma:.word32 0.code MAIN: daddi r1,r0,0 ; suma = 0 sw r1,suma(r0) daddi r2,r0,0 ; i = 0 sw r2,i(r0) ; Inicializar los elementos del array con el ; valor 2 FOR_LOOP_1: nop lw r2,i(r0) ; lec. var. i Arquitectura de Computadores 4 Desenrollado de bucles

sw r6,array(r5) daddi r2,r2,1 sw r2,i(r0) j FOR_LOOP_1 END_FOR_LOOP1: nop daddi r3,r0,240 ; nº de veces slt r4,r2,r3 ; i < 240 daddi r6,r0,2 ; valor inicial beqz r4,end_for_loop1 dsll r5,r2,2 ; dir. i-esimo daddi r2,r0,0 ; i = 0 sw r2,i(r0) ; Recorre el bucle suma += array[i]^2 FOR_LOOP_2: lw r2,i(r0) ; lectura de la var. i daddi r3,r0,240 ; nº de veces slt r4,r2,r3 ; i < 240 beqz r4,end_for_loop2 dsll r6,r2,2 lw r7,array(r6) dmul r8,r7,r7 lw r5,suma(r0) dadd r5,r5,r8 sw r5,suma(r0) ; dir. i-esimo elemento ; lec. i-esimo elemento ; a[i]*a[i] ; lec. de la var. suma ; actualización suma ; esc. de la var. suma daddi r2,r2,1 ; i = i + 1 sw r2,i(r0) ; esc. de la var. i j FOR_LOOP_2 END_FOR_LOOP2: nop nop halt En la declaración de datos (.data) para la variable array se han reservado 960 octetos correspondientes a los 240 elementos de tipo word32 (4 octetos). Para la ejecución del programa se ha supuesto que el simulador tiene activos los mecanismos de Data Forwarding y Delay Slot (menú Configure). Obsérvese que la instrucción que aparece a continuación de una de salto se ejecuta siempre, por eso en algunas partes del programa la instrucción NOP sucede a una de salto. El código a partir de la etiqueta FOR_LOOP_2 es el encargado de realizar la suma de los cuadrados de cada uno de los elementos del array. La variable índice i se Arquitectura de Computadores 5 Desenrollado de bucles

almacena en el registro r2 y suma en r5. Para acceder a cada uno de los elementos del array es necesario multiplicar el valor de la variable i por 4 ya que, como se ha citado anteriormente, cada elemento del vector ocupa 4 octetos, para llevar a cabo la multiplicación se utiliza la instrucción dsll con un desplazamiento de 2 bits. En cada iteración del bucle se utilizan tres registros del procesador: r6 r7 r8 Para realizar el cálculo de la dirección de comienzo de cada elemento del array Para almacenar el contenido del elemento i esimo del array Para almacenar el cuadrado del elemento i esimo del array Paso 1 Ejecutar el programa anterior en el simulador obteniendo las informaciones siguientes: Tabla 1 Paso 2 Desenrollar el bucle FOR_LOOP_2 en dos copias partiendo del programa original, guardando el nuevo código en un fichero de nombre p3-2.s Para realizar la segunda copia del bucle se aconseja: utilizar los registros r9, r10 y r11 en lugar de los r6,r7 y r8 utilizados en la primera copia incrementar en uno la variable índice (i) antes de la segunda copia, evitando de esta forma tener que modificar la condición de finalización del bucle Arquitectura de Computadores 6 Desenrollado de bucles

leer y actualizar en memoria las variables índice (i) y suma acumulada (suma) una sola vez por iteración Ejecutar el nuevo programa obteniendo los nuevos resultados (Tabla 1) A qué son debidos los riesgos estructurales que aparecen? Pueden eliminarse? Paso 3 Reorganizar el código (fichero de nombre p3.2opt.s) del Paso 2 para eliminar, en la medida de lo posible, las dependencias de tipo RAW del código, volviendo a ejecutar el programa y obteniendo los resultados de la Tabla 1. Paso 4 Desenrollar el bucle FOR_LOOP_2 en cuatro copias (fichero p3-4.s). Utilizar los registros r12, r13 y r14 para la tercera copia. Y r15, r16 y r17 para la cuarta copia. Rellenar la tabla de resultados (Tabla 1) tras la ejecución Paso 5 Reorganizar el código del paso 4 eliminando el mayor número de dependencias RAW. Guardar el resultado en el fichero p3-4opt.s y rellenar la tabla de resultados (Tabla 1). Paso 6 Desenrollar el bucle FOR_LOOP_2 en seis copias (guardando el código en el fichero p3-6.s) Paso 7 Reorganizar el código del paso 6 tratando de eliminar las dependencias RAW. Guardar el resultado en el fichero p3-6opt.s Paso 8 Indicar la aceleración obtenida para cada versión del programa, con respecto al original (p3.s). Arquitectura de Computadores 7 Desenrollado de bucles

Versión de programa Aceleración (SpeedUp) P3 2.s P3 2opt.s P3 4.s P3 4opt.s P3 6.s P3 6opt.s Arquitectura de Computadores 8 Desenrollado de bucles

HOJA DE RESPUESTAS NOMBRE Y APELLIDOS Paso 1 Ejecutar el programa anterior en el simulador obteniendo las informaciones siguientes: Paso 2 Ejecutar el programa p3-2.s Arquitectura de Computadores 9 Desenrollado de bucles

A qué son debidos los riesgos estructurales que aparecen? Pueden eliminarse? Paso 3 Ejecutar el programa p3.2opt.s Paso 4 Ejecutar el programa p3-4.s Arquitectura de Computadores 10 Desenrollado de bucles

Paso 5 Ejecutar el programa p3-4opt.s Paso 6 Ejecutar el programa p3-6.s Paso 7 Ejecutar el programa p3-6opt.s Arquitectura de Computadores 11 Desenrollado de bucles

Paso 8 Indicar la aceleración obtenida para cada versión del programa, con respecto al original (p3.s). Versión de programa Aceleración (SpeedUp) P3 2.s P3 2opt.s P3 4.s P3 4opt.s P3 6.s P3 6opt.s Arquitectura de Computadores 12 Desenrollado de bucles