sábado, 12 de enero de 2013

Practica 8: WinDLX(2)


En esta práctica seguiremos profundizando en el uso del programa WinDLXV desde el cual observaremos el funcionamiento del pipeline de un procesador, así como los efectos que podemos conseguir modificando nuestro código.

Condiciones iniciales:

·         Unidad de suma: latencia 2 ciclos.
·         Unidad de multiplicación: latencia 5 ciclos.
·         Unidad de división: latencia 19 ciclos.
·         Unidades funcionales sin segmentar.
·         Saltos: predicción de no tomar.
·         Adelantamiento de resultados: desactivado.


  • Ejercicio 1:

aa)    Simular el programa y determinar la ganancia de velocidad que se obtiene si se permiten caminos de bypass (opción adelantamiento de resultados activada).
Sin adelantamiento de salto:
416 Ciclos
123 Instrucciones
3,382 Ciclos de reloj por instrucción (CPI)
Con adelantamiento de salto:
318 Ciclos
123 Instrucciones
2,585 Ciclos de reloj por instrucción (CPI)

Ganancia de velocidad: 23,55%

bb)    Partiendo de la configuración inicial, considere que se efectúa una mejora en la unidad de multiplicación, reduciendo su retardo a 3 ciclos. Esta mejora supone un incremento del coste del 15%. Determine si, para el este programa, compensa realizar dicha mejora desde el punto de vista de la relación coste/prestaciones. 
Reduciendo el retardo a 3 ciclos en la multiplicación:

270 Ciclos
123 Instrucciones
2,195 Ciclos de reloj por instrucción (CPI)

Ganancia de velocidad: 15%.
Compensa realizar la mejora.

cc)    Considere que la mejora consiste en reducir el retardo de la unidad de multiplicación a 2 ciclos, con un incremento del coste del 18%. ¿Compensa la mejora?
Reduciendo el retardo a 2 ciclos en la multiplicación:

246 Ciclos
123 Instrucciones
2 Ciclos de reloj por instrucción (CPI)

Ganancia de velocidad: 22,6%.
La mejora compensa el coste.

dd)     ¿Tendría interés mejorar la latencia de la unidad de suma?

No. No se está realizando ninguna operación de suma, por tanto aunque se mejore la latencia de la unidad de suma, no influirá en nada.

  • Seleccione la opción “salto retardado” y ejecute el programa. ¿Qué ocurre? ¿Cuál es la causa? ¿Cuál sería la solución?
                    
Datos con el salto retardado activado:
16 Ciclos
8 Instrucciones
2000 Ciclos de reloj por instrucción (CPI)


El programa se ejecuta de manera más rápida a causa de que se ejecutan menos instrucciones, el motivo de esta reducción de instrucciones es que con esa opción no se comprueba si el salto ha sido o no efectivo, simplemente se ejecuta la siguiente instrucción.
La solución más obvia es no activar el salto retardado para que sean evaluados.



  •  La siguiente figura (pract2v2.s) muestra una versión modificada del código inicial, que se ha transformado aplicando una técnica que recibe el nombre de desenrollado de bucle. Esta técnica consiste en realizar los cálculos de varias iteraciones en una única iteración para reducir así el número de instrucciones de salto que se tienen que ejecutar, con lo que además se evitan riesgos de control.

Determinar la ganancia de velocidad que se obtiene con respecto a la versión inicial del programa.

Datos versión modificada:
326 Ciclos
87 Instrucciones
3,747 Ciclos de reloj por instrucción (CPI)

Ganancia de velocidad: 21,63%.


  • Modificar el programa del apartado 3 (pract2v3.s) de forma que incluya 8 iteraciones en el bucle. Determinar la ganancia de velocidad que se obtiene con respecto a las versiones anteriores.

El nuevo programa sería el siguiente:

.data 0
a:         .double 3.14159265358979

x:         .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
.double 17,18,19,20,21,22,23

xtop:    .double 24
.text 256

start:ld f2,a
addi r1,r0,xtop

loop:    ld f0,0(r1)
multd f4,f0,f2
sd 0(r1),f4
ld f6,-8(r1)
multd f8,f6,f2
sd -8(r1),f8
ld f10,-16(r1)
multd f12,f10,f2
sd -16(r1),f12
ld f14,-24(r1)
multd f16,f14,f2
sd -24(r1),f16
ld f18,-32(r1)
multd f20,f18,f2
sd -32(r1),f20
ld f22,-40(r1)
multd f24,f22,f2
sd -40(r1),f24
ld f26,-48(r1)
multd f28,f26,f2
sd -48(r1),f28
ld f30,-56(r1)
multd f8,f30,f2
sd -56(r1),f8
subi r1,r1,32
bnez r1,loop
trap 6

