Rigel en Inglaterra

domingo, agosto 31, 2008

Mayu se está recuperando

Hoy traigo buenas noticias. Mayu lleva unos días en los que se encuentra notablemente mejor. Por primera vez en cosa de un mes ha salido de casa a caminar. Nos hemos dado una vuelta por un centro comercial que está cerquita y nos hemos puesto tibios a postres. Tremendas raciones que sirven por aquí... Basta decir que hoy Mayu no ha querido cenar ni siquiera.

En cuanto al trabajo nos están llegando rumores y noticias muy positivas. No puedo contar ningún detalle, sólo que al fin respiro tranquilo. Han sido cinco meses de incertidumbre y me alegra dejar atrás esta etapa. Espero que no me fastidien en el último momento.

En septiembre tengo dos viajes de negocios de una semana cada uno. Trataré de sobrevivir lo mejor que pueda.

domingo, agosto 24, 2008

CPU versus GPU

Me han empezado a salir canas. Cuando a los hombres nos pasa esto solemos apuntarnos a un gimnasio y comprarnos un deportivo.

Como soy un friqui y como no tengo pelas para un deportivo, este recordatorio de lo breve que es la vida me anima para que escriba de una vez una entrada en el blog sobre cómo funcionan las GPUs. Os lo tenía prometido y a este ritmo de envejecimiento en dos semanas estaré gagá y será demasiado tarde.

Creo que la mejor forma de explicar la arquitectura y el funcionamiento de una GPU es mediante comparación con los procesadores que todos conocemos, las CPUs.

Una CPU típica moderna tiene las siguientes características:
  • Núcleos/"cores": 1~8 y aumentando.
  • Unidades aritmético-lógicas: tanto escalares como SIMD (p. ej. instrucciones SSE).
  • Frecuencia de reloj: 1~3 GHz.
  • Hilos simultáneos por núcleo (hyperthreading): 1~2.
  • Técnicas hardware para explotar el paralelismo a nivel de instrucción, tales como la ejecución de instrucciones fuera de orden y el uso de procesadores superescalares.
  • Latencia aparente de las instrucciones: variable 1~100 ciclos. Por ejemplo, si una instrucción calcula una raíz cuadrada y la siguiente instruccion necesita saber el valor, el procesador se tiene que esperar hasta que el resultado esté listo.
  • Predicción de saltos muy sofisticada.
  • Memorias caché muy grandes, casi la mitad de los transistores del chip. Las cachés L3 andan ya por los 2~4MB.
Su diseño se centra en conseguir el mayor número de instrucciones ejecutadas por segundo para un único hilo de ejecución. Es por ello que necesitan la predicción de saltos y la extracción de paralelismo a nivel de instrucción.

Las GPUs, por el contrario, asumen que la tarea que quieres resolver en ellas se puede dividir en una infinidad de hilos de ejecución independientes. Si tienes tantos hilos, ¿para qué dedicar transistores a predecir la dirección de los saltos? Cuando ves una instrucción de salto puedes simplemente pasar a ejecutar otro hilo distinto hasta que sepas si el salto se produce o no. Por el mismo argumento no necesitas grandes cachés: si un hilo A ha sufrido un fallo de caché, en vez de tener el procesador esperando sin hacer nada, puedes pasar a ejecutar otro hilo cualquiera B hasta que los datos solicitados por A hayan llegado de la RAM. En ese momento, A pasará otra vez a la cola de hilos listos para ejecutarse.

Ahora no os sorprenderá ver las características de una GPU moderna:
  • Núcleos/"cores": 200~800 y creciendo.
  • Unidades aritmético-lógicas: escalares (NVidia) o SIMD (AMD).
  • Frecuencia de reloj: 500~750 MHz.
  • Hilos simultáneos por núcleo: decenas. El cambio de un hilo a otro es transparente y no tiene ningún coste.
  • Ejecución de instrucciones en orden.
  • Los procesadores no son superescalares.
  • Latencia aparente de las instrucciones: 1 ciclo siempre. Lo que pasa en realidad es que mientras un cálculo está llevándose a cabo en un hilo, otros hilos se están ejecutando simultáneamente.
  • Predicción de saltos inexistente.
  • Memorias caché pequeñas. Es muy difícil obtener cifras precisas googleando.
La ejecución de cada hilo individual es mucho más lenta que en una CPU, pero como se están ejecutando miles de hilos concurrentemente, la cantidad de instrucciones por segundo en conjunto es brutal.

El arbitraje de los hilos no lo hace el sistema operativo (no hay tal cosa en una GPU), sino que lo realiza un bloque hardware diseñado específicamente para esa tarea.

Hay otras cualidades que separan a las GPUs de los procesadores de propósito general. Por ejemplo, tienen bloques hardware para realizar algunas tareas que son muy costosas de realizar mediante software, pero que por otra parte son sólo útiles cuando estás computando gráficos 3D.

En resumen, las GPU funcionan muy bien para resolver problemas extremadamente paralelos, sobre todo si requieren mucho cómputo en relación a la cantidad de datos. Sus pequeñas cachés no dan abasto si hay que acceder a memoria con mucha frecuencia.

Aunque en esta entrada he subrayado las diferencias entre estas dos arquitecturas, lo cierto es que están convergiendo. Creo que de aquí a cinco años, la mayoría de los ordenadores que se venderán tendrán en su interior chips híbridos. Probablemente tendrán de uno a cuatro núcleos tipo CPU y unos cientos de núcleos tipo GPU con sus necesarios bloques hardware auxiliares para hacer gráficos 3D. Con ello se conseguiría un buen rendimiento en tareas con poco paralelismo y al mismo tiempo la capacidad de resolver problemas muy paralelos en poco tiempo.

domingo, agosto 10, 2008

Explosión de una estación de gas

Esta noche sentimos a eso de las cuatro de la mañana una explosión. Sonó parecido a un trueno, salvo que mucho más breve, como si alguien hubiese cerrado de golpe una puerta de dimensiones colosales. Como estaba sopa me pregunté si no sería simplemente un sueño raro.

Pero no era un sueño. Esta mañana veo que ha habido una explosión de gas en Toronto. Video aquí (minuto 1:50). Noticia aquí.

Parece que apenas ha habido heridos y ninguno ha sido grave. Todavía no se sabe la causa de la explosión.