16.04.2014 Views

Administración avanzada de GNU/Linux (PDF) - SW Computación

Administración avanzada de GNU/Linux (PDF) - SW Computación

Administración avanzada de GNU/Linux (PDF) - SW Computación

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Administración <strong>avanzada</strong> <strong>de</strong> <strong>GNU</strong>/<strong>Linux</strong><br />

ª FUOC • XP04/90785/00019<br />

Cálculo <strong>de</strong> PI distribuido: cpi.c<br />

Para compilar:<br />

mpicc O o cpi cpi.c.<br />

Ejecución Mpich: mpirun.mpich -np N.º procesos cpi<br />

(solicitará la contraseña (N.º procesos – 1) veces si no<br />

se tiene el acceso directo por ssh).<br />

Ejecución LAM: mpirun np N.º procesos cpi<br />

(<strong>de</strong>be ser un usuario diferente <strong>de</strong> root).<br />

#inclu<strong>de</strong> “mpi.h”<br />

#inclu<strong>de</strong> <br />

#inclu<strong>de</strong> <br />

double f( double );<br />

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

int main( int argc, char *argv[] ) {<br />

int done = 0, n, myid, numprocs, i;<br />

double PI25DT = 3.141592653589793238462643;<br />

double mypi, pi, h, sum, x;<br />

double startwtime = 0.0, endwtime;<br />

int namelen;<br />

char processor_name[MPI_MAX_PROCESSOR_NAME];<br />

MPI_Init(&argc,&argv);<br />

MPI_Comm_size(MPI_COMM_WORLD,&numprocs); /*Indica el número <strong>de</strong> procesos en el grupo*/<br />

MPI_Comm_rank(MPI_COMM_WORLD,&myid); /*Id <strong>de</strong>l proceso*/<br />

MPI_Get_processor_name(processor_name,&namelen); /*Nombre <strong>de</strong>l proceso*/<br />

fprintf(st<strong>de</strong>rr,”Proceso %d sobre %s\n”, myid, processor_name);<br />

n = 0;<br />

while (!done) {<br />

if (myid ==0) { /*Si es el primero...*/<br />

if (n ==0) n = 100; else n = 0;<br />

startwtime = MPI_Wtime();} /* Time Clock */<br />

MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); /*Broadcast al resto*/<br />

/*Envía <strong>de</strong>s<strong>de</strong> el 4.º arg. a todos los procesos <strong>de</strong>l grupo<br />

Los restantes que no son 0 copiarán el buffer <strong>de</strong>s<strong>de</strong> 4 o arg -proceso 0-*/<br />

/*1.º :buffer, 2.º :size, 3.º :tipo, 5.º :grupo */<br />

if (n == 0) done = 1;<br />

else {<br />

h = 1.0 / (double) n;<br />

sum = 0.0;<br />

for (i = myid + 1; i

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!