Las líneas destacadas en azul marcan los cambios añadidos.
Datos del nuevo programa:
Ciclos: 573
Instrucciones: 147
Ciclos de reloj por instrucción (CPI): 3,898


No existe ganancia, el programa empeora.



  • Partiendo de la versión del apartado 3, reorganizar las instrucciones (pract2v4.s) para reducir el efecto de las dependencias entre ellas. Simular la versión realizada y determinar la ganancia de velocidad obtenida.

Programa reorganizado:

Agrupamos las instrucciones de tipo ld, sd y multd para evitar utilizar un registro en el que el dato aún no se ha cargado.
.data 0
a:                    .double 3.14159265358979
x:                     .double 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
.double 17,18,19,20,21,22,23
xtop:    .double 24
.text 256
start:    ld f2,a
addi r1,r0,xtop
loop:
ld f0,0(r1)
ld f6,-8(r1)
ld f10,-16(r1)
ld f14,-24(r1)
multd f4,f0,f2
multd f8,f6,f2
multd f12,f10,f2
multd f16,f14,f2
sd 0(r1),f4
sd -8(r1),f8
sd -16(r1),f12
sd -24(r1),f16
subi r1,r1,32
bnez r1,loop
trap 6
Datos del programa reorganizado:
Ciclos: 224
Instrucciones: 87
Ciclos de reloj por instrucción (CPI): 2,575

Ganancia de velocidad: 31,29%

miércoles, 9 de enero de 2013

Estado del trabajo

A día de hoy ya han sido publicadas todas las entradas que estaban planificadas para esta fecha. Ahora toca revisar las prácticas, corregir lo que sea necesario y preparar la exposición, para lo que contamos con casi una semana, que no está nada mal.

Respecto a las prácticas que serán expuestas, el requisito es que sean 4 y que sean mínimamente relevantes, por lo que, en mi opinión, lo mejor sería que se expusieran la 3ª, la 5ª, la 6ª y la 7ª o la 8ª, al tener todas relación con el temario. Respecto a la 7ª y la 8ª, no se muy bien cual deberíamos presentar porque las dos van de lo mismo, así que si uno de sus autores tiene especial interés en salir, que lo diga, y si no pues ya se propondrá uno de ellos.

Editado: Confirmo que finalmente se presentarán las prácticas 3, 5, 6 y 7, siendo representativas de los aspectos vistos en la asignatura. Si alguien tiene algún inconveniente que me lo comunique y veremos qué podemos hacer.

Y eso es todo por ahora. Recordad hacer las correcciones y no faltéis el martes!

Saludos.

Práctica 5: Ensamblador del procesador MIPS e introducción al simulador Simula3M


Introducción
En el objetivo de esta práctica es comprender el funcionamiento de un instrucción a instrucción en un procesador MIPS.

Para el desarrollo de la práctica se ha utilizado el entorno de simulación Simula3MS.
Simula3MS es un proyecto del grupo de Arquitectura de Computadores de la Universidad de A Coruña,  es un simulador orientado al estudio de las asignaturas que tratan la arquitectura y organización del computador, que implementa un subconjunto de instrucciones basadas en el repertorio de instrucciones del procesador MIPS R2000/R3000 . Cuenta con un entorno de trabajo gráfico y de fácil manejo que permite depurar cómodamente los programas, observar la evolución de la memoria, así como la ejecución de las instrucciones sobre distintos caminos de datos. La presencia de las distintas implementaciones en la misma herramienta permite observar las diferencias de ejecución de un mismo código según cuales sean las características del procesador. 


Desarrollo 
Es necesario realizar una lectura del manual adjunto a la práctica, para el correcto desarrollo de la misma.
En primer lugar, se escribe el programa que se muestra en la figura.


Se guarda el fichero y se pulsa el botón ensamblar.



A continuación si en la zona de errores no aparece ninguno, se procede a la ejecución del código.


Ahora se va haciendo uso del botón "Ciclo siguiente", se indicara en azul la instrucción que esta en 
ejecución.


 Los cambios tras la ejecución son los siguientes:

Registros:

$t0: 10010000               $s0: 00000064
$t1: 10010004               $s1: fffffff6
$t2: 10010008               $s2: 0000005a

Memo datos:

