Práctica: Paralelismo de Granja

Modificando el ejemplo mostrado en la sección 3.14.1 cree un programa maestro-esclavo que calcule $ \pi $ . El maestro/capataz enviará las tareas (los cálculos parciales de $ \pi $ ) a las estaciones-trabajadores. Tan pronto como un trabajador acaba una tarea el capataz le da otra. De esta manera se consigue que las máquinas mas potentes o mas descargadas trabajen más. Cada tarea es una suma:

$\displaystyle \sum_{i=k, i+=t}^{N-1} \frac{4}{N \times \left (1+ (\frac{i+0.5}{N})^2 \right)}$   $\displaystyle \mbox{ con $k = 0 \ldots t-1$}$    

A diferencia de lo que se hizo en 3.14.1 haga un sólo arranque del ejecutable correspondiente al trabajador. A partir de ese momento el trabajador permanece en un bucle a la espera de entradas/problemas desde el maestro. El número de tareas $ t$ y el número de intervalos $ N$ se enviarán (syswrite del maestro) a través del manejador al programa. Use IPC::Open2 y entrada/salida sin bloqueo y sin buffers.

Utilice IO::Select para seleccionar que canales estan preparados para la comunicación.

Cuando todas las tareas han sido enviadas el maestro envía un cero indicando al proceso que debe finalizar.

Controle el estatus de retorno del proceso. En el módulo Parallel::Simple (sección 3.9) tiene un ejemplo de uso de la variable $? o $CHILD_ERROR. Repase las correspondientes secciones en perldoc perlvar.

En un fichero de configuración estarán las máquinas y el comando para conectarse a ellas (rsh, ssh, etc.).

Casiano Rodríguez León
2012-02-29