Clase 20: Recorridos de arreglos y modo indirecto

Entrega para el viernes 6/11

    Esta pregunta es obligatoria.
    Esta pregunta es obligatoria.
    Esta pregunta es obligatoria.
    Esta pregunta es obligatoria.
    Nunca envíes contraseñas a través de Formularios de Google.

(Recuperatorios) Calificaciones C1

Nota 1er Recu Nota 2do Recu Estado
Almeida Matias Ignacio #N/A 8 Promociona
Centurion Maximiliano Ezequiel 4 3 Desaprobado
Ferreiro Luciano Tomas #N/A 6 Promociona
Frende Julian Ignacio #N/A 2 Desaprobado
Gioya Ignacio Julio #N/A 4 Debe Integrador
Godoy Fabio Andres #N/A 1 Desaprobado
Gomez Ivan #N/A 2 Desaprobado
Mamani Martin Pablo 9 #N/A Debe Integrador
Montero Fernando Sebastian #N/A 7 Promociona
Otarola Florencia Anahi Desap #N/A Desaprobado
Rodas Ezequiel Alberto #N/A 7 Promociona
Rodriguez Nicolas Leonel 8 #N/A Promociona
Ruiz Miguel Nicolas #N/A 8 Promociona
Sardi Facundo #N/A 9 Promociona
Taborda Franco Ariel Desap Desap Desaprobado

Bitácora C1 16/06/2015

Memoria Caché

La memoria caché es una memoria intermedia (entre la uc y la memoria principal) donde se guardan los valores o instrucciones mas accedidas. Se compone de celdas de almacenamiento que reciben el nombre de líneas (slots, ranuras). Una línea almacena un bloque de celdas de memoria principal y un tag (etiqueta)  que permite identificar al bloque.
Los bloques son divisiones conceptuales de las celdas de memoria. Por ejemplo, si tenemos una memoria principal de 256 celdas (8 bits de dirección) y una memoria caché con bloques de 4 celdas, entonces se usarán 6 bits como tag de los bloques y los 2 bits restantes se usarán como índice al querer acceder a una celda dentro del bloque almacenado en la línea de caché.
Cómo funciona:
  Para lectura de celda de memoria:
  1. La unidad de control pide el contenido de una celda.
  2. La caché verifica si tiene el contenido de esa celda. Para hacerlo, verifica que tenga guardado el bloque en el que se encuentra esa celda. Si no lo tiene (ocurre un fallo), le pide a la memoria principal el bloque y lo almacena junto con un tag que indica el número de bloque.
  3. Finalmente, es la caché la que devuelve el valor. Tomando el bloque, accede al valor de la celda a través del índice o palabra. Éste lo saca de los últimos bits de la dirección de memoria solicitada.
Para escritura en celda de memoria:
  1. La unidad de control pide una escritura de un valor en una celda de memoria.
  2. La caché verifica si está cacheada. Si no lo está, cachea el bloque correspondiente y luego lo actualiza.
  3. La caché pide la escritura del valor en la celda de memoria.

Función de correspondencia completamente asociativa

En una caché con esta función de correspondencia, cualquier bloque puede estar en cualquier línea y por lo tanto se necesita tener un tag que identifique absolutamente el contenido de esa línea.

Para verificar si una celda de memoria está cacheada, la memoria caché compara el tag de cada línea con la dirección enviada desde la UC (o parte de esa dirección), y lo hace de manera simultánea. Esta simultaneidad requiere que esté implementada con circuitos comparadores para cada línea, característica que puede resultar costosa. Existen otros enfoques (otras funciones de correspondencia) que mejoran este aspecto, pero que sacrifican otros, y que describiremos en la próxima bitácora…

Bitácora C1 22/05/2015

Se comenzó la clase directamente con introducción al nuevo tema (ya que la clase pasada fue el parcial! 🙂 )
Se entregó una fotocopia en la que se pedía encontrar una manera para comprimir los siguientes números:
62000000000000000000000 y 0,0000000000000000000062

y la manera de resolverlo es usando notación científica. La notación científica es una manera de abreviar números muy grandes o muy chicos que tengan muchos 0, y se lo logra de la siguiente manera: Se agarra la parte del número que es distinta que 0, en este caso, 62, y se lo multiplica por 10^n, (si el numero es mayor a 1) siendo n la cantidad de 0 que tiene el numero, en este caso, 21, o se lo multiplica por 10^-n (si el numero esta entre 1 y 0) siendo n tambien la cantidad de 0 que hay en el número. Por lo tanto: 62000000000000000000000 = 62 x 10^21 0,0000000000000000000062 = 62 x 10^-21 Generalizando, en decimal un numero se puede expresar en notación científica como: N = m x 10^e Donde N es el número, m la mantisa (la parte distinta de 0), y e es el exponente mencionado anteriormente.
Esto nos sirve para introducir el nuevo tema, Punto Flotante!

Punto Flotante usa está manera de representar números para poder representar cosas muy chicas, y también cosas muy grandes. La única diferencia que nos trae problemas es que la notación científica, como vimos, se usa en el sistema decimal, por lo que, así como está, no nos sirve para utilizar en sistema binario, pero… lo podemos salvar!