Dirección 0x10010000: 0x00000064
Dirección 0x10010004: 0xfffffff6
Dirección 0x10010008: 0x0000005a

En segundo lugar, se escribe el siguiente código, ejecuta.


Explicación del código:
En primer lugar se guarda la dirección de array_word en t1, a continuación se van guardando los valores que contiene el vector en s0, s1, s2 y s3; para ello en cada instrucción tiene un desplazamiento múltiplo de 4.

Contenido del segmento de datos de memoria al inicio de la ejecución:
0x10010000: 0x000000d2
0x10010004: 0x000000f0
0x10010008: 0x0000014a
0x1001000c: 0x00001608

Contenido del registro t1 antes de la ejecución:
t1; 00000000

Valor del registro PC antes de la ejecución:
PC: 00400000

Contenido de los registros siguientes al término de la ejecución:
s0: 000000d2
s1: 000000f0
s2: 0000014a

Valor del registro PC al término de la ejecución:
PC: 00400018 

En tercer lugar, se escribe el siguiente código que incluye llamadas al sistema.

En este programa se asocia una llamada para imprimir por pantalla, de valor decimal 1, esta  muestra el decimal 15 (0000000F) al realizar la llamada (syscall). Y al final la llamada indica al procesador que se termina es EXIT con valor decimal 10.

Por ultimo, se construye un programa que solicite por teclado tres valores enteros y los almacene en un vector, este vector tendrá cuatro palabras de memoria. tres para los enteros y una para el resultado de la suma de estos.

.data
vector: .space 16   #Reserva de memoria para 4 enteros

.text
.globl main
main:

la $t0,vector       # Cargar en registro $t0, en el vector

li $v0,5            # Establece una llamada para que un entero sea almacenado en v0
syscall
sll $s0,$v0,0       # Almacena el valor de v0 en a $s0

li $v0,5                         
syscall
sll $s1,$v0,0       # Almacena el valor de v0 en a $s1                         
                          
li $v0,5                         
syscall
sll $s2,$v0,0       # Almacena el valor de v0 en a $s2
                          
add $t1,$s0,$s1     # t1 = s0 + s1
add $t1,$t1,$s2     # t1 = t1 + s2
      
sw $s0,0($t0)       # Guardar en memoria los valores leidos
sw $s1,4($t0)
sw $s2,8($t0)

sw $t1, 12($t0)     # Guardar en memoria el resultado de la suma

sll $a0, $t1,0      # Almacena el valor de ta en a $a0
li $v0, 1                                            
syscall             # Lo muestra por pantalla

li $v0,10           # Llamada que indica al procesador que se ha terminado la ejecución







viernes, 4 de enero de 2013

PRÁCTICA 2: BENCHMARKS

Introducción
En esta práctica, tendremos un primer contacto con los Benchmarks, que son conjuntos de programas que nos permiten evaluar el rendimiento de un computador.

En este caso, usaremos el programa Performance Test v7.0 ( en la práctica se proporciona una página donde podemos descargar una versión de evaluación de 30 días).
El Performance Test es un Benchmark que nos ofrece la valoración del rendimiento de un computador y compararlo con otros computadores, que el mismo programa nos proporciona.
Esta valoración se basa en una serie de test o suites que más adelante explicaremos brevemente, ya que en la práctica se aborda este tema.
Al final, el programa nos da un valor único final ( Passmark rating), que es un valor medio ponderado de todos los test, aunque nos da la valoración de cada uno de ellos por separado.

Desarrollo
Una vez explicado el procedimiento de este Benchmark, empezamos con la práctica:

Ésta, se compone de 5 apartados, aunque en realidad son 4, luego explicaremos por qué.
El primer apartado, se basa en una búsqueda de información en el menú de ayuda:



a) El número de series de test (test suites) estándar que emplea el programa y los
tests específicos que conforman cada serie. Realice una breve descripción de
cada uno de ellos.

Los test se agrupan en 5 suites diferentes :
-Suite de test para la CPU.
-Suite de test para gráficos en 2D.
-Suite de test para gráficos en 3D.
-Suite de test de memoria.
-Suite de test de disco.

Realizamos una breve descripción de cada suite del programa Performance Test:
Suite de test para la CPU:
Pone a prueba la CPU mediante las siguientes pruebas:
- Test de enteros.
- Test de números en coma flotante.
- Test de números primos.
- Test para el set de instrucciones SSE.
- Test de encriptación.
- Test de compresión.
- Test de física.

Suite de test para gráficos en 2D:
Esta suite se encarga de medir la potencia de los gráficos 2D. También está compuesto por vaios
test:
- Test de vectores.
- Test de vectores complejos.
- Test de rendimiento de ventanas.
- Test tipográfico y de texto.
- Test de filtros de imagen.
- Test de Direct2D.
- Test de renderización de imagen.

Suite de test para gráficos en 3D:
Mide la potencia de los gráficos 3D. Para ello, usa librerías Directx9 o superiores.
Cada test genera una gran cantidad de polígonos en pantalla, en diferentes resoluciones y
con diferentes filtros.

Suite de test de memoria:
Se encarga de medir la capacidad de procesamiento de la memoria. Realiza esta medición
mediante la elaboración de grandes estructuras de datos. También realiza una serie de test de
lectura y escritura sobre la memoria; además de tener en cuenta la RAM disponible y la
latencia de datos de la RAM a la CPU.

Suite de test de disco:
Destinado a medir la capacidad de lectura y escritura secuencial de las unidades de disco y
la capacidad de transmisión de bloques de datos de un sector a otro, o lectura de cd’s /
DVD’s.

b) El peso asignado a cada una de las series para determinar la clasificación final.
El porcentaje es:
· CD/DVD: 5%
· Disco: 21%
· Memoria: 19%
· Gráficos 2D: 14%
· Gráficos 3D: 12%
· CPU: 29%
· Total: 100%
c) Las unidades usadas para medir:
- La cantidad de información transferida hacia o desde la unidad de disco o la memoria :
MBytes/segundo

- El número de operaciones matemáticas con enteros o en coma flotante :
Millones de operaciones/segundo

- Las prestaciones gráficas en 2D :
Vectores dibujados/segundo
Filtros aplicados/segundo
Imágenes en bitmap/segundo renderizadas.

- Las prestaciones gráficas en 3D :
Frames/segundo.

En el segundo apartado de la práctica se nos pide que anotemos la información más importante del computador bajo prueba. Esto se consigue pinchando en la pestaña System.


Características de mi equipo:
-CPU:
Dual Core Radeon 6290
2 núcleos
997.9 MHz

-Memoria RAM:
1773 MB de memoria.

-Sistema operativo:
Windows 7 (64 bit)

-Tarjeta gráfica:
AMD Radeon HD 6290 Graphics.
256 MB



LLegamos al tecer apartado de la misma, en el que hacemos un test completo del computador(esto se obtiene pinchando en tests, run all tests).
Se pide una tabla con los resultados:

Test 
Resultado 
CPU 
311.0 
 Gráficos 2D
 52.1
Gráficos 3D 
 165.0
 Memoria
 98.2
 Disco
519.5 
 Puntuación total
183.0 



En el cuarto apartado, se nos pide que elijamos dos de las máquinas que nos ofrece el programa y comparemos los resultados. Elegimos las dos siguientes:

Inspiron 700M Pentium 1595 Laptop BL6
Test 
Resultado 
CPU 
448.8
 Gráficos 2D
 189.2
Gráficos 3D 
 46.7
 Memoria
 220.0
 Disco
70.6
 Puntuación total
215.3

Xm4200 Pentium 4 3196 BL2
Test 
Resultado 
CPU 
574.0
 Gráficos 2D
 178.9
Gráficos 3D 
 133.7
 Memoria
452.2
 Disco
257.9
 Puntuación total
404.4

Elegimos estas dos máquinas por el criterio de características similares con nuestro computador.
Al comparar, vemos que aun teniendo una puntuación final más baja, nuestro equipo destaca en algunos aspectos, como en los gráficos 3D o en Disco.
Con esto, nos damos cuenta de la importancia que tiene una buena configuración, para poder sacar un mejor rendimiento a nuestro computador.

En el último apartado, se pide que se pase el mismo test al computador de casa y se compare, pero al realizarse esta práctica en casa, no es posible hacerlo.

Conclusión
En esta práctica no he encontrado mucha dificultad, de hecho, en mi opinión, viene todo demasiado explicado y ejemplificado en el pdf que se proporciona.
Quizás habría que dar algún dato menos, para que el alumno se ponga a investigar el programa un poco más y no sea solo seguir una guía.
Por lo demás, no veo nada que añadir, los apartados me parece que están bien para conocer varias fases del programa y lo del último apartado, entiendo que no es debido a los profesores de la asignatura, ya que ese día no se pudo dar clase por razones ajenas a ellos.

David Pérez Gil