p2.c #define N 50 main() { int i; int a[n];



Documentos relacionados
EXAMEN ORDINARIO DE ORGANIZACIÓN DE COMPUTADORES

BACHILLERATO BATXILERGOA

Práctica 3: Programación con subrutinas

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15

Plataformas de soporte computacional: arquitecturas avanzadas,

ISA (Instruction Set Architecture) Arquitectura del conjunto de instrucciones

PRÁCTICAS DE ARQUITECTURA DE COMPUTADORES

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

Entorno de Programación Visual Studio 6

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

Mariaren Lagundia Ikastola; Orientazioa

Sesión 11 Implementación de sentencias condicionales

Práctica 1. Introducción al SIEMENS 80C167

INSTALACIÓN DEL SPSS 15.0 DESDE UN SERVIDOR

Planificación estática

Práctica 2: El problema de la sección crítica

Informática I para Bachillerato

Lehenengoa. Agindu honetan dagoen baimen-emate honek ez dauka bere baitan, inola ere, hezkuntza-itunen araubidearen bitartezko laguntzak lortzea.

TEMA 3. EL PROCESO DE COMPILACIÓN, DEL CÓDIGO FUENTE AL CÓDIGO MÁQUINA

"Programación en Ensamblador del microprocesador Pentium (I)"

Introducción a Protégé

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Correo Electrónico: Webmail: Horde 3.1.1

Tema 1: Introducción

INFORMÁTICA BÁSICA 1ª PARTE (DURACIÓN TOTAL DEL EXAMEN: 2 HORAS Y 15 MINUTOS)

1 INSTALACIÓN DE LA TARJETA DE COMUNICACIONES CP5613 EN EL PC (para Windows 2000 pro)

Esta es una excelente herramienta de análisis y seguimiento de la facturación. Dispone usted de cantidad de criterios por los que analizar las ventas.

Estructura de Computadores

Práctica 5. Curso

Carlos Castro Grande 1

4 o Ingeniería Informática

IZENA EMATEKO ORRIA HOJA DE INSCRIPCIÓN COLONIAS EN INGLES 2014 HAURRA NIÑO/A

Matemáticas II PRUEBA DE ACCESO A LA UNIVERSIDAD 2012 BACHILLERATO FORMACIÓN PROFESIONAL CICLOS FORMATIVOS DE GRADO SUPERIOR.

Colección de problemas de. Poder de Mercado y Estrategia

MANUAL DE USO DE LA PLATAFORMA E-LEARNING. TUTOR TÉCNICO:

INSTALACIÓN DE OPENOFFICE

EKAINAK 3 JUNIO Turismo kolaboratiboa (Airbnb, BlaBla Car, Couchsurfing )

SISTEMAS INFORMÁTICOS EN TIEMPO REAL 2º Ingeniería Industrial MANUAL DE HERRAMIENTAS SOFTWARE PARA PROGRAMACIÓN EN UNIX

MICROSOFT FRONTPAGE Contenido

Hardware: componentes físicos (UCP, discos, impresora, circuitos de E/S,...) Software: componentes lógicos (lo que no es hardware)

Edición de audio. Parte III

Estructuras de Datos y Algoritmos Tecnólogo en Informática

1.2 Algoritmo. Proceso de solución de un problema. Resolviendo problemas con la computadora. Programación

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Aumentar visitas en su web de manera efectiva

1. Manejo de memoria estática 2. Manejo de memoria dinámica

MEDIDA DE LA VELOCIDAD DEL SONIDO. TUBO DE RESONANCIA

RESULTADOS PRUEBAS DE INGLÉS GLOBAL TRAINING 2014 UPV/EHU INGELESA PROBAREN EMAITZAK - GLOBAL TRAINING 2014 UPV/EHU

El Producto: Software

BIDEO ERREPRODUZITZAILEA REPRODUCTOR DE VÍDEO

Taller Práctico Creación de un LO IMS/SCORM

Práctica 0. Emulador XENON de la computadora CESIUS

PRÁCTICA 10. Configuración de Correo y Publicar en la Web

Tema 6: Generación de código (parte 2)

Ejercicios de fundamentos de los computadores

MANUAL BÁSICO CORREO WEB ULPGC ÍNDICE

Manual de Automatización de Inventario de Equipos de Computo

ARQUITECTURA DE DISTRIBUCIÓN DE DATOS

Práctica Nº 4 Entorno de Programación

MANUAL PARA EL OPERADOR DE LA RED ANTARTICA DE LOS NILU

Estructuras de repetición hacer-mientras y repita hasta

Módulo 1 El lenguaje Java

Uso del simulador Modelsim

Cómo crear una encuesta online básica con encuestafacil

Arquitectura de Computadores: Exámenes y Controles

PARTE II: Programación en ensamblador

IS23 Mantenimiento de Instalaciones Informáticas Práctica 7. Análisis de redes

1. Introducción. 1.1 Ejercicio 1: Estación Meteorológica (4.0 pts.) Ejercicio 2: Gestión Académica: Alumnos (5.0 pts.)...

Dibujo técnico II PRUEBA DE ACCESO A LA UNIVERSIDAD 2014 BACHILLERATO FORMACIÓN PROFESIONAL CICLOS FORMATIVOS DE GRADO SUPERIOR.

Informática I para Bachillerato

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

CLASE # 5 TÉCNICAS DE CAJA BLANCA

TRANSFERENCIA DE INFORMACIÓN CON FTP

1.-Descargar las herramientas y configurarlas. Para editar pseudolenguaje y poder ejecutarlo descargar y configurar las siguientes herramientas:

Prácticas Sistemas y Tecnologías de Información Práctica 5

Tema 2. Diseño del repertorio de instrucciones

Como ejecutar el programa PRUF. Cía. HASAR saic

Capítulo 1: Introducción a los Sistemas de Gestión de Bases de Datos (SGBD)

14 - AR R AN Q U E Y P U E S T A E N M AR C H A

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACIÓN


ClowdsStoragePlugin Documentation

1.- Introducción 2.- Requisitos de Hardware y Software: Plataformas y Sistemas Operativos Requisitos adicionales 3.

Capítulo 1 Introducción a la Computación

Introducción al laboratorio de Programación I

Introducción al.net Framework. Introducción al.net Framework. Diseño Basado en Componentes. Curso 2008 / 09. Diseño Basado en Componentes

Apellidos Nombre DNI

Computación Evolutiva - Mutación: Cruza, Inversión y Mutación para Permutaciones

APLICAR MANTENIMIENTO PREVENTIVO AL SOFTWARE

Evaluación del rendimiento de procesadores Intel Nehalem. Modelos x7550, x5670 y x5570

Introducción al lenguaje Java

GUIA DE LABORATORIO #6 Nombre de la Practica: Antivirus ClamAV Laboratorio de Redes Tiempo Estimado: 2 Horas y 30 Minutos 1.

Es un software de simulación que ejecuta programas en lenguaje de ensamblador para procesadores con arquitectura MIPS32.

Manual básico de Robomid

Ejercicios. 5.2 [5] < 5.3> Este ejercicio es similar al 5.1, pero ahora considere los fallos causados por permanecer en 1 (la señal es siempre 1).

Cultura audiovisual PRUEBA DE ACCESO A LA UNIVERSIDAD 2013 BACHILLERATO FORMACIÓN PROFESIONAL CICLOS FORMATIVOS DE GRADO SUPERIOR.

Manual Mage Translator by Interactiv4 Versión /06/2013

Wagner Dávila, Maynor De la Rosa EDIFICIO: EPS SECCIÓN: A SALÓN DEL CURSO: EPS-1 SALÓN DEL LABORATORIO: T HORAS POR SEMANA DEL CURSO: AUXILIAR:

Compilación y ejecución de programas en Java.

Transcripción:

Euskal Herriko Unibertsitatea Informatika Fakultatea Konputagailuen Arkitektura II, 2000 Konputagailuen Arkitektura eta Teknologia Saila Konpilazio-Teknikak Laborategi-saio honetan konpiladore komertzial batek sortzen duen kodea aztertuko dugu. Horretarako, SPARC prozesadorea erabiltzen duen SUN lan-eazio bat eta DIGITAL/COMPAQ alpha prozesadorea erabiliko ditugu. A. SUN Hiru programa hauek dauzkazu zure direktorioan, C-z idatzita: p1.c #define N 50 main() { int i; int a[n]; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=1; i<n; i++) a[i] = a[i] + a[i-1]; p3.c #define N 50 main() { int i; int a[n], b[n], c[n]; } for (i=0; i<n; i++) a[i] = b[i] + c[i] ; Programak konpilatzeko honako hau exekutatu behar da cc S -Ox izena.c -Ox optimizazio-mailak adierazteko (x = 1, 2 edo 3) -S mihiztadura lengoaian idatzitako kodea sortzeko (ez da exekutagarria sortzen) Ondorioz izena.s fitxategia sortzen da.

Konpila ezazu P1 programa honako lau kasu hauetan: optimizatu gabe, eta -O1, -O2 eta - O3 optimizazioak erabiliz. Kasu bakoitzean sortzen den.s fitxategia aztertuko dugu. Optimizazioen eraginaz ideia bat izateko, exekuzio-denborak neur daitezke. Horretarako, editatu p1.c fitxategia, aatu bektorearen tamaina, 2.000.000 bat izateko, eta sartu begizta bat eragiketa 10 aiz errepikatzeko. Konpilatu berriro programa, orain -S aukera jarri gabe cc -Ox izena.c -o izena Exekutatu programa time komandoa gehituz (time izena), exekuzio-denboraren eimazio bat izateko. Errepikatu lauzpabo aiz exekuzioa eta kalkulatu exekuziodenboraren batez beea. Bete ezazu ondoko taula. (2.000.000 bat osagai) t. seg ag/it t/ag d-aurr % Optimizatu gabe 1. aukera -O1 2. aukera -O2 3. aukera -O3 t.seg: exekuzio-denbora segundotan ag/it: exekutatzen den agindu-kopurua bektore-osagai bakoitzeko t/ag: agindu bat exekutatzeko denbora, batez beez, d-aurr%: aurrezten den denbora, optimizatu gabeko kasuarekin konparatuta Errepikatu aurrekoa bee bi programetarako, -P2 eta P3, baina bakarrik -O2 eta -O3 optimizazioak erabiliz. Analizatu kasu bakoitzean sortzen den kodea (.s fitxategia).

P1_0.S a(i) = a(i)+3 LL0:.seg "data".seg "text".proc 04.global _main _main:!#prologue# 0 sethi %hi(lf12),%g1 %g1,%lo(lf12),%g1 save %sp,%g1,%sp!#prologue# 1 %g0,[%fp+-0x4] L16: [%fp+-0x4],%o0 cmp %o0,0x32 bge L15 nop sub %fp,0xcc,%o1 [%fp+-0x4],%o2 sll %o2,0x2,%o3 [%o1+%o3],%o4 %o4,0x3,%o4 %o4,[%o1+%o3] L14: [%fp+-0x4],%o5 %o5,0x1,%o5 %o5,[%fp+-0x4] b L16 nop L15: LE12: ret reore LF12 = -272 LP12 = 64 LST12 = 64 LT12 = 64.seg "data"

P1_1.S a(i) = a(i)+3.seg "text".proc 4.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-272,%sp %g0,[%fp-4] LY1: [%fp-4],%o2 sub %fp,204,%o1 sll %o2,2,%o2 [%o1+%o2],%o4 3,%o4 %o4,[%o1+%o2] [%fp-4],%o5 %o5 cmp %o5,50 bl LY1 %o5,[%fp-4] ret reore.seg "data"

P1_2.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,%o0,%i5 [%i5],%o5 LY1: 3,%o5 %o5,[%i5] 4,%i5 cmp %i5,%i4 blu,a LY1 [%i5],%o5 ret reore.seg "data"

P1_3.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %i5,%o0,%i5 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,12,%o5 cmp %o5,%i4 bcc,a LY2 [%i5],%l4 [%i5],%o7 LY3: 3,%o7 %o7,[%i5] [%i5+4],%l0 3,%l0 %l0,[%i5+4] [%i5+8],%l1 3,%l1 %l1,[%i5+8] [%i5+12],%l2 3,%l2 %l2,[%i5+12] 16,%i5 %i5,12,%l3 cmp %l3,%i4 blu,a LY3 [%i5],%o7 cmp %i5,%i4 bcc L77006 nop [%i5],%l4 LY2: 3,%l4 %l4,[%i5] 4,%i5 cmp %i5,%i4 bcs,a LY2 [%i5],%l4 L77006: ret reore.seg "data"

P2_2.S a(i)=a(i)+a(i-1).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-200,%o2 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i5,%o2,%i5 L77003: [%i4],%l0 [%i5],%l1 4,%i4 %l1,%l0,%l1 %l1,[%i5] cmp %i4,%i3 blu L77003 4,%i5 ret reore.seg "data"

P2_3.S a(i)=a(i)+a(i-1) save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i4,12,%l0 cmp %l0,%i3 %fp,-200,%o2 bcc L77010 %i5,%o2,%i5 L77003: [%i5],%l2 [%i4],%l1 %l2,%l1,%l2 %l2,[%i5] [%i4+4],%l3 [%i5+4],%l4 %l4,%l3,%l4 %l4,[%i5+4] [%i4+8],%l5 [%i5+8],%l6 %l6,%l5,%l6 %l6,[%i5+8] [%i4+12],%l7 [%i5+12],%i0 16,%i4 %i4,12,%i1 %i0,%l7,%i0 %i0,[%i5+12] cmp %i1,%i3 blu L77003 16,%i5 cmp %i4,%i3 bcc L77006 nop L77010: [%i4],%i2 [%i5],%o0 4,%i4 %o0,%i2,%o0 %o0,[%i5] cmp %i4,%i3 bcs L77010 4,%i5 L77006: ret reore.seg "data"

P3_2.S a(i)=b(i)+c(i).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %fp,-200,%i3 %i4,%i3,%i3 %i4,%i5,%i5 %fp,-400,%o4 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i4,%o4,%i4 L77003: [%i4],%l2 [%i5],%l3 4,%i5 %l2,%l3,%l2 %l2,[%i3] cmp %i5,%i2 4,%i4 blu L77003 4,%i3 ret reore.seg "data"

P3_3.S a(i)=b(i)+c(i) _main: save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %i4,%i5,%i5 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i5,12,%l2 %fp,-200,%i3 %i4,%i3,%i3 cmp %l2,%i2 %fp,-400,%o4 bcc L77010 %i4,%o4,%i4 L77003: [%i5+12],%o3 [%i5+8],%o0 [%i5+4],%l7 [%i5],%l4 [%i4+12],%o2 [%i4+8],%i1 [%i4+4],%l6 [%i4],%l3 16,%i5 %i5,12,%o5 %l3,%l4,%l3 %l6,%l7,%l6 %i1,%o0,%i1 %o2,%o3,%o2 %o2,[%i3+12] %i1,[%i3+8] %l6,[%i3+4] %l3,[%i3] cmp %o5,%i2 16,%i4 blu L77003 16,%i3 cmp %i5,%i2 bcc L77006 nop L77010: [%i5],%l0 [%i4],%o7 4,%i5 %o7,%l0,%o7 %o7,[%i3] cmp %i5,%i2 4,%i4 bcs L77010 4,%i3 L77006: ret reore

