jueves, 7 de enero de 2010

PPUs

Actualmente todos los ordenadores tienen algún tipo de GPU que permite liberar a la CPU de los cálculos necesarios para generar gráficos 3D, se han propuesto añadir más hardware de propósito específico, especialmente para juegos.

La propuesta más importante ha sido la de un coprocesador físico normalmente conocido como PPU (Physics Processing Unit).

Los primeros diseños de hardware especializado (SPARTA y posteriormente HELLAS) fueron fruto de la investigación académica. En febrero de 2006 se comercializó la primera PPU bajo el nombre de PhysX, diseñado por la compañía Ageia.


La arquitectura de esta tarjeta está basada en un procesador RISC, acompañado de procesadores vectoriales con almacenamiento local (no es memoria caché) y la lógica necesaria para intercomunicar los distintos procesadores. El hardware iba acompañado de la correspondiente API. Esta tecnología la compró nVidia en 2008. En la actualidad, nVidia ha hecho público el API, pero no va a comercializar el hardware sino que mediante un driver, utiliza la potencia de cálculo de las GPUs actuales para acelerar el cálculo de la física.



El principal competidor de PhysX es Havok FX. Se trata de una modificación de Havok, una API y motor de física muy populares, que permite utilizar tarjetas gráficas tanto de AMD como de nVidia para acelerar ciertos cálculos. Estos se implementan como shaders que se ejecutan en la GPU, siguiendo la estrategia actual de nVidia con PhysX. Sin embargo esta tecnología parece estar abandonada desde que Intel compró Havok.

La tendencia actual parece hacer innecesario el uso de hardware específico para el cálculo de la física. De hecho el diseño de la PPU PhysX recuerda al diseño de procesadores modernos como Cell de Sony/IBM/Toshiba o a las tarjetas gráficas modernas que como se ha visto comienzan a utilizarse para dicho fin. Esto hace pensar que en el futuro bastará con el hardware ya existente. Es mucho más probable que se vuelva algo normal el uso de una 2ª tarjeta gráfica como co-procesador que pueda realizar diversos cálculos (entre ellos la física) usando CUDA, OpenCL o DirectCompute. Por ejemplo, los nuevos MacBook Pro de 17" tienen 2 tarjetas gráficas. Esto ha coincidido con el lanzamiento de CUDA para Mac por parte de nVidia y el anuncio de soporte para PhysX en Mac en un futuro, el apoyo de Apple a OpenCL y el uso de GPGPU por parte de Adobe en su programa Photoshop en su última versión.

Patxi Astiz

HyperTransport

HyperTransport (HT) es actualmente el bus con mejores prestaciones en ordenadores de consumo. El estándar lo define un grupo de fabricantes llamado "HyperTransport Consortium". La versión 1.0 se publicó en 2001 y la utilizó AMD para interconectar sus procesadores Opteron y siguientes. La última versión (3.1) se ha publicado en 2008. El funcionamiento básico de un bus HT es el mismo en todas las versiones.


Esta tecnología se basa en un enlace half-duplex de un bit que usa señalización diferencial de bajo voltaje. A partir de este elemento básico, se establecen buses con un número variable de enlaces (entre 2 y 32, normalmente potencias de 2). A la hora de establecer un enlace, las 2 partes negocian el número de lineas a utilizar en cada sentido (puede ser un enlace asimétrico). La comunicación se realiza de manera asíncrona y es DDR, es decir se transmite 2 veces por ciclo.

Los sucesivos estándares han añadido ciertas funcionalidades, pero sobre todo han aumentado la frecuencia de funcionamiento. En la primera versión, HT funcionaba a un máximo de 800 MHz lo que supone, 12.8 GB/s para un enlace de 32 bits. Esta velocidad ha crecido hasta 3.2 GHz en el estándar 3.1, con lo que se pueden conseguir tasas de transferencia de 51.2 GB/s.

