#include #include #include #include #include #include // Zufallsmatrizen erzeugen void generateRandomMatrices(int n, std::vector>& A, std::vector>& B) { std::srand(static_cast(std::time(nullptr))); A.resize(n, std::vector(n)); B.resize(n, std::vector(n)); for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { A[i][j] = static_cast(rand()) / RAND_MAX * 10.0; B[i][j] = static_cast(rand()) / RAND_MAX * 10.0; } } // Serielle Matrizenmultiplikation std::vector> matmul_serial( const std::vector>& A, const std::vector>& B) { int n = A.size(); int m = B[0].size(); int p = B.size(); std::vector> C(n, std::vector(m, 0.0)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) for (int k = 0; k < p; ++k) C[i][j] += A[i][k] * B[k][j]; return C; } // Parallele Zeilenzerlegung std::vector> matmul_row_parallel( const std::vector>& A, const std::vector>& B) { int n = A.size(); int m = B[0].size(); int p = B.size(); std::vector> C(n, std::vector(m, 0.0)); #pragma omp parallel for for (int i = 0; i < n; ++i) // Zeilen parallel for (int j = 0; j < m; ++j) for (int k = 0; k < p; ++k) C[i][j] += A[i][k] * B[k][j]; return C; } // ----------------------------- int main() { int N = 500; std::vector> A, B; generateRandomMatrices(N, A, B); // Serielle Version auto start = std::chrono::steady_clock::now(); auto C_serial = matmul_serial(A, B); auto end = std::chrono::steady_clock::now(); std::cout << "Serial multiplication took: " << std::chrono::duration(end - start).count() << "s\n"; // Zeilenparallel start = std::chrono::steady_clock::now(); auto C_row = matmul_row_parallel(A, B); end = std::chrono::steady_clock::now(); std::cout << "Row-parallel multiplication took: " << std::chrono::duration(end - start).count() << "s\n"; // Vergleich for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) if (C_serial[i][j] != C_row[i][j]) { std::cout << "Mismatch at " << i << "," << j << "\n"; return 1; } std::cout << "All results match!\n"; return 0; }