05 diciembre 2006

PVM desde Ubuntu 6.10

PVM son las siglas de Parallel Virtual Machine. Es una de las herramientas software disponibles para hacer que varios ordenadores "normales" se puedan comportar como un sistema paralelo.

En Internet es relativamente fácil encontrar recopilaciones de instrucciones que enseñan a instalarlo y ponerlo en marcha. El problema es que la mayoría de ellas están en inglés, y alguna que otra está en español pero ya no se corresponde con lo que actualmente podría resultar la opción más cómoda.

¿Cual sería esa "opción más cómoda"? Posiblemente, emplear un gestor de paquetes como Synaptic (o el que incluya nuestra distribución de Linux) para descargar la herramienta con todas sus dependencias e instalarla.

Pero si usamos esa instalación "automática", quizá las instrucciones que encontremos por Internet ya no nos sean tan útiles. Ese ha sido mi caso, y por ello comentaré lo que he tenido que hacer hasta conseguir que PVM funcionara en mi sistema, por si alguien más se encuentra con el mismo problema.

En mi caso, he usado la distribución de Gnu/Linux conocida como Ubuntu 6.10.

Mi primera opción a la hora de plantearme "jugar" con PVM ha sido ver si aparecía en la lista de paquetes accesibles mediante el gestor de paquetes Synaptic. Efectivamente, en la sección "Desarrollo" del repositorio "universe" se encontraba la versión 3.4.5. He marcado para descarga el paquete "pvm", pero también el "pvm-dev", para poder crear programas para mi "ordenador paralelo".

Hasta aquí sin problemas. Desde un terminal, tecleo "pvm" y puedo entrar, empezamos bien. De momento, volvamos a salir con "halt".

Vamos a comprobar que podemos compilar programas sencillos. Busco el "hello.c" y el "hello_other.c" que deberían estar entre los ejemplos de PVM. Primer problema: la mayoría de instrucciones que había encontrado por Internet decían que PVM suele estar instalado en /usr/share/pvm3/ ... pero no es mi caso. Pido ayuda al bendito "whereis": tecleo "whereis pvm" y me cuenta que ha ido a parar a/usr/lib/pvm3/

Ya sabemos donde buscar. Entro a /usr/lib/pvm3/ y resulta que hay muy poca cosa: una carpeta "bin", casi vacía, otra "conf" con dos ficheros llamados LINUX.def y LINUX.m4 (al menos ya sé el nombre de mi arquitectura), y otra carpeta "lib", en la que se encuentran los supuestos ejecutables "pvm", "pvmd", etc (que realmente son enlaces a ficheros existentes en /usr/bin/).

Pero no hay ejemplos. Bueno, no es grave. Los busco en otra distribución "empaquetada" de PVM, y los copio a mi carpeta de trabajo. Por si alguien no los encuentra, esta es una versión "ligeramente traducida" de hello.c:

----------------


static char rcsid[] =
"$Id: hello.c,v 1.2 1997/07/09 13:24:44 pvmsrc Exp $";

/*
* PVM version 3.4: Parallel Virtual Machine System
* University of Tennessee, Knoxville TN.
* Oak Ridge National Laboratory, Oak Ridge TN.
* Emory University, Atlanta GA.
* Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
* G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
* P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
* (C) 1997 All Rights Reserved
*
* NOTICE
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted
* provided that the above copyright notice appear in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* Neither the Institutions (Emory University, Oak Ridge National
* Laboratory, and University of Tennessee) nor the Authors make any
* representations about the suitability of this software for any
* purpose. This software is provided ``as is'' without express or
* implied warranty.
*
* PVM version 3 was funded in part by the U.S. Department of Energy,
* the National Science Foundation and the State of Tennessee.
*/

#include <stdio.h>
#include "pvm3.h"

main()
{
int cc, tid;
char buf[100];

printf("Soy la tarea t%x\n", pvm_mytid());

cc = pvm_spawn("hello_other", (char**)0, 0, "", 1, &tid);

if (cc == 1) {
cc = pvm_recv(-1, -1);
pvm_bufinfo(cc, (int*)0, (int*)0, &tid);
pvm_upkstr(buf);
printf(" respuesta de la tarea t%x: %s\n", tid, buf);

} else
printf("No se ha podido lanzar hello_other\n");

pvm_exit();
}

