Problemas con código en MPI (usando c).

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Mocblabla
Forista Nuevo
Forista Nuevo
Mensajes: 1
Registrado: Vie Feb 06, 2015 12:53 am

Problemas con código en MPI (usando c).

Mensaje por Mocblabla » Vie Feb 06, 2015 1:01 am

Buenas,
he compilado mi código y bien, pero a la hora de executarlo... Me da un intro y nada más, se queda sin hacer visiblemente nada hasta que lo paro yo.
Éste es el código:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <math.h>

#define rounds 100
#define MASTER 0

double dboart(int ndarts){

#define sqr(x) ((x)*(x))

double x_coord, y_coord, r;
int n;
int score = 0;

/* "Throw darts at board." */

for (n = 1; n <= ndarts; n++) {

/* generate random numbers for x and y coordinates */

r = (double)rand()/RAND_MAX;
x_coord = (2.0 * r) - 1.0;
r = (double)rand()/RAND_MAX;
y_coord = (2.0 * r) - 1.0;

/* if dart lands in circle, increment score */

if ((sqr(x_coord) + sqr(y_coord)) <= 1.0)
score++;
}
return(score);
}

/***********************************************/
int main ( int argc, char *argv []) {
double picalculated, ascore, scoresum, startwtime = 0.0, endwtime;
int darts, i, rank, size, returncode;
double realpi = 3.141592653589793;

MPI_Init( &argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &rank ); // Identifier
MPI_Comm_size( MPI_COMM_WORLD, &size ); // Number of processors

/* printf( "I'm the processor %d from a total of %d\n", rank, size); */

srand (time(NULL) + rank);
picalculated = 0;

if (rank == MASTER) {
printf("Please, write the number of darts that you want to throw: ");
scanf("d%", &darts);
startwtime = MPI_Wtime();
returncode = MPI_Bcast(&darts, 1, MPI_INT, MASTER, MPI_COMM_WORLD);
if (returncode != MPI_SUCCESS) printf( "Failure on BroadCast task.\n" );
}

for (i = 0; i < rounds; i++) {
ascore = dboart(darts);
}

if (rank == MASTER){
returncode = MPI_Reduce(&ascore, &scoresum, 1, MPI_INT, MPI_SUM, MASTER, MPI_COMM_WORLD);
if (returncode != MPI_SUCCESS) printf ( "Failure on Reduce task.\n" );

picalculated = 4.0 * (double)scoresum / ((double)darts * size);
endwtime = MPI_Wtime();
printf( "/nThe calculated Pi is %.15f and has an error of %.15f \n\n", picalculated, fabs(picalculated - realpi));
printf( "Execution time to calculate it = %f %f\n", endwtime - startwtime, endwtime);
}

MPI_Finalize();
return 0;
}
________________________________________________

¿Alguien sabría ver el error? ¡Muchísimas gracias!

PD: He probado una versión sin comentar lo de: soy el proceso blabla, y ese print sí que me lo hace, por lo que el error está más adelante. ¡Merci otra vez!
Avatar de Usuario
cargoan
Forista Medio
Forista Medio
Mensajes: 281
Registrado: Dom Oct 19, 2014 6:26 pm

Re: Problemas con código en MPI (usando c).

Mensaje por cargoan » Sab Feb 07, 2015 1:36 pm

¿Cómo lo has compilado?

Con gcc tienes que hacerlo así para utilizar mpi:

Código: Seleccionar todo

$ gcc -pthread -Wl,-rpath -Wl,/usr/lib/openmpi -Wl,--enable-new-dtags -L/usr/lib/openmpi -lmpi mpi-prog.c -o mpi-prog
o utilizar mpicc, que ya lo hace todo por tí:

Código: Seleccionar todo

$ mpicc mpi-prog.c -o mpi-prog
Editado -- Sab Feb 07, 2015 10:03 am --

Código: Seleccionar todo

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

#define rounds 100
#define MASTER 0

double dboart(int ndarts){
#define sqr(x) ((x)*(x))

	double x_coord, y_coord, r, pi;
	int n;
	int score = 0;
	
	/* "Throw darts at board." */
	for (n = 1; n <= ndarts; n++) {

		/* generate random numbers for x and y coordinates */
		r = (double)rand()/RAND_MAX;
		x_coord = (2.0 * r) - 1.0;
		r = (double)rand()/RAND_MAX;
		y_coord = (2.0 * r) - 1.0;

		/* if dart lands in circle, increment score */
		if ((sqr(x_coord) + sqr(y_coord)) <= 1.0)
			score++;
	}
	return score;
}


/***********************************************/
int main ( int argc, char *argv []) {
	double startwtime, endwtime;
	double picalculated, tmpval;
	double ascore, scoresum;
	int darts, i, rank, size;
	double realpi = 3.141592653589793;

	if (argc > 1)
		darts = atoi(argv[1]);
	else
		darts = 10000;

	MPI_Init( &argc, &argv);
	MPI_Comm_rank( MPI_COMM_WORLD, &rank ); // Identifier
	MPI_Comm_size( MPI_COMM_WORLD, &size ); // Number of processes

	printf( "I'm the process %d from a total of %d\n", rank, size);

	srand(time(NULL) + rank);
	picalculated = 0;
	startwtime = MPI_Wtime();

	for (i = 0; i < rounds; i++) {
		ascore = dboart(darts);          // obtiene aciertos
		MPI_Reduce(&ascore, &scoresum, 1, MPI_DOUBLE, MPI_SUM, MASTER, MPI_COMM_WORLD);   // acumula los aciertos de cada  proceso (MASTER recibe el resultado)
		
		// MASTER calcula el valor medio de pi
		if (rank == MASTER) {
			tmpval = (4.0 * scoresum)/(size * darts);                // valor parcial
			picalculated = ((picalculated * i) + tmpval)/(i + 1);    // valor medio
		}
	}

	// MASTER presenta el resultado
	if (rank == MASTER){
		endwtime = MPI_Wtime();
		printf( "\nThe calculated Pi is %.15f and has an error of %.15f \n\n", picalculated, fabs(picalculated - realpi));
		printf( "Execution time to calculate it = %f\n", endwtime - startwtime);
	}

	MPI_Finalize();

	return 0;
}

Código: Seleccionar todo

[$]: mpicc mpi-pi.c -o mpi-pi; mpirun ./mpi-pi 100000
I'm the process 1 from a total of 2
I'm the process 0 from a total of 2

The calculated Pi is 3.141243600000001 and has an error of 0.000349053589792 

Execution time to calculate it = 1.386863
[$]:  mpirun -np 7 ./mpi-pi 50000
I'm the process 3 from a total of 7
I'm the process 1 from a total of 7
I'm the process 6 from a total of 7
I'm the process 2 from a total of 7
I'm the process 4 from a total of 7
I'm the process 0 from a total of 7
I'm the process 5 from a total of 7

The calculated Pi is 3.141262285714284 and has an error of 0.000330367875509 

Execution time to calculate it = 1.822083
«La simplicidad es la máxima sofisticación» L. da Vinci
Arch Linux 64 (liquorix+BFS)
gonzajet
Forista Nuevo
Forista Nuevo
Mensajes: 1
Registrado: Lun Sep 10, 2018 3:03 pm

Re: Problemas con código en MPI (usando c).

Mensaje por gonzajet » Lun Sep 10, 2018 3:07 pm

Hola, que algoritmo y función matematica se está utilizando en ese código? Alguno podría facilitarme esto? Gracias
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje