miércoles, 17 de junio de 2009

3.e Análisis de la jerarquía de memoria de una arquitectura comercial (incluido esquema de ubicación de cada nivel de la memoria y cálculos de anchos

DDR2

Es un tipo de memoria RAM que forma parte de la familia SDRAM de tecnologías de memoria de acceso aleatorio, que es una de las muchas implementaciones de la DRAM.


Los módulos DDR2 son capaces de trabajar con 4 bits por ciclo, es decir 2 de ida y 2 de vuelta en un mismo ciclo mejorando sustancialmente el ancho de banda potencial bajo la misma frecuencia de una DDR SDRAM tradicional (si una DDR a 200 MHz reales entregaba 400 MHz nominales, la DDR2 por esos mismos 200 MHz reales entrega 800 MHz nominales). Este sistema funciona debido a que dentro de las memorias hay un pequeño buffer que es el que guarda la información para luego transmitirla fuera del modulo de memoria, este buffer en el caso de la DDR convencional trabajaba tomando los 2 bits para transmitirlos en 1 sólo ciclo, lo que aumenta la frecuencia final. En las DDR2, el buffer almacena 4 bits para luego enviarlos, lo que a su vez redobla la frecuencia nominal sin necesidad de aumentar la frecuencia real de los módulos de memoria. En la siguiente figura podemos ver un módulo DDR2 de 1GB con disipador.



Las memorias DDR2 tienen mayores latencias que las conseguidas con las DDR convencionales, cosa que perjudicaba su rendimiento. Reducir la latencia en las DDR2 no es fácil. El mismo hecho de que el buffer de la memoria DDR2 pueda almacenar 4 bits para luego enviarlos es el causante de la mayor latencia, debido a que se necesita mayor tiempo de "escucha" por parte del buffer y mayor tiempo de trabajo por parte de los módulos de memoria, para recopilar esos 4 bits antes de poder enviar la información.



Características

    • Las memorias DDR2 son una mejora de las memorias DDR (Double Data Rate), que permiten que los búferes de entrada/salida trabajen al doble de la frecuencia del núcleo, permitiendo que durante cada ciclo de reloj se realicen cuatro transferencias.

    • Operan tanto en el flanco alto del reloj como en el bajo, en los puntos de 0 voltios y 1.8 voltios, lo que reduce el consumo de energía en aproximadamente el 50 por ciento del consumo de las DDR, que trabajaban a 0 voltios y a 2.5.

    • Terminación de señal de memoria dentro del chip de la memoria ("Terminación integrada" u ODT) para evitar errores de transmisión de señal reflejada



Estándares

Para usar en PC, las DDR2 SDRAM son suministradas en tarjetas de memoria DIMMs con 240 pines y una localización con una sola ranura. Las tarjetas DIMM son identificadas por su máxima capacidad de transferencia (usualmente llamado ancho de banda).



DDR2-xxx indica la velocidad de reloj efectiva, mientras que PC2-xxxx indica el ancho de banda teórico (aunque suele estar redondeado). El ancho de banda se calcula multiplicando la velocidad de reloj E/S por ocho, ya que la DDR2 (como la DDR) es una memoria de 64 bits, hay 8 bits en un byte, y 64 es 8 por 8 y por último por 2 (doble tasa de transferencia), esto se empezó a usar para mostrar la velocidad de transferencia frente a las memorias "Rambus" que eran mas rápidas en sus ciclos de reloj operación, pero solo eran de 16 bits



Retrocompatibilidad

Los módulos DIMM DDR2 no son compatibles con los DDR. La muesca está en una posición diferente (los zócalos son distintos) y la densidad de pines es ligeramente superior. Los módulos DDR2 tienen 240 pines a diferencia de los DDR que tienen 184 pines.

Los módulos DIMM DDR2 de una determinada velocidad, sí son compatibles con módulos DDR2 de inferior velocidad. La memoria puede funcionar a velocidades inferiores a las que está etiquetado, simplemente el bus del sistema funcionará a la velocidad del módulo más lento.



Variante GDDR

El primer producto comercial en afirmar que usaba tecnología DDR2 fue la tarjeta gráfica nVIDIA GeForce FX 5800. Sin embargo, es importante aclarar que la memoria "DDR2" usada en las tarjetas gráficas (llamada oficialmente GDDR2) no es DDR2, sino un punto intermedio entre las DDR y DDR2. De hecho, no incluye el (importantísimo) doble ratio del reloj de entrada/salida, y tiene serios problemas de sobrecalentamiento debido a los voltajes nominales de la DDR. ATI Technologies ha desarrollado aún más el formato GDDR, hasta el GDDR3, que es más parecido a las especificaciones de la DDR2, aunque con varios añadidos específicos para tarjetas gráficas.


Tras la introducción de la GDDR2 con la serie FX 5800, las series 5900 y 5950 volvieron a usar DDR, pero la 5700 Ultra usaba GDDR2 con una velocidad de 450 MHz (en comparación con los 400 MHz de la 5800 o los 500 MHz de la 5800 Ultra).


La Radeon 9800 Pro de ATI con 256 MiB de memoria (no la versión de 128 MiB) usaba también GDDR2, porque esta memoria necesita menos pines que la DDR. La memoria de la Radeon 9800 Pro de 256 MiB sólo va 20 MHz más rápida que la versión de 128 MiB, principalmente para contrarrestar el impacto de rendimiento causado por su mayor latencia y su mayor número de chips. La siguiente tarjeta, la 9800 XT, volvió a usar DDR, y posteriormente ATI comenzó a utilizar GDDR3 en su línea de tarjetas Radeon X800.

Actualmente, la mayoría de las tarjetas tanto de ATI como de nVIDIA usan el formato GDDR3; no obstante, ATI ya ha comenzado a distribuir las HD4890, que utilizan la nueva tecnología GDDR5 (que alcanza los 7GHz).



Integración

DDR 2 se introdujo a dos velocidades iniciales: 200 MHz (llamada PC2-3200) y 266 MHz (PC2-4200). Ambas tienen un menor rendimiento que sus equivalentes en DDR, ya que su mayor latencia hace que los tiempos totales de acceso sean hasta dos veces mayores. Sin embargo, la DDR no ha sido oficialmente introducida a velocidades por encima de los 266 MHz. Existen DDR-533 e incluso DDR-600, pero la JEDEC ha afirmado que no se estandarizarán. Estos módulos son, principalmente, optimizaciones de los fabricantes, que utilizan mucha más energía que los módulos con un reloj más lento, y que no ofrecen un mayor rendimiento.

Actualmente, Intel soporta DDR2 en sus chipsets 9xx. AMD incluye soporte DDR2 en procesadores de la plataforma AM2 introducidos en el 2006.

Los DIMM DDR2 tienen 240 pines, mientras que los de DDR tienen 184 y los de SDR 168.



DDR3

Es un tipo de memoria RAM que forma parte de la familia SDRAM de tecnologías de memoria de acceso aleatorio, que es una de las muchas implementaciones de la DRAM.


El principal beneficio de instalar DDR3 es la habilidad de hacer transferencias de datos ocho veces mas rápido, entonces permitiendo velocidades pico de transferencia y velocidades de bus más altas que las versiones DDR anteriores. Sin embargo, no hay una reducción en la latencia, la cual es proporcionalmente más alta. Además la DDR3 permite usar integrados de 512 megabits a 8 gigabytes, siendo posible fabricar módulos de hasta 16 Gb.


En febrero, Samsung Electronics anunció un chip prototipo de 512 MiB a 1066 MHz (La misma velocidad de bus frontal del Pentium 4 Extreme Edition más rápido) con una reducción de consumo de energía de un 40% comparado con los actuales módulos comerciales DDR2, debido a la tecnología de 80 nanómetros usada en el diseño del DDR3 que permite más bajas corrientes de operación y voltajes (1,5 V, comparado con los 1,8 del DDR2 ó los 2,5 del DDR). Dispositivos pequeños, ahorradores de energía, como computadoras portátiles quizás se puedan beneficiar de la tecnología DDR3. En la siguiente imagen podemos ver un módulo de DD3 SDRAM.



Teóricamente, estos módulos pueden transferir datos a una tasa de reloj efectiva de 800-2600 MHz, comparado con el rango actual del DDR2 de 533-1200 MHz ó 200-400 MHz del DDR. Existen módulos de memoria DDR y DDR2 de mayor frecuencia pero no estandarizados por JEDEC.


Si bien las latencias tipicas DDR2 fueron 5-5-5-15 para el estándar JEDEC para dispositivos DDR3 son 7-7-7-20 para DDR3-1066 y 7-7-7-24 para DDR3-1333.


Los DIMMS DDR3 tienen 240 pines, el mismo número que DDR2; sin embargo, los DIMMs son físicamente incompatibles, debido a una ubicación diferente de la muesca.


La memoria GDDR3, con un nombre similar pero con una tecnología completamente distinta, ha sido usada durante varios años en tarjetas gráficas de gama alta como las series GeForce 6x00 ó ATI Radeon X800 Pro, y es la utilizada como memoria principal de la Xbox 360. A veces es incorrectamente citada como "DDR3".


Los módulos más rápidos de tecnología DDR3 ya están listos al mismo tiempo que la industria se preparara para adoptar la nueva plataforma de tecnología.


Considerado el sucesor de la actual memoria estándar DDR2, DDR3 promete proporcionar significativas mejoras en el rendimiento en niveles de bajo voltaje, lo que lleva consigo una disminución del gasto global de consumo.


Muchas de las placas base que se mostraron en Computex 2007, basadas en los nuevos chipsets P35, ahora utilizan la tecnología DDR3


Se prevee que la tecnología DDR3 sea dos veces más rápida que la DDR2 y el alto ancho de banda que promete ofrecer DDR3 es la mejor opcion para la combinación de un sistema con procesadores dual y quad core (2 y 4 nucleos por microprocesador). El voltaje más bajo del DDR3 (HyperX 1,7 V contra 1,8 V con DDR2 y ValueRAM 1,5 V contra 1,8v con DDR2) ofrece una solución térmica más eficaz para los ordenadores actuales y para las futuras plataformas móviles y de servidor.

3.b ¿Cómo afectan las decisiones de organización de la cache a su rendimiento?

Introducción

El funcionamiento de una caché sigue un principio parecido al que formulamos para la memoria principal. En aquel caso, las instrucciones y datos se cargaban en la RAM (desde dispositivos lentos), donde la CPU podría acceder a mayor velocidad. Una caché de memoria se carga (desde la RAM) con los datos y/o instrucciones que ha buscado la CPU en las últimas operaciones.


La CPU buscará siempre primero la información en la caché, y la encontrará allí la mayoría de las veces, con lo que el acceso será muy rápido. Si desgraciadamente, no se encuentra la información en la caché, se perderá un tiempo extra en acudir a la RAM y copiar dicha información en la caché para que esté disponible. Como estos fallos ocurren con una frecuencia relativamente baja, el rendimiento mejora considerablemente, ya que la CPU accederá más veces a la caché que a la RAM.


Podemos definir por tanto dicho rendimiento como:


teniendo en cuenta que este valor para dicha memoria suele rondar entre un 85% y un 95%.



Jerarquía de niveles

Un PC incorpora varios tipos de caché. Pero, ¿de qué forma están organizados? Usualmente, los diferentes sistemas de caché se organizan por niveles, formando una jerarquía. En general se cumple que, a mayor cercanía a la CPU, se presenta mayor velocidad de acceso y menor capacidad de almacenamiento .


Para empezar, la caché de memoria se suele desglosar en dos niveles. En el nivel más cercano a la CPU se encuentra la caché L1 (level 1 o nivel 1). Ésta se halla integrada en el mismo chip que la CPU, con lo que el acceso se produce a la velocidad de trabajo del procesador (la máxima velocidad). Por supuesto, la caché L1 presenta un tamaño muy reducido (de 4 a 16 kB).

A continuación aparece la caché de nivel 2 o L2. Inicialmente, se instalaba en la placa base, en el exterior de la CPU. Los procesadores actuales la integran en el propio chip. Como era de esperar, tiene mayor capacidad que la caché L1 (de 128 a 512 kB) pero es una memoria más lenta.


El siguiente nivel lo constituye la memoria RAM, que suele hacer de caché para los dispositivos de almacenamiento y otros tipos de periféricos. El nivel más alto lo ocuparían las caché en disco duro, como son las utilizadas por los navegadores Web.


La búsqueda de información comienza por la caché L1, y se va subiendo nivel a nivel en caso de no encontrar lo que se busca en el nivel actual. Por supuesto, cuantas más capas haya que ascender, mayor retardo se pagará. Pero, a mayor cercanía a la CPU, la probabilidad de encontrar lo que se busca es mayor. Esta forma de trabajo resulta una excelente relación de compromiso entre diversos factores, y consigue mejorar el rendimiento del ordenador de forma notable.



Organización y funcionamiento interno

La entidad básica de almacenamiento de la caché la conforman las filas, a las que se llama también líneas de caché. Nunca se toma un byte de la RAM y se escribe en una celda de la caché. Por el contrario, en cada movimiento siempre se copia la información de la RAM suficiente para cubrir una línea de caché . En el caso de la escritura, el funcionamiento es totalmente análogo.


Toda caché incorpora, además, un espacio de almacenamiento llamado Tag RAM, que indica a qué porción de la RAM se halla asociada cada línea de caché. En otras palabras, la Tag RAM permite traducir una dirección de RAM en una línea de caché concreta. Ya que la RAM tiene mayor capacidad que la caché, ¿cómo se reparte la RAM entre las líneas de caché disponibles? Existen tres tipos de caché según la técnica empleada:


Caché de mapeo directo. Se divide la RAM en porciones de igual tamaño, tantas como líneas de caché existan. Cada línea de caché es un recurso a compartir por las direcciones de memoria de una porción diferente. Por ejemplo, si se dispone de una RAM de 64 MB y la caché de 512 kB presentada anteriormente, cada línea podrá almacenar 32 de las 4.096 direcciones que contiene la porción de RAM asociada (64 MB/ 16.384 líneas = 4.096 bytes / línea).


Esta técnica permite una búsqueda muy rápida, ya que cada posición de RAM sólo puede estar en una determinada línea. Sin embargo, la probabilidad de encontrar la información buscada es mínima. Imagine dos instrucciones A y B, que se corresponden con la misma línea de caché (esto es, pertenecen a una misma porción de RAM). Suponga que la CPU necesita ejecutar una secuencia alternada A, B, A, B, etc. En ese caso, se tendrá que acceder a la RAM para copiar A y luego para copiar B (y reemplazar a la instrucción A en la caché), y así hasta terminar la secuencia. Sin duda, el porcentaje de acierto es nulo en dicha situación. En la siguiente figura podemos ver un ejemplo de este tipo de mapeo.



Caché completamente asociativa. Cada línea de caché se puede llenar con cualquier grupo de posiciones de la memoria RAM. En este caso, el porcentaje de acierto es máximo, y el ejemplo anterior no produciría problemas. En cambio, el tiempo de acceso es muy elevado, puesto que una posición de RAM puede estar en cualquier línea de caché (esto es lento, incluso empleando algoritmos de búsqueda avanzados).


Caché asociativa por conjuntos de N líneas. La caché se divide en conjuntos de N líneas. A cada conjunto se le asocia un grupo de posiciones de RAM. Dentro del conjunto asignado, una posición de RAM puede ir a parar a cualquiera de las N líneas que lo forman. En otras palabras, dentro de cada conjunto la caché es totalmente asociativa.


Esta situación es la más equilibrada, puesto que se trata de un compromiso entre las técnicas anteriores. Si se hace N=1, se tiene una caché de mapeo directo. Si N es igual al número de líneas de la caché, se tiene una caché completamente asociativa. Si se escoge un valor de N apropiado, se alcanzará la solución óptima.En la siguiente figura podemos ver un mapeo asociativo de dos vías.



Normalmente, la caché L2 es de mapeo directo, mientras que la caché L1 es asociativa por conjuntos de N líneas.

3.a ¿Cómo se traduce de dirección virtual a dirección física?

La memoria fisica de un ordenador es una secuencia de bytes, que empieza en el 0 y termina en....por ejemplo 64 megas. Es decir un array de bytes.

Cada byte tiene una dirección : el numero que ocupa posicionalmente en la memoria. Esta dirección es conocida como dirección fisica. Las direcciones que va a utilizar un programa (en modo protegido), no son esas. Siempre son traducidas, o mapeadas, en direcciones de memoria fisica por un mecanismo de traducción de direcciones.

Este mecanismo, nos introduce en el concepto de dirección virtual. Se llama de esta manera porque no corresponde directamente a posiciones de memoria física, sino que a traves de una función de mapeado equivale a una dirección de memoria fisica. Es decir este mecanismo, al apuntar a una dirección de memoria, lo que hace es buscar, por ejemplo en unas tablas internas, la correspondencia entre esta dirección y la dirección real física del dato.

La traduccion de dirección virtual a física tambien proporciona proteccion de memoria, ya que podría disponerse por ejemplo, que ciertas direcciones fisicas de memoria no se mapeen desde ninguna dirección virtual.

La traducción de las direcciones virtuales a reales es implementada por una Unidad de Manejo de Memoria (MMU). El sistema operativo es el responsable de decidir qué partes de la memoria del programa es mantenida en memoria física. Además mantiene las tablas de traducción de direcciones (si se usa paginación la tabla se denomina tabla de paginación), que proveen las relaciones entre direcciones virtuales y físicas, para uso de la MMU. Finalmente, cuando una excepción de memoria virtual ocurre, el sistema operativo es responsable de ubicar un área de memoria física para guardar la información faltante, trayendo la información desde el disco, actualizando las tablas de traducción y finalmente continuando la ejecución del programa que dio la excepción de memoria virtual desde la instrucción que causó el fallo.

Existen muchos mecanismos para la traducción de direcciones virtuales a físicas, entre los cuales destacamos:

Particiones fijas
La memoria física se divide en particiones fijas que pueden ser de diferentes tamaños. El hardware requiere de un registro base y un registro límite. La dirección fisica estará compuesta por la dirección virtual más un registro base (cargado por el SO después del cambio de contexto). La ventaja que tiene es que es sencillo y tiene un cambio de contexto rápido, y como desventajas la fragmentacion interna y externa.


Particiones variables
La memoria física es dividida en particiones variables cuyo tamaño varía dinámicamente. El hardware requiere de un registro base y un registro límite. La dirección fisica estará ompuesta por la dirección virtual más un registro base. El registro base contiene el valor de la dirección física menor posible, y el registro límite el mayor rango de direcciones virtuales. Con este tipo de traducción nos evitamos el problema de la fragmentacion interna (si sabemos cuanto necesita el proceso) pero seguimos teniendo el problema de la fragmentación externa.


Paginación (técnica actual)
Para solucionar el problema de la fragmentación externa dada conparticiones variables, usamos particiones fijas en memoria virtual y física.




Con este método, los procesos ven a la memoria como un espacio contiguo de 0 a M, aunque en realidad la memoria física está desparramada. Cada página virtual se mapea a una página real (marco de página) que está en cualquier parte en memoria física. Dicho mapeo es invisible al programa.


En la traducción de direcciones virtual,es una dirección tiene dos partes, el número de página virtual y el offset. El número de página virtual es un índice en la tabla de páginas. Una entrada en la tabla de paginas contiene el número de marco de págino, por lo que la dirección fisica se traduce a un número de marco de página más el offset. Las tablas de páginas son manejadas por el SO.







2.g Análisis de una arquitectura de procesador de los dos últimos años diferente de las vistas en clase

Introducción

El nuevo Core i7 de Intel introduce notables cambios sobre generaciones anteriores. Cambios radicales que tendrán que competir con el exitoso Core 2 de la propia marca. Cambios muy interesantes donde destaca la primera integración de Intel del controlador de memoria en el propio procesador y la vuelta del Hyperthreading como sistema para ampliar la capacidad SMP de estos procesadores.



Prestaciones principales del Core i7

El Core i7 ha supuesto un cambio completo de diseño para los procesadores de Intel. El bus Quadpumped introducido en los primeros Pentium 4 y existente también hasta los Core 2 desaparece para dar paso a un bus mucho más eficiente y potente como es el QuickPath. De este modo este procesador multiplica notablemente su capacidad de comunicación con el chipset de la placa base pero también reduce las competencias de este mediante la integración de la controladora de memoria en el propio Die del procesador.




La controladora de memoria del Core i7 disfruta de este nuevo interfaz conocido como QPI y de un sistema de triple canal para memoria DDR3. El QuickPath permite conexiones punto a punto con el chipset de la placa base con una capacidad de 42 señales con un ancho de banda teórico de 32GB/s por enlace. El Core i7 solo dispone de un interfaz QPI por lo que no es válido para sistemas de multiprocesador.


El Core i7 tiene una arquitectura de cuatro núcleos nativos realizados mediante un proceso de fabricación de 45nm y un total de 731 millones de transistores. Cada núcleo dispone de un total de 64KB de cache de primer nivel distribuida en dos apartados (instrucciones y datos), 256KB de cache de segundo nivel y comparten entre los cuatro un total de 8MB de cache de tercer nivel. Todas estas caches corren a la misma velocidad que el procesador. Cada núcleo del Core i7 es capaz de procesar dos threads por ciclo por lo que su capacidad de proceso es de 8 Threads por ciclo.





Tamaño y socket

Cuando se introducen nuevos sistemas de comunicación con mayor capacidad normalmente también se tiene que aumentar el número de pines de los sockets a modo de puertos de comunicación. Lo mismo ocurre cuando dedicamos el control de la memoria al procesador de ahí que los nuevos procesadores Core i7 tengan un tamaño notablemente más grande que sus antecesores y que Intel haya tenido que introducir un nuevo socket que mantiene el estándar LGA donde los pinchos los dispone el socket y no el procesador. Las nuevas prestaciones del Core i7 han llevado al uso de un nuevo socket de mayor tamaño, casi un 50% más de superficie.




Tipos de procesadores

Para empezar solo encontraremos tres procesadores dentro de la gama Core i7. Todos usan el socket 1366 y sus prestaciones se resumen en la siguiente tabla.





Chipset

Solo hay un chipset en el mercado que pueda dar soporte a los nuevos procesadores de Intel y este es el X58 de Intel. Este chipset es el único que tiene el soporte que requiere este nuevo procesador para su recién estrenado bus QuickPath. Se trata de un chipset de gama alta que dispone de las últimas tecnologías, en parte, heredadas del exitoso P45.




Overclocking

El Nehalem o Core i7 es un procesador con buenos niveles de overclocking pero no es un Core 2 Duo de las últimos steps. Es más caliente y más complejo, integra la controladora de memoria en el die y es un cambio drástico de forma de hacer overclocking. Hay que cuidar más buses secundarios y el proceso se hace más complejo.



Temperaturas y consumos

Los Core i7 tienen un TDP o un consumo medio más elevado que sus antecesores de última generación. Tienen un consumo medio de 130W y esto los hace mucho más calientes que los últimos Core 2. Aun así tampoco hemos visto que las temperaturas de trabajo se disparen. Lo mejor es que el poco overclocking que podamos sacar se logra sin voltajes elevados, 1.3v en ambos casos, así que las temperaturas no se disparan.


Las temperaturas en reposo bajan hasta unos más que aceptables 45 grados centígrados lo que nos permite decir que cualquier disipador actual de medianas prestaciones podrá sacar unos niveles de overclocking que ronden el 25% sin ningún tipo de problema.


2.f Utilización del multithreading en las arquitecturas para gráficos y multimedia

Definición

La mayoría de servidores y sistemas operativos ya están diseñados para tomar ventaja de los procesadores multi-nucleo ("multi-core") porque están programados para separar diferentes procesos mediante una metodología llamada "multithreading".

El multithreading consiste en ejecutar al mismo tiempo dos o más threads de un programa, permitiendo que cada uno de estos threads sea planificado de la manera más conveniente en el procesador, es decir, aprovechando al máximo todos los recursos disponibles. Sería equivalente a tener dos o más procesadores lógicos o virtuales en lugar de sólo uno.


Ventajas


Esta técnica tiene una serie de ventajas con respecto a la programación secuencial:


    • Divide el problema en partes más simples, siendo tratada parcial o completamente en paralelo.

    • En las modernas arquitecturas multiprocesadoras, una aplicación Multithreading (MT) puede aprovecharse de la posibilidad de usar más procesadores para resolver el mismo problema.

    • Un programa Multithreading aprovechará los tiempos muertos que pueda encontrar en varias subfases de solución de problemas para construir otra parte del proceso.

    • El Multithreading es más barato en términos de recursos de sistema utilizados que los sistemas multiproceso.


Por tanto podemos concluir que se aumenta la productividad, es decir, que permite conseguir que más trabajo sea terminado en menos tiempos y consumiendo menos recursos.



Clasificación

En función de la implementación de los hilos tenemos dos tipos de MT, el multithreading preventivo, en el que el S.O distribuye el tiempo de proceso entre los hilos y los interrumpe a intervalos regulares para dar paso al siguiente en la cola, y el multihilo cooperativo, en el que cada hilo toma el control de la CPU el tiempo que necesite.


Otra clasificación de MT podría ser entre explícito e implícito. El MT explícito es especificado por el programador, los hilos son generados por el S.O, y el cambio de hilo se produce de manera automática por el procesador debido a una política de cambio implementada que puede ser de tres tipos(Interleaved Multithreading (IMT), Blocked Multithreading(BMT) y Simultaneous Multithreading (SMT).


En cambio, en el modelo implícito se obtienen hilos del mismo proceso en tiempo de ejecución.


Hasta ahora, la técnica de multithreading más utilizada ha sido el SMT (Symmetric MultiTrheading) o Hyperthreading, que consiste en permitir que se emitan en el mismo ciclo instrucciones que pertenecen a distintos hilos de ejecución o threads. De momento todas las implantaciones han permitido ejecutar simultáneamente instrucciones de 2 threads diferentes.


Los threads comparten los recursos del procesador de formas diferentes:


      • Recurso replicado: Cada thread tiene el suyo propio.

        • Contador de programa.

        • Registros de control.

        • Pila.


      • Recurso repartido: Existe un único recurso que se divide de manera estática entre todos los threads.

        • Buffer de reordenamiento.

        • Cola de planificación.

        • Buffers de load/store.


      • Recurso compartido: Existe un único recurso que se comparte de manera dinámica entre todos los threads según la planificación.

        • Unidades de ejecución.

        • Registros de propósito general.

        • Memorias caché.


HyperThreading

Esta tecnologia desarrollada por Intel, permite a los programas preparados para ejecutar múltiples hilos procesarlos en paralelo dentro de un único procesador, incrementando el uso de las unidades de ejecución del procesador.




Esta tecnología consiste en simular dos procesadores lógicos dentro de un único procesador físico. El resultado es una mejoría en el rendimiento del procesador, puesto que al simular dos procesadores se pueden aprovechar mejor las unidades de cálculo manteniéndolas ocupadas durante un porcentaje mayor de tiempo. Esto conlleva una mejora en la velocidad de las aplicaciones que según Intel es aproximadamente de un 30%.


El tipo de aplicaciones que se pueden beneficiar es lógicamente muy amplio, pues aprovechar la tecnología simplemente va a depender del modo en que se creen las aplicaciones. Obviamente, todo lo relacionado con multimedia será lo más beneficiado (juegos, incluidos) de cara al usuario final.


El procesador Intel Pentium Extreme Edition combina la tecnología Hyperthreading con el procesamiento de doble núcleo para ofrecer PCs capaces de gestionar cuatro subprocesos de software. La tecnología HT permite que los entusiastas de los juegos puedan disfrutar de los nuevos juegos y experimentar efectos ultrarrealistas y capacidad de juego. Los entusiastas de la multimedia pueden crear, editar y codificar archivos de gráficos exigentes mientras ejecutan el antivirus en el segundo plano.


Los sistemas operativos que actualmentesoportan Hyper-Threading incluyen Microsoft Windows NT 4.0, Microsoft Windows 2000, Microsoft XP Profesional, y la mayoría de las variantes de Unix.


Como novedad de última hora, decir que Windows 7 está siendo optimizado para hacer mejor uso de esta tecnología y distribuir de forma más eficiente la carga del sistema entre los núcleos virtuales, lo que le daría un salto en rendimiento en procesadores con Hyperthreading, aunque esto depende mucho de lo optimizadas que estén las aplicaciones que deseemos correr.


Las pruebas de rendimiento a las que han sido sometidas aplicaciones que aprovechan esta tecnología ofrecen pequeños incrementos de rendimiento general, aunque dependiendo del tipo de aplicaciones, la mejora puede llegar a ser importante.


En cuanto a los juegos, se habla de un incremento de hasta un 20% en el número de frames por segundo en Quake ejecutándose en un equipo con un P4 H.T. a 3,06GHz con una tarjeta gráfica de última generación (las comparaciones se realizan activando o desactivando el soporte H.T. en la BIOS del equipo).


Gigathread:

Aunque el threading en el contexto del renderizado 3D no es exactamente el mismo que para las CPUs, la premisa básica es similar; hacer uso del increible paralelismo inherente a una GPU moderna mediante la división eficiente del trabajo. Sin embargo, además de dividir el trabajo en tareas individuales o hilos, las GPUs manejan el threading por si mismas, dividiendo los datos que van a ser renderizados en lotes de pixels que pueden ser enviados donde quiera que se necesiten en la GPU.


Con esta tecnología, la potente arquitectura multithread admite miles de subprocesos simultáneos e independientes, lo que proporciona una extraordinaria eficacia de procesamiento en programas de sombreado avanzados de última generación.



2.d Explicación en detalle de los predictores de salto multinivel y adaptativos

Los riesgos de control producidos por los saltos, son los que primero deben evitarse, ya que son los que más problemas causan. Existen varias técnicas que se basan en predecir si los saltos se van a tomar o no, entre las cuales explicaremos dos predictores dinámicos complejos: los predictores multinivel y los adaptativos.



Predictores Multinivel o Correlados:


A diferencia de otros predictores dinámicos, con estos predictores se tiene en cuenta el comportamiento que han tenido recientemente todos los saltos, no sólo el del salto para el que estamos haciendo la predicción.


Existen dos razones principales que pueden causar que las direcciones tomadas por dos saltos estén correlacionadas. Una es que las condiciones de los dos saltos estén basadas (total o parcialmente) en la misma información o en información relacionada. Podemos ver un ejemplo de este tipod e correlación a continuación:


Salto Y: if (condicion1)

...

Salto X: if(condicion1 AND condicion2)


Correlación debida a la relación de información



La otra razón es que la información que afecta el resultado del segundo salto es generada basandose en el resultado del primer salto. El siguiente ejemplo muestra este otro tipo de correlación:


Salto Y: if(condicion1) a=2;

...

Salto X: if(a==0)


Correlación debida a la dependencia de los resultados de un salto anterior.


Adicionalmente a la dirección tomada por un salto correlacionado, solo saber si ese salto estaba en el camino que condujo al salto actual puede dar cierta información sobre el resultado de los saltos que preceden al salto correlacionado. Esto se muestra en el ejemplo siguiente:


Salto Y: if(NOT(condicion1))...

Salto Z: else if(NOT(condicion2))...

Salto V: else if(condicion3)...

...

Salto X: if(condicion1 AND condicion2)


Correlación en camino


En este caso, si se llega al salto V, se sabe que las primeras dos condiciones eran falsas, luego entonces condicion1 y condicion2 son ambas verdaderas. Como se puede ver, la dirección del salto V no está correlacionada con la condición del salto X, pero sabiendo que el salto V está en el camino que condujo al salto X se sabe que la condición del salto X va a ser satisfecha. Esta correlación se conoce como correlación en camino.



Predictores Adaptativos:


Tener en cuenta información global de todos los saltos puede mejorar la tasa de acierto de un predcitor local, pero puede que esta mejora no sea suficiente para compensar la utilización de un hardware más complejo o incluso que no exista mejora alguna.


Por ello, los predictores adaptativos tienen la capacidad de escoger un predictor local o un predictor global según cuál se vaya a comportar mejor en un determinado salto. Estos predictores siguen una política similar a la de los predictores de dos bits. Es decir, no se cambia de predictor a no ser que falle en dos predicciones consecutivas. Por último decir que normalmente el predictor adaptativo suele escoger el predictor local.

2.b Explicación en detalle de las técnicas de resolución de riesgos en procesadores segmentados utilizando como ejemplo la arquitectura MIPS

En primer lugar, comenzaremos hablando un poco de la arquitectura MIPS (Microprocessor without Interlocked Pipeline Stages), que es una arquitectura de procesadores segmentada de tipo RISC utilizada en multitud de consolas como la Nintendo 64, la PlayStation 1 y 2, y la PSP. Una estimación a finales de los años 90 determinó que aproximadamente uno de cada tres chips de tipo RISC que salieron al mercado estaban basados en MIPS.

El conjunto de instrucciones de esta arquitectura es muy limpio, por lo que en la docencia de las Universidades se suelen basar en ella para explicar las arquitecturas de computadores.

A continuación estudiaremos la segmentación en la arquitectura MIPS 64 y veremos que problemas tiene y como se solucionan. Antes de nada, debemos decir que la memoria de esta arquitectura esta separada para instrucciones y datos (Harvard) y que el cauce esta segmentado en 5 etapas de un ciclo cada una. Las etapas son las siguientes:

Etapa IF:

- Extracción de la instrucción.
- PC = PC + 4

Etapa ID:

- Decodificación de la instrucción.
- Lectura de registros.
- Extensión de signo (si es necesario).
- Actualización del PC en caso de salto.

Etapa EX:

- Cálculos en la ALU.
- Cálculo de dirección de operandos de memoria.

Etapa MEM:

- Acceso a memoria (Load/Store).

Etapa WB:

- Escritura de los registros.


Debido al hecho de que esta arquitectura es segmentada, existe la posibilidad de que se violen las dependencias en la segmentación. Esta posibilidad provoca una serie de riesgos de segmentación que hay que detectar y resolver. Existen tres tipos de riesgos:

Riesgos estructurales: Se producen cuando dos o más instrucciones necesitan utilizar el mismo recurso al mismo tiempo. En este caso, para evitar que se acceda a la memoria a la vez se utiliza una memoria que tiene separados los datos de las instrucciones denominada Harvard (al contrario que la arquitectura de von Neumann).

En el caso de que el problema se produzca porque se escribeen y leen los registros a la vez, lo solucionamos escribiendo en el 1 subciclo y leyendo en el segundo.

Riesgos de datos: Se producen cuando una o más instrucciones necesitan utilizar un dato que produce una instrucción anterior antes de que esté listo. Los tipos de riesgos de datos son los siguientes.

RAW (Read After Write) Lectura después de escritura: La lectura de un registro que es dato de una instrucción posterior se realiza antes que la escritura de dicho registro como resultado de una instrucción anterior. (La instrucción posterior opera con el dato incorrecto).

WAR (Write After Read) Escritura después de lectura: La escritura de un registro que es resultado de una instrucción posterior se realiza antes que la lectura de dicho registro como dato de una instrucción anterior. (La instrucción anterior opera con el dato incorrecto).

WAW (Write After Write) Escritura después de escritura: La escritura de un registro que es resultado de una instrucción posterior se realiza antes que la escritura de dicho registro como resultado de una instrucción anterior. (El dato almacenado enel registro es incorrecto).


En la arquitectura MIPS los riesgos WAR (Write After Read) y WAW (Write After Write) se dan solo cuando hay ejecución fuera de orden u operaciones multiciclo (sólo las WAW), y los RAR (Read After Read) no tienen ningun riesgo ya que no modifican ningún dato. Por tanto, por el hecho de ser una unidad segmentada solo es necesario contemplar los RAW (Read After Write), que se detectan en la fase ID.Existen dos tipos de soluciones para los riesgos RAW, software y hardware.

Dentro de las soluciones software nos encontramos con la inserción de instrucciones NOP, en la que se insertan instrucciones cuya función es alargar el tiempo de ejecución para que no se produzca una RAW, y con la reordenación del código, en la que se reordenan las instrucciones para de nuevo evitar que se produzca una RAW.

También hay dos soluciones hardware para este tipo de riesgos. La primera es una detección del cauce, que al igual que la inserción de instrucciones NOP, lo que hace es alargar el tiempo de ejecución. La segunda es la anticipación, en la que se utiliza el hardware para detectar el error y enviar los datos hacia donde son necesarios.

Riesgos de control: Se producen siempre que hay instrucciones que modifican el valor del PC: saltos. En este tipo de riesgos, el problema surge cuando se ha cargado ya una instrucción pero en el PC se produce un salto, por lo que no se sabe si se debe ejecutar la instrucción cargada o no, pero ésta siempre se ejecuta. Para solucionar estos riesgos también existen soluciones software y hardware.

La primera de las soluciones software es la misma que la de los riesgos de datos, es decir, la inserción de instrucciones NOP para que de tiempo a que se produzca el salto de una instrucción a otra antes de que se cargue la conflictiva. La otra es la técnica del salto retardado, con la cual se evita la penalización por salto introduciendo justo a continuación de la instrucción de salto, instrucciones que se van a ejecutar en cualquier caso.

Las soluciones hardware se basan en la predicción de saltos. Dichas predicciones siempre consiguen una reducción de la penalización por salto cuando se aciertan. Con esta técnica se consigue que la penalización sea de un ciclo para saltos tomados y de ningún ciclo para saltos que no se toman. Mientras se decodifica y se hace efectivo el salto se va buscando la siguiente instrucción; si el salto no se toma, se continúa normalmente y no se a perdido ningún ciclo, si el salto se toma, se busca la instrucción destino y se ha perdido un ciclo haciendo trabajo que no era necesario. Hay que tener en cuenta que en la arquitectura del MIPS no tiene sentido utilizar la predicción de salto tomado porque supone una penalización de un ciclo en todos los casos, independientemente de si se acierta la predicción o no.