La comunicación se realiza mediante paquetes, siguiendo un protocolo parecido a los utilizados en redes de comunicaciones. Los dispositivos tienen asignadas direcciones de 40 bits. Un paquete está formado por un conjunto de palabras de 32 bits. Los paquetes pueden ser de control o de datos. Los paquetes de control contienen comandos y los parámetros que sean necesarios. Después de un paquete de control puede transmitirse si se desea un paquete de datos, como en el siguiente ejemplo:


HyperTransport está pensado para utilizarse como método de señalización y paso de mensajes para controlar un sistema, generar interrupciones y lógicamente transferencia de datos con o sin confirmación por parte del otro extremo de la comunciación. Tiene muchas características interesantes como que está diseñado para poder mapear fácilmente PCI, PCI-X y PCI-Express a partir de la versión 2.0, permite conectar y desconectar elementos en caliente (desde la versión 3.0) y se puede ajustar dinámicamente el ancho y la frecuencia de un enlace (también desde la versión 3.0), entre otras.

Este tipo de bus suele utilizarse para interconectar varios elementos dentro de un sistema. Como ya se ha comentado, AMD lo utiliza pra interconectar sus procesadores y como sustituto del FSB. También puede implementarse en los últimos FPGAs de Altera y Xilinx, por lo que algunas compañías los usan como coprocesadores, que se comunican con el procesador usando este estándar. Hay 2 especificaciones de conectores de tipo slot en el estándar por lo que puede utilizarse como sustituto de PCI-Express a la hora de añadir slots de expansión a una placa base.

Patxi Astiz

miércoles, 6 de enero de 2010

Itanium

Los procesadores Itanium fueron desarrollados por Intel y HP entre los años 1989 y 2000. El lanzamiento se produjo finalmente en el año 2001 y en 2002 se lanzó al mercado Itanium 2 que corregía la jerarquía de memoria del primer diseño, que se mostró ineficiente, además de añadir más unidades funcionales. Esta versión ha tenido revisiones en las que se ha mejorado el proceso de fabricación, aumentado el tamaño de la memoria caché, añadido núcleos y algunas características como soporte para virtualización o multithreading.

El objetivo del diseño del itanium era conseguir una arquitectura que maximice el número de instrucciones por ciclo. A esta arquitectura se le conoce con el nombre EPIC (Explicitly Parallel Instruction Computing). La base de este diseño es utilizar instrucciones muy largas (128 bits) que en realidad contienen 3 instrucciones de 41 bits que pueden ejecutarse simultáneamente. Esta agrupación la realiza el compilador, que es el que tiene toda la responsabilidad en lugar de la lógica del procesador como sucede en los procesadores x86 más comunes, que pueden ejecutar fuera de orden.

Este es un esquema de bloques del procesador Itanium original:

Como hemos dicho, el objetivo del diseño es ejecutar el mayor número posible de instrucciones en paralelo. Por ello tiene un gran número de unidades funcionales en 11 grupos diferentes:
  • 6 ALUs de propósito general
  • 2 unidades de enteros
  • 1 unidad de desplazamiento de bits
  • 4 unidades de acceso a caché
  • 6 unidades de cálculo multimedia
  • 2 unidades de desplazamiento de bits en paralelo
  • 1 unidad de multiplicación en paralelo
  • 1 unidad de "population count" (número de bits a 1 en un registro)
  • 2 unidades de coma flotante de 82 bits
  • 2 unidades de coma flotante SIMD
  • 3 unidades de cómputo de saltos
Cada grupo de unidades puede ejecutar un subconjunto de instrucciones, dependiendo del tipo que sean. Las instrucciones más comunes pueden ser ejecutadas por más de 1 tipo de unidades. Cada instrucción pertenece a uno de los siguientes tipos:
  • A: números enteros (ALU)
  • I: números enteros (no ALU)
  • M: acceso a memoria
  • F: Punto flotante
  • B: Salto
  • L+X: Tipo extendido, dependiendo del subtipo se ejecuta en distintas unidades.
Por ejemplo las instrucciones de tipo A pueden ejecutarse en las unidades de enteros, en las ALUs de propósito general y en las de cálculo multimedia.

