diff --git a/P2/distributedmatrix.cpp b/P2/distributedmatrix.cpp index e395f042055364cc1fb7acbb79a084c44a042be9..eaa6a2fa460d3e65bc3ec8e7dd6658c667f2ab01 100644 --- a/P2/distributedmatrix.cpp +++ b/P2/distributedmatrix.cpp @@ -82,22 +82,33 @@ int DistributedMatrix::ownerProcess(int globalColIndex) const { // Vecteur pour stocker les startCols de chaque processus std::vector<int> localStartProcesses(numProcesses); - // Synchroniser les startCols de tous les processus + // Calcul du startCol pour le processus local + int remainingCols = globalCols % numProcesses; + int localCols = globalCols / numProcesses; // Cols par processus + int startCol = rank * localCols + std::min(rank, remainingCols); + + // Synchroniser les startCols entre tous les processus MPI_Allgather(&startCol, 1, MPI_INT, localStartProcesses.data(), 1, MPI_INT, MPI_COMM_WORLD); - // Vérifier à quel processus appartient globalColIndex - for (int p = 1; p < numProcesses; ++p) { - // Si globalColIndex est entre deux startCols, le processus p-1 est le propriétaire - if (globalColIndex >= localStartProcesses[p-1] && globalColIndex < localStartProcesses[p]) { - return p - 1; + // Vérifier à quel processus appartient globalColIndex en utilisant localStartProcesses + for (int p = 0; p < numProcesses; ++p) { + // Définir le nombre de colonnes pour le processus p (p peut avoir une colonne supplémentaire) + int cols = localCols + (p < remainingCols ? 1 : 0); + int start = localStartProcesses[p]; + int end = start + cols; + + // Vérifier si la colonne globale est dans l'intervalle de ce processus + if (globalColIndex >= start && globalColIndex < end) { + return p; } } - // Si aucune condition n'est remplie, cela signifie que globalColIndex appartient au dernier processus - return numProcesses - 1; + // Si aucune condition n'est remplie (cela ne devrait pas arriver), renvoyer par défaut le processus 0 + return 0; } + const Matrix& DistributedMatrix::getLocalData() const { return localData; }