Quellcode durchsuchen

Correction bug affichage multiple solution

Loquicom vor 6 Jahren
Ursprung
Commit
a5e6ea01b9
3 geänderte Dateien mit 46 neuen und 8 gelöschten Zeilen
  1. 20 7
      Partie_1/Hybride/GSATThreadMPI.cpp
  2. 3 1
      Partie_1/Hybride/GSATThreadMPI.hpp
  3. 23 0
      Partie_1/Hybride/Main.cpp

+ 20 - 7
Partie_1/Hybride/GSATThreadMPI.cpp

@@ -47,10 +47,7 @@ bool GSATThreadMPI::solve() {
 	mpiSync.join();
 	//Si c'est le proc qui à trouvé
 	if(find) {
-		//Affiche resultat
-		sleep(1); //Attend la fin des autres processus
-		printf("-----------------------------------------------------------------------------------------------------------------\n");
-		this->printResult();
+		this->mpiSendResult(DISPLAY_RANK);
 	}
   	return find;
 }
@@ -81,7 +78,8 @@ void GSATThreadMPI::printResult() {
     fflush(stdout);
 }
 
-void GSATThreadMPI::setResult(int pid, int rank, int thread, double time, unsigned int nbIte, unsigned int heuriFill, unsigned int heuriSolve, unsigned int statisfFill, unsigned int satisfSolve) {
+void GSATThreadMPI::setResult(bool isFind, int pid, int rank, int thread, double time, unsigned int nbIte, unsigned int heuriFill, unsigned int heuriSolve, unsigned int satisfFill, unsigned int satisfSolve) {
+	find = isFind;
 	result.pid = pid;
 	result.rank = rank;
 	result.threadId = thread;
@@ -89,8 +87,8 @@ void GSATThreadMPI::setResult(int pid, int rank, int thread, double time, unsign
 	result.nbIteration = nbIte;
 	result.heuristicFill = heuriFill;
 	result.heuristicSolve = heuriSolve;
-	result.nbSatisfiedClausesFill = statisfFill;
-	result.nbSatisfiedClausesSolve = statisfFill;
+	result.nbSatisfiedClausesFill = satisfFill;
+	result.nbSatisfiedClausesSolve = satisfSolve;
 }
 
 /* --- Private --- */
@@ -128,6 +126,7 @@ void GSATThreadMPI::solverThread(int id) {
 		this->end(true);
 		find = true;
 		this->setResult(
+			true,
 			getpid(), 
 			world_rank, 
 			id, gsat[id]->realTime() - startTime, 
@@ -154,3 +153,17 @@ void GSATThreadMPI::mpiNotify(int rank) {
         MPI_Isend(&rank, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &request);
     }
 }
+
+void GSATThreadMPI::mpiSendResult(int rankTo) {
+	MPI_Request request;
+	//Envoi des infos au rank determiné
+	MPI_Isend(&result.pid, 1, MPI_INT, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.rank, 1, MPI_INT, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.threadId, 1, MPI_INT, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.calcTime, 1, MPI_DOUBLE, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.nbIteration, 1, MPI_UNSIGNED, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.heuristicFill, 1, MPI_UNSIGNED, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.heuristicSolve, 1, MPI_UNSIGNED, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.nbSatisfiedClausesFill, 1, MPI_UNSIGNED, rankTo, 0, MPI_COMM_WORLD, &request);
+	MPI_Isend(&result.nbSatisfiedClausesSolve, 1, MPI_UNSIGNED, rankTo, 0, MPI_COMM_WORLD, &request);
+}

+ 3 - 1
Partie_1/Hybride/GSATThreadMPI.hpp

@@ -8,6 +8,7 @@
 
 /* --- Constante --- */
 #define DEFAULT_NB_THREAD 4
+#define DISPLAY_RANK 0
 
 /* --- Structure --- */
 typedef struct {
@@ -38,7 +39,7 @@ class GSATThreadMPI {
 		inline unsigned int getNbVariables() {return gsat[0]->getNbVariables();}
 		inline unsigned int getNbClauses() {return gsat[0]->getNbClauses();}
 		inline GSATResult getResult() {return result;}
-		void setResult(int, int, int, double, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
+		void setResult(bool, int, int, int, double, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);
 
 	private:
 		bool bEnd;
@@ -52,6 +53,7 @@ class GSATThreadMPI {
 		void solverThread(int);
 		void mpiWait(GSATThreadMPI*);
 		void mpiNotify(int);
+		void mpiSendResult(int);
 };
 
 #endif

+ 23 - 0
Partie_1/Hybride/Main.cpp

@@ -64,6 +64,29 @@ int main(int argc, char* argv[]) {
         printf("c nbClauses: %d\n", gsat->getNbClauses());
     }
     gsat->solve();
+
+    //Le processus d'affichage attend de recevoir les resultats à afficher
+    if(world_rank == DISPLAY_RANK) {
+        //Recup les infos
+        int pid, rank, thread;
+        double time;
+        unsigned int nbIte, heuriFill, heuriSolve, satisfFill, satisfSolve;
+        MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&rank, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&thread, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&time, 1, MPI_DOUBLE, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&nbIte, 1, MPI_UNSIGNED, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&heuriFill, 1, MPI_UNSIGNED, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&heuriSolve, 1, MPI_UNSIGNED, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&satisfFill, 1, MPI_UNSIGNED, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        MPI_Recv(&satisfSolve, 1, MPI_UNSIGNED, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+        //Set le resultat
+        gsat->setResult(true, pid, rank, thread, time, nbIte, heuriFill, heuriSolve, satisfFill, satisfSolve);
+        //Affiche resultat
+        sleep(1); //Attend la fin des autres processus
+        printf("-----------------------------------------------------------------------------------------------------------------\n");
+        gsat->printResult();
+    }
     
     MPI_Finalize();