El procesador tiene una gran cantidad de unidades disponibles y reparte el trabajo según el tipo de instrucción entre ellas, mediante estaciones de reserva siguiendo la estrategia del algoritmo de Tomasulo. Si nos fijamos, un conjunto de 3 instrucciones ocupa 41*3=123 bits. Los 5 bits que faltan hasta 128 bits indican al procesador que combinación de tipos de instrucciones hay. Por ejemplo, 00001 indica que la primera instrucción es de tipo M, mientras que la 2ª y 3ª son de tipo I. Además de una gran cantidad de unidades funcionales, también tiene una gran cantidad de registros. Hay 128 registros de proposito general de 64 bits, 128 registros de coma flotante de 82 bits y 64 registros de predicación de 1 bit.

Para mantener las unidades funcionales activas, el procesador implementa varias técnicas conocidas. En primer lugar, emite dos instrucciones por ciclo de reloj. Teniendo en cuenta que cada una es un paquete con 3 instrucciones, son 6 las instrucciones efectivas que puede llegar a emitir. Otra técnica de la que hace uso este procesador es la predicción de saltos. El procesador tiene 2 predictores, uno de ellos es un buffer de predicción de salto, mientras que el 2º es un predictor de 2 niveles. También implementa un predictor de dirección de retorno para las llamadas a funciones. Lo más distintivo de este procesador es que el compilador puede añadir sugerencias sobre los saltos, haciendo que el procesador lo evalúe de manera dinámica (utilizando los predictores) o de manera estática (haciendo caso a la recomendación del compilador).

El procesador también tiene la capacidad de especular y también implementa una técnica que no es común en los procesadores actuales, que es la predicación. Al usar esta técnica, el procesador ejecuta las 2 ramas de un salto y descarta la que no se toma una vez conocido el resultado de la instrucción de salto. Esta técnica encaja con la gran cantidad de registros y unidades funcionales del procesador. Esto es especialmente práctico en el caso de saltos condicionales que ejecutan pocas instrucciones. El compilador puede elegir qué debe realizar el procesador. Para ello, cada instrucción tiene 6 bits reservados para indicar que registro de predicación indica si la instrucción se debe ejecutar o no. Hay un registro cuyo valor es siempre verdadero, por lo que se puede usar para ejecutar instrucciones sin predicción. El funcionamiento de esta técnica se puede ver en este esquema:

En el caso de usar predicación, se evalúa que r1 valga 5 y el resultado se asigna a los registros de predicación qp1 y la negación a qp2. A continuación se ejecutan ambas ramas, solo que las operaciones cada una están asociadas un registro de predicación. El resultado de las ramas se utilizará o se desechará según el resultado final de la instrucción test. Otra vez más, es el compilador el que tiene la responsabilidad de utilizar la predicación adecuadamente.

La jerarquía de memoria está dividida en 3 niveles. La memoria de primer nivel está separada en 2, una para instrucciones y otra para datos. Ambas son asociativas por conjuntos (4) y tienen un tamaño de 16 KB cada una. La memoria de nivel 2 ha sufrido varios cambios. Inicialmente era una memoria asociativa por conjuntos (6) con un tamaño de 96 KB, compartida para código y datos. Con los procesadores Itanium II aumentaron el tamaño hasta 256 KB y la asociatividad a 8. Desde mediados del 2006 la memoria caché de nivel 2 está separada en una caché de datos de 256 KB y una de instrucciones de 1 MB. La memoria caché de nivel 3 se accedía a través del FSB en el caso de los primeros Itanium y consistía de una caché asociativa por conjuntos (2) de 2 ó 4 MB. Al revisar la jerarquía de memoria con los Itanium II se incluyó memoria caché asociativa por grupos (2 ó 4) de nivel 3 en el mismo integrado. El tamaño varía según el modelo desde 1.5 MB hasta 24 MB en los últimos modelos con 2 núcleos (12 por núcleo).


Este tipo de procesadores está orientado a la computación de alto rendimiento. La arquitectura Itanium consigue un rendimiento altísimo en cálculo en coma flotante y de hecho ha sido muy utilizada en supercomputadores.

