Hoy toca habla del software desarrollado para el panel de televisiones. El objetivo del software es dividir una imagen de gran resolución en 9 trozos, y mostrar cada trozo en una pantalla (a ser posible en orden para obtener una imagen global)
Primer Intento: MPI
El estándar MPI (Message Passing Interface) es una especificación de librería para facilitar la comunicación entre diferentes procesos. En el programa MPI se usa para enviar la imagen troceada desde una de las consolas al resto. Como primer paso, lo que se hizo fue instalar una implementación de MPI en todas las consolas (OpenMPI). También opte por Imagick++ como librería para leer las imágenes del disco duro. Y para mostrar las imágenes por pantalla me decido por SDL, que va de maravilla. Como control de versiones, darcs.
El programa final, era bastante fácil de manejar. Cogía todos los ficheros de imagen del directorio donde lo lanzas, y las va mostrando secuencialmente en las pantallas.
El problema de esta primera versión del programa. Terriblemente lento, tarda varios minutos en leer una imagen y transmitirla a las 9 PS3.
Segundo Intento: UDP
Viendo lo lento que va, le echo la culpa a dos cosas: el disco duro de la PS3 y el uso de MPI. Mal por mi parte, debí medir donde tardaba más el programa antes de ponerme a buscar soluciones, en fin. Me decido por atacar MPI.
La solución más obvia es sustituir MPI por una librería de más bajo nivel. Así que me pongo a cambiar las comunicaciones a UDP/IP. Lo primero, creo una aplicación simple, que escucha en un puerto UDP conocido. Los mensajes que recibe los interpreta como lineas y las dibuja por pantalla.
Y la aplicación principal, solo tiene que leer del disco duro y mandar la imagen troceada. Se elimina la parte de SDL de esta aplicación principal, y de las aplicaciones clientes se elimina la librería Imagick++. Todo resulta más elegante y más compacto.
Resultados, una aplicación ligeramente más lenta que la versión MPI. Todo un éxito :-D.
Al final, aunque es un rotundo fracaso en cuanto a optimizar la aplicación, me quedo con la versión UDP, ya que nos resulta más fácil de arrancar el panel de televisiones poniendo el cliente en el inicio de sesión. Y el servidor de imágenes tanto lo podemos tener en una consola, como en un ordenador externo conectado al switch. Incluso nos permite hacer virguerías como tener varios servidores de imágenes apuntando a diferentes televisores.
La solución más obvia es sustituir MPI por una librería de más bajo nivel. Así que me pongo a cambiar las comunicaciones a UDP/IP. Lo primero, creo una aplicación simple, que escucha en un puerto UDP conocido. Los mensajes que recibe los interpreta como lineas y las dibuja por pantalla.
Y la aplicación principal, solo tiene que leer del disco duro y mandar la imagen troceada. Se elimina la parte de SDL de esta aplicación principal, y de las aplicaciones clientes se elimina la librería Imagick++. Todo resulta más elegante y más compacto.
Resultados, una aplicación ligeramente más lenta que la versión MPI. Todo un éxito :-D.
Al final, aunque es un rotundo fracaso en cuanto a optimizar la aplicación, me quedo con la versión UDP, ya que nos resulta más fácil de arrancar el panel de televisiones poniendo el cliente en el inicio de sesión. Y el servidor de imágenes tanto lo podemos tener en una consola, como en un ordenador externo conectado al switch. Incluso nos permite hacer virguerías como tener varios servidores de imágenes apuntando a diferentes televisores.
Tercer Intento: Tan rápido que falla
Se hace varios intentos a la desesperada para intentar mejorar los tiempos. Se trata de paralelizar el código usando hilos, no ganamos nada. Se trata de usar los coprocesadores extra (SPU), un quebradero de cabeza y se nos hecha el tiempo encima. Al menos se soluciona un problema de la aplicación, que al cabo de un par de horas se quedaba colgada. Se arregla reservando memoria al principio de la ejecución y rehusando los buffers.
Al final un cambio mínimo nos salva. La lectura de la imagen se hace con Imagick++, que una vez leído del disco, se va dividiendo en los diferentes buffers que se mandan por UDP, leyendo los pixels de la imagen. Veo en la documentación que existe una función que rellena el buffer, Magick::Image::write(...). La pruebo, por quitar un bucle del código, y ¡presto!. El programa se acelera desde los minutos por imagen a milisegundos por imagen.
Tan rápido llega a ir el programa, que los clientes UDP pierden más de la mitad de los mensajes, las imágenes se ven unas encima de otras. Un follón. Y como el tiempo se hecha encima para tenerlo antes del ESOF 2008 no nos planteamos cambiar a TCP/IP. Al final se soluciona cambiando de mandar todo un televisor completo antes de pasar al siguiente, a mandar la linea n-esima a todos los televisores, antes de empezar con la (n+1)-esima. Se soluciona el problema de los mensajes perdidos y conseguimos una aplicación que muestra imágenes a una velocidad más que aceptable. Un éxito.
El código lo pongo a disposición del que lo pida. Aunque no es nada del otro mundo. Y la próxima semana, pondré imágenes de la feria.Al final un cambio mínimo nos salva. La lectura de la imagen se hace con Imagick++, que una vez leído del disco, se va dividiendo en los diferentes buffers que se mandan por UDP, leyendo los pixels de la imagen. Veo en la documentación que existe una función que rellena el buffer, Magick::Image::write(...). La pruebo, por quitar un bucle del código, y ¡presto!. El programa se acelera desde los minutos por imagen a milisegundos por imagen.
Tan rápido llega a ir el programa, que los clientes UDP pierden más de la mitad de los mensajes, las imágenes se ven unas encima de otras. Un follón. Y como el tiempo se hecha encima para tenerlo antes del ESOF 2008 no nos planteamos cambiar a TCP/IP. Al final se soluciona cambiando de mandar todo un televisor completo antes de pasar al siguiente, a mandar la linea n-esima a todos los televisores, antes de empezar con la (n+1)-esima. Se soluciona el problema de los mensajes perdidos y conseguimos una aplicación que muestra imágenes a una velocidad más que aceptable. Un éxito.
2 comentarios:
Es ist leichter, zu sagen, als, zu machen. viagra billig kaufen viagra rezeptfrei [url=http//t7-isis.org]cialis kaufen ?sterreich[/url]
Incomparable topic, me gusta)))) http://nuevascarreras.com/comprar-cialis-es/ cialis vs viagra Questo argomento solo incomparabilmente:), molto interessante per me. [url=http://nuevascarreras.com/ ]cialis efectos secundarios [/url]
Publicar un comentario