From e3fda9210a8de6b912d12007f2086108c61c3fc4 Mon Sep 17 00:00:00 2001 From: JordanHanotiaux <103147288+JordanHanotiaux@users.noreply.github.com> Date: Fri, 11 Apr 2025 15:22:11 +0200 Subject: [PATCH] Update distributedmatrix.cpp --- P2/distributedmatrix.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/P2/distributedmatrix.cpp b/P2/distributedmatrix.cpp index e395f04..eaa6a2f 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; } -- GitLab