You are on page 1of 8

Cluster en Linux

Manual

Realizado por:
Antonio Jesús Mancera Blanco.
Juan Carlos Canto Gonzalez.

www.mancera.org

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
Datos iniciales:
-Se han utilizado 2 ordenadores personales con Ubuntu desktop.
-Red configurada (Para el ejemplo ub0: 192.168.1.20 , ub1:192.168.1.25).
-Después de los pasos todos los nodos llegarán a tener los mismos nombres de
usuarios (para el ejemplo: mpiu@ub0, mpiu@ub1) y el mismo directorio de trabajo
(para el ejemplo: /home/mpiu)

1. Instalar en todas las máquinas MPIHC2.


mpiu@ub0:~$ sudo apt-get install mpich2
mpiu@ub1:~$ sudo apt-get install mpich2

2. Instalar NFS.
mpiu@ub0:~$ sudo apt-get install nfs-kernel-server
mpiu@ub1:~$ sudo apt-get install nfs-kernel-server

3. Instalar SSH.
mpiu@ub0:~$ sudo apt-get install ssh
mpiu@ub1:~$ sudo apt-get install ssh

4. Editar /etc/hosts para configurar las ip’s de y en todos los nodos


mpiu@ub0:~$ sudo nano /etc/hosts
mpiu@ub1:~$ sudo nano /etc/hosts

Para el ejemplo las líneas relativas a las IP´s deben quedar como siguen :
127.0.0.1 localhost localhost.localdomain
192.168.1.20 ub0
192.168.1.25 ub1

Guardamos (Ctrl+o) y salimos (Ctrl+x).

5. Compartir directorio del usuario en ub0 para los demás nodos.


Añadir al fichero /etc/exports
mpiu@ub0:~$ sudo nano /etc/exports
Y añadir dentro: /home/mpiu *(rw,sync)

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
6. Montar en ub1 el directorio compartido de ub0
mpiu@ub1:~$ sudo mount ub0:/home/mpiu /home/mpiu
Si queremos podemos editar el archivo /etc/fstab para no tenerlo que montar cada
vez que iniciemos la maquina, añadiendo esta linea:
ub1:/home/mpiu /home/mpiu nfs

7. Crear en /home/mpiu de ub0 el fichero(oculto) .mpd.conf


(con puntos incluidos, éste contendrá la clave de conexión de SSH .Se le dará
permisos 600).

Editamos/creamos :
mpiu@ub0:~$ nano /home/mpiu/.mpd.conf
y escribimos la línea en el fichero:
MPD_SECRETWORD="secret"
Guardamos (Ctrl+o)y salimos (Ctrl+x).
Permisos:
mpiu@ub0:~$ sudo chmod 600 /home/mpiu/.mpd.conf

NOTA: el propietario del fichero debe ser siempre el usuario mpiu, por si no hemos
podido crearlo en nombre de éste ejecutamos:
mpiu@ub0:~$ sudo chown mpiu /home/mpiu/.mpd.conf

8. Crear en /home/mpiu de ub0 el fichero(oculto) .mpd.hosts


(con puntos incluidos éste, contendrá los nombres de los hosts .Se le dará
permisos 600) .
Editamos/creamos :
mpiu@ub0:~$ nano /home/mpiu/.mpd.hosts
y escribimos la línea en el fichero:
ub0
ub1

Guardamos (Ctrl+o)y salimos (Ctrl+x).


Permisos:
mpiu@ub0:~$ sudo chmod 600 /home/mpiu/.mpd.hosts

NOTA: el propietario del fichero debe ser siempre el usuario mpiu, por si no hemos
podido crearlo en nombre de éste ejecutamos:
mpiu@ub0:~$ sudo chown mpiu /home/mpiu/.mpd.hosts

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
9. Generar las claves de SSH en los nodos.
Para que no pida contraseñas se genera la llave:
mpiu@ub0:~$ ssh-keygen -t dsa
Se pregunta donde guardarla y passwords, se deja el archivo por defecto (intro) y
sin passwords(intro 2 veces).
-Luego se copia a los nodos esclavos
mpiu@ub0:~$ ssh-copy-id mpiu@ub1
mpiu@ub0:~$ ssh-add

Ahora lo mismo con la llave rsa


mpiu@ub0:~$ ssh-keygen -t rsa
mpiu@ub0:~$ ssh-copy-id mpiu@ub1
mpiu@ub0:~$ ssh-add

10. Se puede probar la conexión SSH con los nodos, desde el


maestro(ub0).
Al principio puede que solicite (yes), pero luego no debe pedir passwords.
mpiu@ub0:~$ ssh ub1

Con ello entramos como usuario remoto en ub1…, luego salimos con exit.

11. Una vez que tenemos todo configurado ponemos a prueba el


cluster.
Iniciamos el proceso de escucha en el maestro:
mpiu@ub0:~$ mpdboot -n 2 -f .mpd.hosts
(NOTA: el 2 por el número de nodos totales)

Para comprobar que se ha cargado el demonio …


mpiu@ub0:~$ mpdtrace
Devolverá los nodos implicados si está todo correcto :
ub0
ub1

12. Compilando ejemplos


(éstos están instalados en /usr/include/mpi/examples)
Si no están compilados los programas (programas especiales para procesos
distribuidos), lo compilamos con mpicc.
En el caso de que estos archivos no existieran como era nuestro caso, abajo está el
código fuente escrito en C y que debemos copiar en un archivo de texto plano
llamado CPI.C o ICPI.C

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
Ej: cpi.c (programa que calcula aproximaciones del número PI)
mpiu@ub0:~$ mpicc -o /home/mpiu/cpi /usr/include/mpi/examples/cpi.c
(Donde cpi es el nombre del ejecutable obtenido y cpi.c el fuente)

13. Ejecutando ejemplo


mpiu@ub0:~$ mpiexec -l -n 3 /home/mpiu/cpi
(Debemos obtener los procesos ejecutados en cada nodo y tiempo de ejecución)

Para comparar el tiempo de ejecución, podemos cambiar el número de nodos que


deseamos que intervengan cambiando el 3 , pero teniendo en cuenta que deben
ser programas que ejecuten grandes tareas , por ejemplo con el programa icpi.c
( ejecuta varias vueltas en bucles del cálculo) . Si son programas cortos puede que
se ejecuten más rápidos con menos nodos (no siendo lógico), por la velocidad de
red...

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
Código fuente de ejemplos

CPI.C

#include "mpi.h"
#include <stdio.h>
#include <math.h>

double f(double);

double f(double a)
{
return (4.0 / (1.0 + a*a));
}

int main(int argc,char *argv[])


{
int n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);

fprintf(stdout,"Process %d of %d is on %s\n",
myid, numprocs, processor_name);
fflush(stdout);

n = 10000; /* default # of rectangles */


if (myid == 0)
startwtime = MPI_Wtime();

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

h = 1.0 / (double) n;
sum = 0.0;
/* A slightly better approach starts from large i and works back */
for (i = myid + 1; i <= n; i += numprocs)
{
x = h * ((double)i - 0.5);
sum += f(x);
}
mypi = h * sum;

MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0) {
endwtime = MPI_Wtime();
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}

MPI_Finalize();
return 0;
}

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
ICPI.C

#include "mpi.h"
#include <stdio.h>
#include <math.h>
double f(double);
double f(double a)
{
return (4.0 / (1.0 + a*a));
}
int main(int argc,char *argv[])
{
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
/*
fprintf(stdout,"Process %d of %d is on %s\n",
myid, numprocs, processor_name);
fflush(stdout);
*/
while (!done) {
if (myid == 0) {
fprintf(stdout, "Enter the number of intervals: (0 quits) ");
fflush(stdout);
if (scanf("%d",&n) != 1) {
fprintf( stdout, "No number entered; quitting\n" );
n = 0;
}
startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0)
done = 1;
else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += f(x);
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

if (myid == 0) {
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush( stdout );
}
}
}
MPI_Finalize();
return 0;
}

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco
Cluster Linux by Juan Carlos Canto Gonzalez, Antonio Jesús Mancera Blanco is licensed under
a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España License.

Con la colaboración de Juan José Gallego García, que sin él no hubiese sido posible la
realización de este proyecto.

Realizado por:
Juan Carlos Canto Gonzalez Diciembre 2010
Antonio Jesús Mancera Blanco

You might also like