En vez de utilizar la representación de un número como la composición de “mantisa x 10^exponente”, lo componemos como “mantisa x 2^exponente”, y con eso ya lo podemos usar en sistema binario. Eso es exactamente lo que se hace en Punto Flotante.

Ahora… Cómo utilizo una cadena para escribir un número como una composición?

Fácil, se “parte” la cadena en dos partes, mantisa y exponente, dado que son las únicas variables que entran en juego en la composición. Por lo tanto, yo puedo armar sistemas de Punto Flotante de la siguiente manera:

Elijo un sistema para representar a la mantisa, por ejemplo, BSS(2), y elijo un sistema para representar al exponente, por ejemplo, BSS(3), y luego tengo que explicitar que parte de la cadena va primero, y que parte de la cadena va después, en este caso yo elegí que la mantisa vaya primero, y el exponente después ( e: BSS(2) / m: BSS(3) )

Ahora una cadena para nuestro sistema va a tener 2 bits para mantisa, y 3 bits para exponente, por lo tanto, van a ser cadenas de 5 bits.

Para interpretar una cadena en este sistema se hace lo siguiente:
* Recibo la cadena y la “parto” en mantisa y exponente, ya que voy a tener que interpretarlos por separado.

* Interpreto la mantisa en su correspondiente sistema (en este caso, BSS(2))

* Interpreto el exponente en su correspondiente sistema (en este caso, BSS(3))

* Compongo el numero con la formula (N = m x 2^e)

Ejemplo: 11110    e: BSS(2) / m: BSS(3)

* Parto la cadena -> 11 = m, 110 = e.

* Interpreto la mantisa -> I<BSS(2) 11> = 3

* Interpreto el exponente -> I <BSS(3) 110> = 6

* Compongo el número -> N = 3 x 2^6 = 3 x 64 = 192.

Luego pasamos a calcular el rango, con lo que necesitamos saber el máximo y el mínimo número representable…

Cómo saber cuál es el máximo y el mínimo representable? Veamos un par de ejemplos

  1. Exponente CA2(5) / Mantisa BSS(8)
    1. Máximo: I(01111 11111111) = I(11111111) *  2^15 = 255 * 2^15
    2. Mínimo: I(00000 00000000) = I(00000000) * 2^0 = 0 * 2^0, El número 0! (con cualquier exponente, en este caso elegí 2^0, pero puede ser cualquiera)
  2. Signo / Exponente CA2(5) /Mantisa Magnitud(7) (El signo y la magnitud del SM(8) estan separados, el signo al principio de la cadena, la magnitud al final)
    1. Máximo: I(0 01111 1111111) = +I(1111111) *  2^15 = +127 * 2^15
    2. Mínimo: I(1 01111 1111111) = +I(1111111) *  2^15 = – 127 * 2^15

Y así como podemos calcular el rango, también podemos calcular la resolución, pero…

Cuál es la resolución de estos sistemas? Veámoslo en el sistema e: BSS(2)/m: BSS(2),

Considerando la cadena: 1010. ¿Cuál es el siguiente número representable? el representado con la cadena 1011 o el de la cadena 1110?

I(1010) = 2*2^2 = 8

I(1011) = 3*2^2 = 12   ¡ok!

I(1110) = 2*2^3 = 16

Resolución I(1011) – I(1010) = 3*2^2 – 2*2²^2= (3-2) * 2^2 = 1*2^2 = 2^2

Veamos ahora este caso ¿Que cadena sigue a la cadena 0110?

I(0110) = 2 * 2^1

I(0111) = 3 * 2^1

Resolución = I(0111) – I(0110) = 3*2^1 – 2*2`1 = (3-2) * 2^1 = 1*2^1 = 2^1

Cómo vemos, la resolución no es la misma en ambos casos. Esto se debe a que en Punto Flotante, la resolución (a diferencia con todos los otros sistemas que veníamos usando) NO es constante. La resolución varía porque tenemos un exponente que la hace variar. Cuando el exponente es menor, la resolución es menor, cuando el exponente es mayor, la resolución es mayor.

Normalización

Algo peculiar de la notación científica es la posibilidad de representar el mismo valor con distintas cadenas. Veamos este ejemplo en el sistema m:sm(8) / e:ca2(5), con el formato (s)(e)(m)

Interpretar:

  • 0 00000 0000100 → + 4 * 2⁰ = 2²
  • 0 00001 0000010 → + 2 * 2¹ = 2²
  • 0 00010 0000001 → + 1 * 2² = 2²

No es deseable tener múltiples representaciones para el mismo valor, entonces se elige una sola de ellas como cadena válida para ese número: la que comienza con 1 en la mantisa. En el ejemplo anterior la única cadena normalizada es 0 11100 1000000, pues:

e = Ica2(11100) = – I(00011+1) = -4

m = Ism(01000000) =2⁶

n= 64 * 2⁻⁴ = 2⁶*2⁻⁴ = 2²

¡Pero esto implica que se descarten la mitad de las cadenas!

Para solucionarlo, considerando que todas las cadenas empezarían con 1 entonces no tiene sentido escribir ese primer 1, y por lo tanto se lo deja implícito.