se detalla el procedimiento para echarlo andar, ahora con resultados interesantes:
1. Instalar el programa correcto de mpich , la versión propuesta o actual todavía tiene problemas con la librería mpi.lib.
2.Copiar los archivos lib a la carpeta del \\Qt\4.3.2\lib
3. Lamarlos desde el compilador en mi caso uso QDevelop y tengo adicionar a la variable
INCLUDEPATH += "c:\Program Files\MPICH2\include"
LIBS += -lmpi
4. Compilar linkear y todo bien para el caso del QT se tiene estos:
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"e:\Qt\4.3.2\include\QtCore" -I"e:\Qt\4.3.2\include\QtCore" -I"e:\Qt\4.3.2\include\QtGui" -I"e:\Qt\4.3.2\include\QtGui" -I"e:\Qt\4.3.2\include" -I"..\..\..\Program Files\MPICH2\include" -I"e:\Qt\4.3.2\include\ActiveQt" -I"release" -I"." -I"e:\Qt\4.3.2\mkspecs\default" -o release\pi.o src\pi.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -mthreads -Wl -o "release\Multi.exe" release\pi.o -L"e:\Qt\4.3.2\lib" -lmpi -lQtGui4 -lQtCore4
Luego de muchos intentos y problemas como que el printf( del C++ no funciona correctamente y además detiene la ejecución del MPI (???) conseguí el código correcto para correr el calculo de pi.
Codigo de Calculo de Pi#include
#include
#include
#include "math.h"
int main(int argc, char *argv[])
{
int n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double starttime, endtime;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
while (1) {
if (myid == 0) {
fprintf(stdout,"Enter the number of intervals: (0 quits) ");
fflush(stdout);
//qDebug() << "Enter the number of intervals: (0 quits) ";
scanf("%d",&n);
}
starttime = MPI_Wtime();
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0)
break;
else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; i <= n; i += numprocs) {
x = h * ((double) i - 0.5);
sum += (4.0 / (1.0 + x*x));
}
mypi = h * sum;
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
MPI_COMM_WORLD);
endtime = MPI_Wtime();
if (myid == 0){
fprintf(stdout,"Pi es = %lf y el error es %lf ", pi, fabs(pi - PI25DT));
fprintf(stdout,"el tiempo fue %f seg\n",endtime-starttime);
fflush(stdout);}
}
}
MPI_Finalize( );
return 0;
}
Asimismo para poder ejecutarlo en paralelo en las diferentes opciones se usa el mpiexec asi:
Usos del mpiexec
#Correr en la misma máquina 10 procesos
mpiexec -n 10 pi.exe
#Correr en otro maquina n procesos
mpiexec -n 10 -host nombrehost pi.exe
#Correr en varias maquinas n procesos
#se indica el archivo hosts.txt con los nombre de las maquinas en el formato
#nombredelhost1:5
#nombredelhost1:4
#la suma de nro de procesos distribuidos deberia ser n
mpiexec -machinefile hosts.txt -n 9 pi.exe
#Esta sirve para correr 5 casos de *.exe. en las maquinas listadas en hosts.txt
#se tuvo que añadir el entorno pues el cplex requiere ubicacion del archivo de entorno.
mpiexec -env CPLEXLICDIR E:\ -machinefile hosts.txt -n 5 calc2.exe
No hay comentarios:
Publicar un comentario