----------------

y esta sería la equivalente versión "ligeramente traducida" de hello_other.c:

----------------


static char rcsid[] =
"$Id: hello_other.c,v 1.2 1997/07/09 13:24:45 pvmsrc Exp $";

/*
* PVM version 3.4: Parallel Virtual Machine System
* University of Tennessee, Knoxville TN.
* Oak Ridge National Laboratory, Oak Ridge TN.
* Emory University, Atlanta GA.
* Authors: J. J. Dongarra, G. E. Fagg, M. Fischer
* G. A. Geist, J. A. Kohl, R. J. Manchek, P. Mucci,
* P. M. Papadopoulos, S. L. Scott, and V. S. Sunderam
* (C) 1997 All Rights Reserved
*
* NOTICE
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted
* provided that the above copyright notice appear in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* Neither the Institutions (Emory University, Oak Ridge National
* Laboratory, and University of Tennessee) nor the Authors make any
* representations about the suitability of this software for any
* purpose. This software is provided ``as is'' without express or
* implied warranty.
*
* PVM version 3 was funded in part by the U.S. Department of Energy,
* the National Science Foundation and the State of Tennessee.
*/

#include "pvm3.h"
#include <stdio.h>

#include
<string.h>

main()
{
int ptid;
char buf[100];

ptid = pvm_parent();

strcpy(buf, "hello, world from ");
gethostname(buf + strlen(buf), 64);

pvm_initsend(PvmDataDefault);
pvm_pkstr(buf);
pvm_send(ptid, 1);

pvm_exit();
exit(0);
}

----------------

Para compilar cada uno de ellos podríamos usar "aimk" o simplemente una línea de comandos como ésta:

cc hello.c -o hello -lpvm3

y lo mismo para el otro fuente:

cc hello_other.c -o hello_other -lpvm3


Los dos ejecutables están preparados. Sería mucha casualidad que todo funcionara ya, pero podemos probarlo. Entramos a "pvm" y tecleamos

spawn -> hello

Con esa orden, debería poner en marcha el programa llamado "hello" y mostrar el resultado en la consola. Pero lo habitual será que no funcione. Deberíamos preparar antes un par de variables de entorno, que le digan dónde está pvm, que arquitectura usamos, etc.

En el caso más favorable, puede que sólo haga falta la variable de entorno que indica dónde están los ejecutables. Salimos de pvm ("halt") y tecleamos:

PVM_PATH=/home/nacho/
export PVM_PATH

(obviamente, en vez de /home/nacho sería la carpeta en que realmente estén nuestros ejecutables)

Ya podemos volver a entrar a "pvm" y volver a intentar el "spawn->hello"

Si no funciona así, quizá debamos "dar todos los pasos": Editamos el fichero ".bashrc" de nuestra carpeta home y le añadimos al final

PVM_ROOT=/usr/lib/pvm3
PVM_ARCH="LINUX"
PATH=$PVM_ROOT/bin:$PATH
export PVM_ROOT PVM_ARCH

Hay por ahí quien dice que es interesante añadirlas también en el /etc/.profile, para que esté accesible a todos los usuarios. También hay quien recomienda añadir la línea

PVM_RSH=/usr/bin/ssh

(y exportarla), para que sea "ssh" el encargado de las conexiones a otros equipos, en vez de rsh.

Pero en teoría sólo con lo anterior debería "casi funcionar". ¿Por qué casi? Porque en principio nuestros ficheros ejecutables se buscarán en PVM_ROOT/bin/PVM_ARCH (en mi caso: /usr/lib/pvm3/bin/LINUX/). Esa carpeta puede no existir, así que deberíamos crearla, y posteriormente copiar los ejecutables en ella. ¿Y si nuestros programas usan ficheros o algún otro dato local? La configuración por defecto es que se guarden en nuestra carpeta "home" (para mí: /home/nacho/)

Una vez que están copiados nuestros ejecutables a la carpeta correcta (o reconfigurado el sistema), si tecleamos "spawn -> hello" deberiamos obtener una respuesta parecida a ésta:

-------
spawn -> hello
[1]
1 successful
t40002
pvm> [1:t40003] EOF
[1:t40002] Soy la tarea t40002
[1:t40002] respuesta de la tarea t40003: hello, world from nacho-laptop
[1:t40002] EOF
[1] finished
-------

Prueba superada. Ahora "sólo" queda comenzar a crear nuestros programas.

Una cosa antes de terminar: se supone que la ventaja de usar PVM es tener una "máquina paralela virtual", así que lo suyo es añadir algún otro equipo a nuestra "máquina paralela", de modo que sí se puedan realizar realmente varias cosas a la vez.

La forma de conseguirlo sería "añadiendo" (add) otro ordenador al nuestro desde pvm, con

add equipo2

El único requisito es que ese otro ordenador nos "dé permiso", para lo que debe contener un fichero "/home/nacho/.rhosts", (en la carpeta "home" que corresponda, claro) que es el que le indica qué equipos pueden conectar mediante "rsh", y qué usuarios pueden conectar desde esos equipos, algo como:

equipo1 nacho
equipo3 nacho
equipo4 juan

Podemos comprobar desde dentro de "pvm" cuantos equipos hay conectados con la orden

conf

¿Más información? Algo hay por ahí...
  • Para las órdenes durante el manejo de PVM, como "spawn", se puede pedir ayuda al de siempre: "man pvm"
  • Para variables de entorno, como PVM_ROOT y sus valores por defecto, "man pvm_intro" debería resumirlas todas.
  • Para aprender a usar las funciones de comunicación incluidas en PVM, como pvm_spawn y pvm_recv, habrá que buscar algún tutorial. Hay pocos, y casi todos en inglés... pero esa es otra historia, y deberá ser contada en otro momento... ;-)

¡¡¡Valor y... a por ello!!!

10 comentarios:

Anónimo dijo...

Gracias viejo, me sirvio mucho.
Por casualidad conoces un articulo similar sobre instalación y uso de PBM en NT? Hace dias que estoy peleando con eso y no logro hacerlo funcionar correctamente.
Por ahora solo puedo usarlo en Linux.

Saludos

Nacho Cabanes dijo...

No, no tengo nada que te pueda ayudar. Lo intenté en su día, pero como en mi universidad PVM se usa siempre desde Linux, no me molesté mucho en seguir investigando.

Anónimo dijo...

Muchas gracias por la explicacion de pvm. Se agrece que alguien explique como poner PVM en una máqina para la gente que no somos tan expertos en linux.
Un saludo

Juan A. dijo...

puedo tomar tu artículo, ampliarlo para mi ubuntu 8.04 y publicarlo?

Nacho Cabanes dijo...

Por supuesto, Juan, con toda tranquilidad.

Eso sí, te rogaría que incluyeras también un enlace al artículo original (éste) ;-)

franz dijo...

Hola excelente post, me ha servido de gran ayuda, nada mas tengo una pequña duda, empece a hacer todo eso de las varibles de entorno y todo lo que explicas, despues ejecute la orden del spawn -> hello y me mostro la pantalla que dices q tiene q salir (todo bien hasta ahi) pero despues cerre la consola y empece a hacer otras cosas y cuando volvi a probar el ejemplo de hello me manda el siguiente mensaje:

pvm> spawn -> hello
spawn -> hello
[1]
0 successful
No such file

por que me pasaria esto si no borre el ejecutable ni movi nada

saludos

Nacho Cabanes dijo...

Posiblemente, no has vuelto a definir las variables de entorno, por ejemplo con:

PVM_PATH=/home/nacho/
export PVM_PATH

Ten en cuenta que estos cambios no se guardan de una sesión de consola a la siguiente.

franz dijo...

muchas gracias, si era eso, pero no habra manera de no tener que definir las variables cada vez que quiera entrar a pvm, yo intente ponerlo en el archivo /etc/profile pero no me funciono

saludos

Anónimo dijo...

intente cambiar mis variables de entorno pero aunn me sigue marcando el mismo error !!!


q puedo hacer!!!

Anónimo dijo...

hola muchas gracias por el articulo, tengo una duda
1.cual es el fichero que hay que editar ".bashrc" que mencionas es la parte que no entiendo y
2.los ejecutables a los que se refiere que hay que copiar de home/nombre son el hello.c y hello_other.c o cuales son?