B. ALPHA Bigarren makina honetan aurrekoan egindako analisi bera errepikatu dugu. Bi programa hauek erabiliko ditugu p1.c #define N 50 int a[n]; main() { int i; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=0; i<=n; i++) a[i] = a[i-1] + 3; Programak modu berean konpilatzen dira: cc S -Ox unroll n izena.c -Ox optimizazio-maila adierazteko (x = 1, 2, 3, 4) -S mihiztadura lengoaian idatzitako kodea sortzeko (ez da exekutagarria sortzen) Ondorioz izena.s fitxategia sortzen da. -unroll n begizta zenbat aiz (n) zabau behar den adierazteko (1 ez egitea) Konpilatu P1 programa O4 unroll 1 (ez zabau) aukerekin. Aztertu.s fitxategia. Zer egin du konpiladoreak? Errepikatu aurrekoa, baina P2 programarekin. Zer egin du konpiladoreak? Konpilatu berriz P2 programa, baina begizta bi aiz zabauz. Eta orain? Bukatzeko, egin ezazu berriz aurrekoa P1 programarekin, begizta bi aiz zabauz (-unroll 2). Eta orain, zer egin du konpiladoreak?

P1_O4_u1.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $1, a($gp)!literal!2 # 000006 l $3, ($1)!lituse_base!2 a $2, 4($1)!lituse_base!2 l $31, 60($2) a $1, 200($1)!lituse_base!2 cmpult $2, $1, $5 l $3, 3, $3 beq $5, L$4 L$5: a $2, 4($2) l $31, 64($2) l $6, -4($2) cmpult $2, $1, $16 l $3, -8($2) l $6, 3, $3 bne $16, L$5 L$4: l $3, -4($2).loc 1 7 # 7 } clr $0 # 000007 ret ($26).end main

P1_O4_u2.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $2, a($gp)!literal!2 # 000006 l $31, 48($2)!lituse_base!2 a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 L$7: l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0 # 000007.loc 1 6 l $23, -8($2) # 000006 l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 L$4:.loc 1 6 l $3, -8($2) # 000006 l $6, -4($2).loc 1 7 clr $0 # 000007.loc 1 6 l $3, 3, $5 # 000006 l $6, 3, $6 l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26)

.end main # 000007

P2_O4_u1.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $3, -4($0) a $0, 4($0) cmpult $0, $1, $4 l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main

P2_O4_u2.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $31, 44($0) l $3, -4($0) a $0, 8($0) l $3, 3, $3 cmpult $0, $1, $4 l $3, -8($0) l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main

Universidad del País Vasco Facultad de Informática Arquitectura de Computadores II, 2000 Dep. de Arquitectura y Tecnología de Computadores Técnicas de compilación En ea sesión de laboratorio vamos a examinar el código generado por compiladores comerciales de C. Trabajaremos con una eación de trabajo SUN que utiliza el procesador SPARC y con un DIGITAL/COMPAQ con el procesador alpha. A. SUN En el directorio encontrarás eos tres programas de prueba en C: p1.c #define N 50 main() { int i; int a[n]; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=1; i<n; i++) a[i] = a[i] + a[i-1]; p3.c #define N 50 main() { int i; int a[n], b[n], c[n]; } for (i=0; i<n; i++) a[i] = b[i] + c[i] ; Para compilar los programas hay que ejecutar cc -Ox -S programa.c -Ox indica el nivel de optimización (x = 1, 2 o 3) -S genera el fichero programa.s con el código traducido a lenguaje ensamblador (no genera un fichero ejecutable)

Compila el programa P1 en eos cuatro casos: sin optimizar y con las optimizaciones - O1, -O2 y -O3. En cada caso examinaremos el fichero.s que se genera. Para tener una idea del efecto de eas optimizaciones podemos medir el tiempo de ejecución de cada programa. Para obtener unos tiempos de ejecución medibles edita el fichero p1.c, cambia el tamaño del vector a 2.000.000 e introduce un bucle externo que repita la operación 10 veces. Compila nuevamente el programa, pero sin la opción -S: cc -Ox nombre.c -o nombre Ejecuta el programa anteponiendo el comando time (time nombre), para obtener una eimación del tiempo de ejecución. Repite 4 o 5 veces la ejecución y promedia los tiempos obtenidos. Rellena la tabla adjunta. (2.000.000 de elementos) t. seg inr/elem t/inr % red. Sin optimizar 1. opción -O1 2. opción -O2 3. opción -O3 t.seg: tiempo de ejecución en segundos inr/elem: número de inrucciones que se ejecutan por elemento del vector t/inr: tiempo promedio de ejecución de una inrucción %red: reducción de tiempo conseguida frente a la ejecución no optimizada Repite el proceso anterior para los otros dos programas, P2 y P3. Utiliza sólo las opciones O2 y O3. Analiza en cada caso el código generado (fichero.s).

