Documente Academic
Documente Profesional
Documente Cultură
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)
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
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
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
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
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
Con ello entramos como usuario remoto en ub1…, luego salimos con exit.
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)
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));
}
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);
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;
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