Sfoglia il codice sorgente

Correction bug arret hybride

Arthur Brandao 6 anni fa
parent
commit
035d334025
5 ha cambiato i file con 18 aggiunte e 18 eliminazioni
  1. 4 3
      Hybride/GSATThreadMPI.cpp
  2. 1 0
      Hybride/GSATThreadMPI.hpp
  3. 10 13
      Hybride/Main.cpp
  4. 2 1
      Hybride/Main.hpp
  5. 1 1
      ReadMe.md

+ 4 - 3
Hybride/GSATThreadMPI.cpp

@@ -36,10 +36,13 @@ bool GSATThreadMPI::solve() {
 	for(int i = 0; i < nbThread; i++) {
 		threads[i] = std::thread(&GSATThreadMPI::solverThread, this, i);
 	}
+	//Lance thread de synchronisation MPI
+	mpiSync = std::thread(mpiWait, this);
 	//Attend resultat
 	for(int i = 0; i < nbThread; i++){
 		threads[i].join();
 	}
+	mpiSync.join();
 	//Si c'est le proc qui à trouvé
 	if(find) {
 		sleep(1); //Laisse le temps aux autres de se couper
@@ -94,12 +97,10 @@ void GSATThreadMPI::solverThread(int id) {
 			printf(RESET);
 		}
 		cpt++;
-		if(id == 0) {
-			mpiSync(this, end || solve);
-		}
 	}
 	//Si 1er arreter
 	if(!end && solve) {
+		mpiNotify(world_rank);
 		end = true;
 		find = true;
 		result.threadId = id;

+ 1 - 0
Hybride/GSATThreadMPI.hpp

@@ -36,6 +36,7 @@ class GSATThreadMPI {
 		int nbThread;
 		std::vector<GSAT*> gsat;
 		std::vector<std::thread> threads;
+		std::thread mpiSync;
 		GSATResult result;
 
 		void solverThread(int);

+ 10 - 13
Hybride/Main.cpp

@@ -68,19 +68,16 @@ int main(int argc, char* argv[]) {
 
 }
 
-void mpiSync(GSATThreadMPI* gsat, bool solve) {
-    bool stop = false;
-    for(int i = 0; i < world_size; i++){
-        int buff;
-        if(i == world_rank) {
-            buff = solve ? 1 : 0;
-        }
-        MPI_Bcast(&buff, 1, MPI_INT, i, MPI_COMM_WORLD);
-        if(i != world_rank && buff && !stop) {
-            stop = true;
-        }
-    }
-    if(stop) {
+void mpiWait(GSATThreadMPI* gsat) {
+    int buff;
+    MPI_Recv(&buff, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+    if(buff != world_rank) {
         gsat->isEnd();
     }
+}
+
+void mpiNotify(int rank) {
+    for(int i = 0; i < world_size; i++) {
+        MPI_Send(&rank, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
+    }
 }

+ 2 - 1
Hybride/Main.hpp

@@ -6,6 +6,7 @@
 extern int world_rank;
 
 void help(char*);
-void mpiSync(GSATThreadMPI*, bool);
+void mpiWait(GSATThreadMPI*);
+void mpiNotify(int);
 
 #endif

+ 1 - 1
ReadMe.md

@@ -6,4 +6,4 @@ Arthur Brandoa M1 S2 2018-2019
 
 ## Bug
 
-Parfois dans la version hybride seul le processus qui a trouvé s'arrete et les autres contniuent jusqu'a tous avoir trouvé une réponse . Quand tout le monde à trouver le probleme bloque et ne se coupe pas
+Aucun bug trouvé