P1_0.S a(i) = a(i)+3 LL0:.seg "data".seg "text".proc 04.global _main _main:!#prologue# 0 sethi %hi(lf12),%g1 %g1,%lo(lf12),%g1 save %sp,%g1,%sp!#prologue# 1 %g0,[%fp+-0x4] L16: [%fp+-0x4],%o0 cmp %o0,0x32 bge L15 nop sub %fp,0xcc,%o1 [%fp+-0x4],%o2 sll %o2,0x2,%o3 [%o1+%o3],%o4 %o4,0x3,%o4 %o4,[%o1+%o3] L14: [%fp+-0x4],%o5 %o5,0x1,%o5 %o5,[%fp+-0x4] b L16 nop L15: LE12: ret reore LF12 = -272 LP12 = 64 LST12 = 64 LT12 = 64.seg "data"

P1_1.S a(i) = a(i)+3.seg "text".proc 4.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-272,%sp %g0,[%fp-4] LY1: [%fp-4],%o2 sub %fp,204,%o1 sll %o2,2,%o2 [%o1+%o2],%o4 3,%o4 %o4,[%o1+%o2] [%fp-4],%o5 %o5 cmp %o5,50 bl LY1 %o5,[%fp-4] ret reore.seg "data"

P1_2.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,%o0,%i5 [%i5],%o5 LY1: 3,%o5 %o5,[%i5] 4,%i5 cmp %i5,%i4 blu,a LY1 [%i5],%o5 ret reore.seg "data"

P1_3.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %i5,%o0,%i5 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,12,%o5 cmp %o5,%i4 bcc,a LY2 [%i5],%l4 [%i5],%o7 LY3: 3,%o7 %o7,[%i5] [%i5+4],%l0 3,%l0 %l0,[%i5+4] [%i5+8],%l1 3,%l1 %l1,[%i5+8] [%i5+12],%l2 3,%l2 %l2,[%i5+12] 16,%i5 %i5,12,%l3 cmp %l3,%i4 blu,a LY3 [%i5],%o7 cmp %i5,%i4 bcc L77006 nop [%i5],%l4 LY2: 3,%l4 %l4,[%i5] 4,%i5 cmp %i5,%i4 bcs,a LY2 [%i5],%l4 L77006: ret reore.seg "data"

P2_2.S a(i)=a(i)+a(i-1).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-200,%o2 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i5,%o2,%i5 L77003: [%i4],%l0 [%i5],%l1 4,%i4 %l1,%l0,%l1 %l1,[%i5] cmp %i4,%i3 blu L77003 4,%i5 ret reore.seg "data"

P2_3.S a(i)=a(i)+a(i-1) save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i4,12,%l0 cmp %l0,%i3 %fp,-200,%o2 bcc L77010 %i5,%o2,%i5 L77003: [%i5],%l2 [%i4],%l1 %l2,%l1,%l2 %l2,[%i5] [%i4+4],%l3 [%i5+4],%l4 %l4,%l3,%l4 %l4,[%i5+4] [%i4+8],%l5 [%i5+8],%l6 %l6,%l5,%l6 %l6,[%i5+8] [%i4+12],%l7 [%i5+12],%i0 16,%i4 %i4,12,%i1 %i0,%l7,%i0 %i0,[%i5+12] cmp %i1,%i3 blu L77003 16,%i5 cmp %i4,%i3 bcc L77006 nop L77010: [%i4],%i2 [%i5],%o0 4,%i4 %o0,%i2,%o0 %o0,[%i5] cmp %i4,%i3 bcs L77010 4,%i5 L77006: ret reore.seg "data"