Patxi Astiz

Sega Dreamcast

Antes del lanzamiento de la consola Sony PlayStation 2, Sega comercializó a finales de 1998 la Dreamcast. Desafortunadamente la compañía decició abandonar la producción de hardware de entretenimiento para uso domestico y se dedicó exclusivamente al software y a las máquinas recreativas, con lo que abandonó la producción de su última consola. Vamos a hacer un repaso de sus características técnicas.


Empezaremos con un diagrama de bloques de los diferentes elementos que la componen:

Como se puede ver hay 2 bloques principales, que son la CPU y la GPU en la que además han integrado el chipset que permite a la consola comunicarse con el resto de dispositivos y periféricos de la consola. Como puede verse en el diagrama, hay 3 memorias diferenciadas. En primer hay 16 MB SDRAM que son la memoria principal a la que pueden acceder tanto la CPU como la GPU a través de un bus compartido. Este bus tiene un ancho de 64 bits y una frecuencia de 100 MHz, consiguiento un máximo de 800 MB/s. Un bus con las mismas características une la GPU con la memoria de video que en este caso son 8 MB. Por último, el chip de sonido (un ARM7 junto con un DSP) tiene su propia memoria (2MB) a la que puede acceder mediante un bus de 16 bits de ancho y una frecuencia de 66MHz.

Veamos con más detalle la CPU de la Dreamcast. Se trata de un procesador SH-4 diseñado y fabricado por Hitachi. Es un procesador RISC superescalar de 32 bits. Está segmentado en 5 etapas y funciona a 200 MHz. Tiene una caché de instrucciones de 8 KB. y una caché de datos de 16 KB. Ambas usan mapeo directo. Este procesador tiene un rendimiento (medido usando el benchmark Dhrystone 1.1) de 360 MIPS.


Como se puede ver en la imagen del chip del procesador SH-4, una parte importante del circuito integrado se dedica a la unidad de FPU y al motor de gráficos vectoriales. Esta última es una unidad SIMD. Está pensado especialmente para realizar productos de vectores y matrices para gráficos en 3D. El procesador puede realizar 4 multiplicaciones y 4 sumas en coma flotante de precisión simple simultaneamente. Esto da un máximo teórico de 1.4 GFLOPS aunque en la práctica es imposible alimentar la CPU con datos suficientes para llegar a obtener este rendimiento y el máximo ronda los 0.9 GFLOPS.

La GPU PowerVR 2 fabricada por NEC y diseñada por Imagination Technologies, funciona a una frecuencia de 100 MHz y tiene ciertas peculiaridades sobre las GPUs habituales. No realiza las tareas de transformación de polígonos cuyo cálculo realiza el procesador (gracias a la unidad de gráficos vectoriales). Tampoco utiliza un buffer-z, que se basa en una tecnología llamada tile-rendering. Consiste en dividir la escena en una cuadrícula y renderizarlas una por una independientemente. Como se renderiza solo una pequeña parte de la escena, la información necesaria se puede almacenar en una pequeña memoria local a la que le procesador accede rápidamente. La técnica utilizada es parecida al trazado de rayos y consigue decidir qué polígono está más cerca de la camara, con lo que nunca se dibujan polígonos que están por detrás de otros (evitando completamente el overdraw) y permite utilizar transparencias correctamente independientemente del orden en que se dibujen los polígonos. Aunque la velocidad y la tasa de relleno de esta GPU no sean muy elevadas, el hecho de que no haya overdraw hace que se aproveche al 100% obteniendo un rendimiento muy bueno.

En general el diseño del hardware de la consola no es especialmente novedoso, pero sí que está bastante equilibrado y el funcionamiento global con juegos 3D en tiempo real era muy bueno para los estándares de la época, siendo capaz de renderizar más de 5 millones de polígonos por segundo con iluminación y texturas. Además introdujo varias novedades, como el modem incorporado con la posibilidad de jugar por red o el uso de tarjetas de memoria externas en las que salvar el progreso de las partidas que incluso incluían una pequeña pantalla y controles con los que poder jugar a mini-juegos.

