12/01/2009

BOINC v6.4.5 y el GPGPU

Posted in Ciencia tagged , , , , , , a 7:55 pm por interloper

Para los indecisos… Acabo de enterarme de que se ha publicado la actualización a una nueva versión de BOINC (para quienes no sepan de qué hablo, les remito a mi anterior post acerca del tema, aquí), que incorpora un avance que considero bastante importante… La posibilidad de aprovechar la potencia de cálculo GPGPU para la obtención de los resultados. Puede que algunos os preguntéis qué demonios es esto… Intentaré dar una explicación sencilla.

Si leísteis la anterior entrada acerca de BOINC (si no lo hicísteis, os he dejado el link arriba, asi que no seais perezosos!), en ella hablaba un poco acerca del procesamiento en paralelo. Concretamente, en nuestro caso, daba por supuesto que cada ordenador solo puede realizar, a efectos prácticos, una sola tarea en cada momento, por lo que en su caso el comportamiento sería el de procesamiento en serie. Tener, como decía en esa entrada, cincuenta millones de ordenadores nos permitiría estar ejecutando, en cada instante, cincuenta millones de tareas a la vez. Pero qué sucede si cada ordenador puede ejecutar, a su vez, más de una tarea a la vez? Hasta ahora mismo, eso era algo que ya se estaba haciendo. Por poner un ejemplo, en mi ordenador del trabajo, con doble núcleo (a grosso modo para los neófitos, dos procesadores en uno) se ejecutan a la vez dos tareas por unidad de tiempo (matemática básica: con 25 millones de ordenadores doble core se podría realizar la misma cantida de trabajo que con 50 millones de un solo núcleo). Pero… qué sucedería si pudiesemos utilizar más recursos del ordenador aparte del procesador para realizar cómputo?

La duda evidente es, claro está, dónde encontrar esos recursos. La respuesta es, en este caso, en la tarjeta gráfica. Una importante característica de los elementos de video, de los cuales normalmente se encarga este componente (aunque la labor también pueda ser realizada por el propio procesador central) es que poseen un altísimo grado de paralelismo. Supongamos un juego de ordenador en 3D. En él, cada figura u objeto con que nos topamos está diseñado mediante una malla de polígonos sobre la que, posteriormente, se coloca una textura que “pintará” el interior del polígono.

guy_mod_02(Click para ampliar)

Al mostrar las imágenes por pantalla, es necesario procesar la posición relativa de cada uno de esos polígonos con respecto a la cámara, decidir cuales de ellos serán visibles para el jugador (es decir, cuales no estarán ocultos detrás de otros), y sobre cada uno de ellos habrá que aplicar la correspondiente textura. Una vez se tiene eso, solo queda enviar la correspondiente información a la pantalla, y el resultado es como el que puedes ver en la imagen superior. En todo este proceso hay dos pasos que contienen un altísimo número de operaciones totalmente independientes entre si: El cálculo de la posición relativa de cada polígono en pantalla, y la aplicación de las texturas a los polígonos visibles (el proceso de decisión de los polígonos visibles es, desafortunadamente, secuencial). Con este objetivo en mente, los diseños de las tarjetas gráficas se han ido especializando en la realización de este tipo de tareas, y mientras que un microprocesador normal suele poseer un diseño considerablemente genérico, las GPUs (siglas de Graphics Processing Unit, el procesador de la tarjeta gráfica, vamos…) han desarrollado una arquitectura donde se explota al máximo el paralelismo de estas operaciones para obtener una altísima velocidad de procesamiento. Como muestra, un botón:

7800-gpu-overview

La imagen superior muestra la arquitectura básica de una de las familias gráficas de la casa Nvidia. Como podéis observar, hay tres filas de elementos repetidos. En la primera de esas filas se realiza la rotación y posicionamiento de los distintos vértices que componen las figuras. En la segunda, lo que se lleva a cabo (aunque no lo hubiese mencionado con anterioridad) es el sombreado de los píxeles de cada polígono. En este punto, se aplican los valores de brillo o efectos que ese punto tendrá (explosiones, relieves, transparencia, etc.). Finalmente, en la tercera fila se aplica la textura a cada uno de los polígonos (evidentemente, si el polígono está rotado en alguna de las tres dimensiones, será necesario rotar igualmente la textura), y se envía a la salida por pantalla. El bloque marcado como Z-Cull es el encargado de determinar qué polígono será visible y cual no. El número de operaciones que una GPU puede realizar por segundo es abrumadora. Piensa que, en juegos de última generación, simplemente la cabeza de un personaje puede tener más de 3000 polígonos que es necesario procesar… junto a otro montón de cosas que aparecerán en pantalla!