P3_2.S a(i)=b(i)+c(i).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %fp,-200,%i3 %i4,%i3,%i3 %i4,%i5,%i5 %fp,-400,%o4 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i4,%o4,%i4 L77003: [%i4],%l2 [%i5],%l3 4,%i5 %l2,%l3,%l2 %l2,[%i3] cmp %i5,%i2 4,%i4 blu L77003 4,%i3 ret reore.seg "data"

P3_3.S a(i)=b(i)+c(i) _main: save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %i4,%i5,%i5 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i5,12,%l2 %fp,-200,%i3 %i4,%i3,%i3 cmp %l2,%i2 %fp,-400,%o4 bcc L77010 %i4,%o4,%i4 L77003: [%i5+12],%o3 [%i5+8],%o0 [%i5+4],%l7 [%i5],%l4 [%i4+12],%o2 [%i4+8],%i1 [%i4+4],%l6 [%i4],%l3 16,%i5 %i5,12,%o5 %l3,%l4,%l3 %l6,%l7,%l6 %i1,%o0,%i1 %o2,%o3,%o2 %o2,[%i3+12] %i1,[%i3+8] %l6,[%i3+4] %l3,[%i3] cmp %o5,%i2 16,%i4 blu L77003 16,%i3 cmp %i5,%i2 bcc L77006 nop L77010: [%i5],%l0 [%i4],%o7 4,%i5 %o7,%l0,%o7 %o7,[%i3] cmp %i5,%i2 4,%i4 bcs L77010 4,%i3 L77006: ret reore

B ALPHA En ea segunda máquina vamos a repetir el análisis anterior, pero con eos dos programas: p1.c #define N 50 int a[n]; main() { int i; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=0; i<=n; i++) a[i] = a[i-1] + 3; Los programas se compilan de la misma manera: cc S -Ox unroll n nombre.c -Ox nivel de optimización (x = 1, 2, 3, 4) -S genera código en ensamblador (genera el fichero nombre.s) -unroll n para indicar el nivel de desenrolle del bucle (1 no desenrollar) Compila el programa P1 con las opciones O4 unroll 1 (no desenrollar). Analiza el fichero.s. Qué ha hecho el compilador? Repite lo anterior con el programa P2. Qué ha hecho el compilador? Desenrolla el bucle P2 dos veces. Y ahora? Para terminar, desenrolla dos veces el programa P1 (-unroll 2). Qué hace el compilador ea vez?

P1_O4_u1.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $1, a($gp)!literal!2 # 000006 l $3, ($1)!lituse_base!2 a $2, 4($1)!lituse_base!2 l $31, 60($2) a $1, 200($1)!lituse_base!2 cmpult $2, $1, $5 l $3, 3, $3 beq $5, L$4 L$5: a $2, 4($2) l $31, 64($2) l $6, -4($2) cmpult $2, $1, $16 l $3, -8($2) l $6, 3, $3 bne $16, L$5 L$4: l $3, -4($2).loc 1 7 # 7 } clr $0 # 000007 ret ($26).end main

P1_O4_u2.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $2, a($gp)!literal!2 # 000006 l $31, 48($2)!lituse_base!2 a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 L$7: l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0 # 000007.loc 1 6 l $23, -8($2) # 000006 l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 L$4:.loc 1 6 l $3, -8($2) # 000006 l $6, -4($2).loc 1 7 clr $0 # 000007.loc 1 6 l $3, 3, $5 # 000006 l $6, 3, $6 l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26)

.end main # 000007

P2_O4_u1.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $3, -4($0) a $0, 4($0) cmpult $0, $1, $4 l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main

P2_O4_u2.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $31, 44($0) l $3, -4($0) a $0, 8($0) l $3, 3, $3 cmpult $0, $1, $4 l $3, -8($0) l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main

P1_O4_u2.s a(i) = a(i) + 3... (bis) L$7: a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0.loc 1 6 l $23, -8($2) l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 # 000006 # 000007