Currently Browsing

google SoC

Google surprise!

Google surprise

La gente de Google se ha enrollado y nos ha mandado a los participantes del Google Summer of Code 2006 un bloc de notas con su logotipo. ¡Nadie se lo esperaba! No es que sea gran cosa, pero está fantástico para fardar ;-)

Funciones definidas por el usuario en DaVinci

Las funciones definidas por el usuario son programadas en el lenguage DaVinci y son cargadas desde la interfaz de lí­nea de comandos mediante la función source(). Para manejarlas, se parsean del modo usual en DaVinci, aunque catalogando esa rama del árbol sintáctico como una función definida por el usuario (ufunc).

En un entorno distribuido de alta capacidad de cómputo como el que estoy implementando, ¿cómo hacer para sincronizar este tipo de funciones entre los procesos trabajadores? Las funciones son cargadas únicamente en el proceso maestro, de modo que, en principio, los procesos trabajadores no pueden acceder al fichero fuente.

La solución que he encontrado es francamente sencilla: cuando es necesario sincronizar una función, se transmite el código fuente de la misma al trabajador para que este la interprete con el parser local. ¡Es realmente fácil y rápido! La otra opción consistirí­a en serialize el árbol sintáctico generado en el maestro al parsear la función, pero ¿es esto mejor que transmitir el código fuente y ejecutar el parser en los trabajadores? La verdad es que haciendo una estimación, esta última opción aunque más compleja no mejorarí­a ni el tiempo de ejecución ni el de transmisión de los datos.

En primer lugar: serializar el árbol sintáctico puede llevar bastante tiempo ¡tanto como crearlo desde un código fuente! En segundo lugar: transmitir el árbol serializado posiblemente lleve tanto tiempo como el código fuente del mismo. Sólo la información que es necesaria enviar para poder descerializar el árbol en los trabajadores ocuparí­a más que el propio código fuente.

Acerca de las librerí­as MPI open source.

Descubrí­ cual era el problema con OpenMPI y MPI_Gather + MPI_Scatter. No se puede enviar un número 0 de elementos en ningún caso. Si se hace así­, el sistema da un error. Cambié la llamada para que enviara 1 elemento y todo parece funcionar.

MPICH2 no tiene esta limitación, pero falla en el tema de entrada y salida.

LAM/MPI no funcionó haciendo este cambio. Y me resulta curioso porque el código de LAM/MPI y OpenMPI son prácticamente idénticos (dirí­a que los del LAM que ahora están en OpenMPI decidieron que su código era suficientemente bueno para copiarlo) xD.

MPI_Spawn + MPI_Gather + MPI_Scatter

Bueno, sigo con mi serie de ejemplos de utilización de MPI. Este ejemplo ilustra cómo crear un conjunto de procesos mediante MPI_Spawn y comunicarse de forma muy básica con ellos para transmitirles información (MPI_Scatter) y recibir los resultados que computen (MPI_Gather).

El programita ejecutado como maestro genera un vector de 50 enteros con los números del 1 al 50, lo reparte entre los 5 procesos que crea enviando 10 enteros a cada proceso y recupera los resultados que éstos le enví­an.

Si el programa se ejecuta como trabajador (utilizando “-workers”, y cosa que sólo deberí­a hacer el mismo programa ejecutado como maestro) espera que le enví­en 10 enteros, calcula su cuadrado y lo devuelve.

El código fuente está aquí­: Gathertest