diff --git a/P2/distributedtests.cpp b/P2/distributedtests.cpp index cac017c83579c320b2f87ad793c87ce9c86c453f..89cdc1ae91db97193ea47a7f63b6d22226f70dbe 100644 --- a/P2/distributedtests.cpp +++ b/P2/distributedtests.cpp @@ -32,7 +32,7 @@ bool matricesEqual(const Matrix& a, const Matrix& b, double epsilon = 1e-10) { void testMultiplyTransposed() { - int sizes[] = {512, 1024, 2058}; + int sizes[] = {256, 512, 1024}; int rank, numProcs; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &numProcs); @@ -40,51 +40,68 @@ void testMultiplyTransposed() { std::ofstream csvFile; if (rank == 0) { csvFile.open("results.csv"); - csvFile << "MatrixSize,SequentialTime,DistributedTime,SpeedUp\n"; + csvFile << "MatrixSize,AverageSequentialTime,AverageDistributedTime,AverageSpeedUp\n"; } for (int s = 0; s < 3; ++s) { int N = sizes[s]; - // Initialisation des matrices pleines - Matrix matrix1Full(N, N); - Matrix matrix2Full(N, N); - for (int i = 0; i < N; i++) { - for (int j = 0; j < N; j++) { - matrix1Full.set(i, j, i * 5 + j + 1); - matrix2Full.set(i, j, i * 5 + j + 2); + double totalTimeSeq = 0.0; + double totalTimeDist = 0.0; + + for (int rep = 0; rep < 3; ++rep) { + // Initialisation des matrices pleines + Matrix matrix1Full(N, N); + Matrix matrix2Full(N, N); + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + matrix1Full.set(i, j, i * 5 + j + 1); + matrix2Full.set(i, j, i * 5 + j + 2); + } } - } - // Création des matrices distribuées - DistributedMatrix matrix1(matrix1Full, numProcs); - DistributedMatrix matrix2(matrix2Full, numProcs); + // Création des matrices distribuées + DistributedMatrix matrix1(matrix1Full, numProcs); + DistributedMatrix matrix2(matrix2Full, numProcs); + + // Chronométrage de l'opération distribuée + MPI_Barrier(MPI_COMM_WORLD); + double startDistributed = MPI_Wtime(); + Matrix resultDistributed = matrix1.multiplyTransposed(matrix2); + MPI_Barrier(MPI_COMM_WORLD); + double endDistributed = MPI_Wtime(); + double timeDist = endDistributed - startDistributed; + + // Chronométrage de l'opération séquentielle + double timeSeq = 0.0; + if (rank == 0) { + double startSequential = MPI_Wtime(); + Matrix resultSequential = matrix1Full * matrix2Full.transpose(); + double endSequential = MPI_Wtime(); + timeSeq = endSequential - startSequential; + } - // Chronométrage de l'opération distribuée - MPI_Barrier(MPI_COMM_WORLD); - double startDistributed = MPI_Wtime(); - Matrix resultDistributed = matrix1.multiplyTransposed(matrix2); - MPI_Barrier(MPI_COMM_WORLD); - double endDistributed = MPI_Wtime(); - double timeDist = endDistributed - startDistributed; + // Broadcast pour que tous les rangs aient les mêmes valeurs de temps + MPI_Bcast(&timeSeq, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); - // Chronométrage de l'opération séquentielle - double timeSeq = 0.0; - if (rank == 0) { - double startSequential = MPI_Wtime(); - Matrix resultSequential = matrix1Full * matrix2Full.transpose(); - double endSequential = MPI_Wtime(); - timeSeq = endSequential - startSequential; + // Accumuler + totalTimeSeq += timeSeq; + totalTimeDist += timeDist; + } - double speedUp = timeSeq / timeDist; + // Moyennes + double avgSeq = totalTimeSeq / 3.0; + double avgDist = totalTimeDist / 3.0; + double avgSpeedUp = avgSeq / avgDist; + if (rank == 0) { std::cout << "Matrix size: " << N << "x" << N << std::endl; - std::cout << "Sequential time: " << timeSeq << " s" << std::endl; - std::cout << "Distributed time: " << timeDist << " s" << std::endl; - std::cout << "Speed up (Seq/Dist): " << speedUp << std::endl; + std::cout << "Avg sequential time: " << avgSeq << " s" << std::endl; + std::cout << "Avg distributed time: " << avgDist << " s" << std::endl; + std::cout << "Avg speed up: " << avgSpeedUp << std::endl; std::cout << "-----------------------------------------" << std::endl; - csvFile << N << "," << timeSeq << "," << timeDist << "," << speedUp << "\n"; + csvFile << N << "," << avgSeq << "," << avgDist << "," << avgSpeedUp << "\n"; } } @@ -94,6 +111,7 @@ void testMultiplyTransposed() { } } + int main(int argc, char** argv) { // Initialiser MPI int initialized;