Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 3 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Vie Feb 06, 2015 12:53 am
Mensajes: 1

Nota Publicado: Vie Feb 06, 2015 1:01 am 
Arriba  
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!

 Perfil  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Dom Oct 19, 2014 6:26 pm
Mensajes: 281

Nota Publicado: Sab Feb 07, 2015 1:36 pm 
Arriba  
¿Cómo lo has compilado?

Con gcc tienes que hacerlo así para utilizar mpi:
Código:
$ 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:
$ mpicc mpi-prog.c -o mpi-prog


Editado -- Sab Feb 07, 2015 10:03 am --

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, 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:
[$]: 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)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Lun Sep 10, 2018 3:03 pm
Mensajes: 1

Nota Publicado: Lun Sep 10, 2018 3:07 pm 
Arriba  
Hola, que algoritmo y función matematica se está utilizando en ese código? Alguno podría facilitarme esto? Gracias

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 3 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Problemas al compilar usando make (no existe Makefile, sino Makefile.in/am)[solucionado]

en Software

danijmj

2

2012

Sab Feb 13, 2010 1:58 pm

danijmj Ver último mensaje

Soy nuevo usando Linux

en Preséntate

arteaga397

1

329

Dom May 30, 2010 1:56 am

Deckon Ver último mensaje

Ayuda! Error En Codigo

en Software

paolah49

1

409

Mié May 18, 2016 12:32 pm

neurus Ver último mensaje

Código Shell Básico

en Programación

rocioSERO

0

616

Lun Ene 25, 2010 11:28 am

rocioSERO Ver último mensaje

Achicar codigo PERL

en Programación

LARCax

3

599

Dom Mar 12, 2017 9:44 pm

Kuantiko Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO