diff --git a/parallele_spaltenzerlegung.cpp b/parallele_spaltenzerlegung.cpp new file mode 100644 index 0000000..dbafaa7 --- /dev/null +++ b/parallele_spaltenzerlegung.cpp @@ -0,0 +1,94 @@ +#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; +} + +// Spaltenparallel (Column-parallel) +std::vector> matmul_column_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 j = 0; j < m; ++j) // Spalten parallel + for (int i = 0; i < n; ++i) + 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"; + + // Spaltenparallel + start = std::chrono::steady_clock::now(); + auto C_col = matmul_column_parallel(A, B); + end = std::chrono::steady_clock::now(); + std::cout << "Column-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_col[i][j]) + { + std::cout << "Mismatch at " << i << "," << j << "\n"; + return 1; + } + + std::cout << "All results match!\n"; + return 0; +}