Patxi Astiz

martes, 5 de enero de 2010

Análisis "ClarkDale's Efficiency"

Hay varias páginas web que realizan análisis y comparativas de hardware de consumo como procesadores, memoria, tarjetas gráficas, placas base, etc, etc. Una de las más famosas es Tom's Hardware.

Vamos a fijarnos en el siguiente artículo. En él se compara el rendimiento del procesador Intel Core i5-661 frente a los procesadores AMD Phenom II X2 550, AMD Athlon II X2 240e e Intel Core 2 Duo E8600.


El árticulo comienza con dando detalles de la arquitectura de la familia de procesadores Core i5 que Intel ha lanzado recientemente. Una de las novedades más importantes de estos es que en el mismo empaquetado se encuentra el procesador, el controlador de memoria y una GPU. En el caso de los demás procesadores, se han escogido placas base con GPUs integradas.


En este tipo de análisis hay muchísimos factores que influyen en el resultado final y resulta casi imposible aislar el rendimiento del procesador. Por ello se suelen realizar una gran cantidad de pruebas de distinto tipo, tanto sintéticas como pruebas de rendimiento con aplicaciones o juegos de uso común. En este artículo se utilizan los benchmarks SiSoftware Sandra 2009, PCMark y 3DMark y se utilizan aplicaciones muy exigentes con la CPU o con la GPU, desde juegos como Far Cry o Left for Dead hasta aplicaciones audio/video, compresión de datos, antivirus y modelado 3D entre otros. El conjunto de tests es variado y permite hacerse una idea del rendimiento que ofrece el sistema en bastantes de las tareas más comunes.

Este árticulo hay ciertos aspectos criticables. En primer lugar, los sistemas elegidos para comparar son muy diferentes. Mientras que el procesador Core i5 tiene la GPU empaquetada junto con el procesador, los demás la tienen integrada en la placa base. Además estas GPUs integradas, son más antiguas y todas, excepto las de los procesadores AMD son diferentes entre sí, por lo que en algunos test las diferencias de rendimiento no se sabe en que medida se deben a la CPU o a la GPU. Quizás habría sido más acertado comparar los diferentes modelos de la misma familia de procesadores o no incluir benchmarks en los que la GPU tenga un papel importante, si el objetivo era evaluar solo la CPU.

Otro aspecto a destacar es que se está comparando un procesador con un diseño muy reciente (Core i5) y fabricado en una tecnología de 32nm, (más capacidad de integración y menor consumo) con diseños menos actuales con una tecnología peor (45 nm.). De hecho teniendo en cuenta el precio de venta de los procesadores, algunos de ellos ni siquiera se podría considerar que sean de la misma gama.

Algunas diferencias entre los procesadores escogidos para comparar son especialmente importantes. Por ejemplo, el procesador Core i5 tiene un motor que acelera el cifrado/descifrado AES, lo que le da una ventaja enorme en los test que lo utilizan. Además, en la parte final del artículo se ejecutan una serie de aplicaciones y se compara la potencia eléctrica consumida para realizar el mismo trabajo, suponiendo que la mayor parte de la potencia consumida se debe al procesador. De aquí se saca una medida de la eficiencia eléctrica del procesador. Esta es una medida interesante, pero esta influenciada por demasiados factores, como la tecnología de fabricación antes mencionada, el consumo del resto de elementos del sistema, la calidad del PFC de la fuente de alimentación, etc.

En resumen, el análisis examina el rendimiento de un sistema con Core i5 en pruebas muy diferentes, ayudando a tener una idea del rendimiento que podemos esperar de este procesador. Sin embargo al comparar con otros procesadores, hay demasiadas diferencias (en tecnología y en precio) entre los sistemas escogidos y las comparaciones en algunos aspectos pierden valor. Habría sido más ilustrativo el enfrentar distintas versiones del mismo procesador o simplemente analizar el Core i5 sin compararlo con otros.

Patxi Astiz