Hace poco que nVidia ha puesto en el mercado lo que han venido a denominar Tesla Personal Supercomputer o, en otras palabras, un superordenador de andar por casa.
En realidad no tanto como para andar por casa, pero el precio es realmente asequible para instituciones como hospitales o pequeños institutos de investigación que no pueden permitirse un gasto de varios millones de euros en adquirir un superordenador de IBM y que, en realidad, no necesitan. Por un precio en torno a los 10,000 $, uno puede comprar un equipo que disponga de 4 GPU como la de la foto y que, según nVidia, permite alcanzar una potencia de proceso similar a la de unos 250 PCs convencionales.
Pero, ¿cómo funciona el invento y cuáles son los peros?
Muchos de vosotros seguro que asociáis nVidia al mundo de las tarjetas gráficas 3D. nVidia y ATI se reparten el pastel de este sector de la industria de la informática desde que los juegos, cada vez más exigentes, y otras aplicaciones hicieron el procesamiento de gráficos por software una tarea imposible. En contraposición al término CPU (Central Processing Unit), utilizado para designar el microprocesador de un computador, nació el término GPU (Graphics Processing Unit). Una GPU es básicamente un microprocesador de varios núcleos (o sea, varios microprocesadores) cada uno de los cuáles trabaja por separado. Esto se llama computación en paralelo y básicamente consiste en asignar tareas que pueden ser realizadas independientemente una de otra a cada uno de los núcleos para que trabajen todos al mismo tiempo. Individualmente la potencia de proceso de estos procesadores es mucho menor que la de un micro convencional (el típico Pentium, por ejemplo) pero trabajando en paralelo pueden suponer una notable mejoría del rendimiento.
Para ejemplificar esto, imaginemos que tenemos que hacer la siguiente operación con un ordenador:
\sum_{n=1}^{240} \frac{1}{n!} e^{-n^2}
Un microprocesador mononúcleo (un Pentium IV, por ejemplo) lo que haría sería:
1. Calcular el primer término
2. Guardarlo en memoria
3. Calcular el segundo término
4. Sumarlo al primero y guardar el resultado en memoria
.
.
.
479. Calcular el término nº 240
480. Sumarlo a los 239 términos anteriores y mostrar el resultado final
Vemos que antes de calcular el término final, el mismo núcleo ha tenido que esperar a obtener los 239 anteriores, lo que supone un empleo considerable de tiempo en cada paso. Computando en paralelo, la operación de calcular cada término se lleva a cabo a la vez. Una GPU Tesla de nVidia con 240 núcleos haría:
1. Todos los núcleos calculan a la vez, cada uno un término
2. Todos los núcleos guardan a la vez el resultado en memoria
3. Un procesador central se encarga de acceder a la memoria y sumar todos los términos
Aunque el Pentium IV calcula cada término individual más rápido de lo que lo hace uno de los núcleos del Tesla, el resultado final se obtiene mucho más rápidamente con el Tesla.
Hemos visto por tanto que cuando se trata de cálculos que se pueden hacer independientemente unos de otros, resulta que computar en paralelo es mucho más eficiente. Las GPU (es decir, las tarjetas gráficas) son útiles en este sentido porque están diseñadas para procesar diferentes partes de un gráfico. Imaginemos una GPU de 8 núcleos. Podría dividir, por ejemplo, la pantalla en 8 partes iguales y cada uno de los núcleos se encargaría de uno de los trozos, dividiendo en 8 el trabajo a realizar.
¿Dónde está la trampa? Pues en que hay muchos cálculos que no se pueden llevar a cabo en paralelo. Imaginemos la siguiente serie:
a_n = \frac{a_{n-1}}{n!}
¿Qué significa esto? Que para obtener un término de la serie hace falta conocer el anterior. Si quisiéramos obtener el término nº 240, por ejemplo, tendríamos que haber obtenido antes el 239 y, antes de éste, el 238, y así hasta el primero. En este caso las tareas no son independientes y no se puede hacer el procesado en paralelo. Una CPU de 50 € haría esta tarea de forma más eficiente que una GPU nVidia de 1,600 $.
No obstante, hay muchos procesos para los que la computación en paralelo supone una ventaja indiscutible. Por ejemplo, mi trabajo fin de carrera necesitaba cálculos que a veces duraban hasta 10 días. Una parte del programa podía escribirse para que se ejecutase en paralelo, sólo que por aquél entonces no sabía cómo hacerlo. Si lo hubiera hecho, teniendo en cuenta que usaba para los cálculos ordenadores con 4 micros, podría haber reducido el tiempo de ejecución a 2.5 días.
0 comentarios:
Publicar un comentario