Una vez explicado el funcionamiento básico de una tarjeta gráfica, pasemos al concepto que realmente nos ocupaba en esta ocasión… El GPGPU. Qué es eso? Se trata de una tendencia que se está empezando a explotar muy recientemente llamada “Procesamiento General en GPU”. O lo que es lo mismo, aprovechar el alto paralelismo de las tarjetas gráficas para realizar otras operaciones distintas a aquella para la que fueron diseñadas. Mediante técnicas que “engañan” a los distintos componentes de la GPU para que realicen operaciones de diverso tipo camufladas como polígonos y texturas, se puede explotar el paralelismo interno de distintos fragmentos de un programa para obtener los resultados con mayor velocidad. Así de facil, así de complicado.

Y precisamente, eso es lo que se ha implementado en esta ocasión para el cliente BOINC. Aunque por el momento esta extensión solo está disponible para las tarjetas gráficas Nvidia (como la que hemos destripado anteriormente, las ATI tendrán que esperar), se trata de un avance muy significativo, ya que implica que ahora no solo se podrá aprovechar el procesador del PC, sino que otro potentísimo elemento de procesamiento como es la tarjeta gráfica podrá ser puesta, también, al servicio de la ciencia. Al final los informáticos (que ahora todos sabemos, gracias al anuncio de T€l€fónica, que son todos chinos, con bata y gafas) van a hacer con el ordenador como los charcuteros con el cerdo, que se aprovecha todo!

Y para que no me digáis que no está todo completo… El olvidado link a la web de la que descargar BOINC.

[Imagen superior tomada del portfolio de Eric Maslowski]
[Imagen inferior tomada de Tom’s Hardware]
[Más información sobre GPGPU: gpgpu.org y la Omniscente]

Anuncios

4 comentarios »

  1. DaNieLooP said,

    Leyendo el blog con un poco de retraso… lalala
    la arquitectura que se ve en la foto es la de la geforce 7800, en la serie 8000 con la implantacion de cuda (que supongo que sera lo que utiliza boinc) la arquitectura se simplifica aun mas. El pipeline grafico supongo que seguira con 3 etapas al dedicarse a procesar graficos, pero cada unidad de procesamiento es algo mas completa, no esta especializado en una de las 3 tareas vaya. La ventaja de eso es que puedes utilizar todas las unidades de proceso para computacion, no como hacian rekai luis y salva, que tenian que meter los datos transformados como si fueran graficos y era un turroncete. A mi la verdad que cuda me esta gustando. Y para las claves WPA parece que es una maravilla

  2. interloper said,

    Gracias por los apuntes sobre la materia! ^_^

    La verdad es que en el post lo que pretendía es dar una visión global de cómo se hace el procesamiento de los gráficos, sin entrar en excesivo detalle… Entre otras cosas, porque la mayor parte de esto lo escribí de memoria, y no estaba yo como para ponerme a revisar apuntes o buscar demasiada documentación por internet, que mi proyecto corre prisa! El procesamiento gráfico es mucho más complicado que tres simples pasos…

    De todos modos, si algún dia quieres un espacio en el blog para hablar un poco de cuda o las aplicaciones de la GPGPU, sabes que solo tienes que pedirlo! 😉

  3. DaNieLooP said,

    Jejeje, bueno pues he estado mirando un poco el tema de boinc (lo tenia instalado pero una version antigua, por cierto por que proyectos andas tu? yo estoy en rosetta@home) y es un poco peine. Va con cuda, pero mira lo que dice: Check NVIDIA’s list of CUDA-enabled products. If your GPU is listed here and has at least 256MB of RAM, it’s compatible.
    Vamos que o tienes buena tarjeta o nada, porque la mia tiene 128mb de ram… pero bueno lo mas quebranto de cuda es la transferencia de memoria de ram a ram de gpu, creo que se comia unos 400 ciclos en el caso mejor, y si tienes que andar trayendo todo el rato… en dacya tienen una gorda con casi 1gb de memoria, y eso se agradece xD

  4. interloper said,

    Yo ando metido en World Community Grid, ibercivis, QMC@home, ABC@home, Einstein@home y uFluids… Cediendo un poquito de tiempo a cada uno! ^^


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: