From a889e2b5aecbe21f364e890e5d38e98693c83f95 Mon Sep 17 00:00:00 2001 From: "lisa.pizzo" Date: Thu, 4 Dec 2025 12:27:47 +0100 Subject: [PATCH] Main file - Exercise 5* (or Ex6) --- Sheet5/mainEx6.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Sheet5/mainEx6.cpp diff --git a/Sheet5/mainEx6.cpp b/Sheet5/mainEx6.cpp new file mode 100644 index 0000000..c23aa85 --- /dev/null +++ b/Sheet5/mainEx6.cpp @@ -0,0 +1,69 @@ +// HOW TO COMPILE ON MAC (paste these lines in terminal): +// export CPPFLAGS="-I/opt/homebrew/opt/libomp/include" +// export LDFLAGS="-L/opt/homebrew/opt/libomp/lib" +// clang++ -std=c++17 -O3 -Xpreprocessor -fopenmp $CPPFLAGS mainEx6.cpp bench_funcs.cpp $LDFLAGS -lomp -o Ex6 +// ./Ex6 +// +// You can set OMP_NUM_THREADS in the shell to control threads. + +#include +#include +#include +#include +#include "bench_funcs.h" + +using namespace std; +using namespace std::chrono; + +int main() +{ + size_t n = 200000; + size_t maxit = 5000; + double omega = 1.0; + double tol = 1e-8; + + // show threads + #pragma omp parallel + { + #pragma omp single + cout << "Using " << omp_get_num_threads() << " OpenMP threads\n"; + } + + CSR K_atomic, K_noatom; + vector f; + + cout << "\n--- Build with ATOMICS (parallel over elements with atomic adds) ---\n"; + auto t0 = high_resolution_clock::now(); + build_fem_system_atomic(n, K_atomic, f); + auto t1 = high_resolution_clock::now(); + cout << "Assembly (atomic) time = " << duration(t1 - t0).count() << " s\n"; + + cout << "\nBuild with NO ATOMICS (grouped / per-row accumulation)\n"; + t0 = high_resolution_clock::now(); + build_fem_system_no_atomic(n, K_noatom, f); + t1 = high_resolution_clock::now(); + cout << "Assembly (no-atomic) time = " << duration(t1 - t0).count() << " s\n"; + + // quick check: compare val arrays (they should be equal) + bool same = true; + if (K_atomic.val.size() == K_noatom.val.size()) { + for (size_t i = 0; i < K_atomic.val.size(); ++i) { + if (std::fabs(K_atomic.val[i] - K_noatom.val[i]) > 1e-12) { + same = false; break; + } + } + } else same = false; + + cout << "\nMatrix equality check (atomic vs no-atomic): " << (same ? "OK" : "DIFFER") << "\n"; + + // Run Jacobi solver on the no-atomic assembled matrix + cout << "\nRun Jacobi on NO-ATOMIC matrix\n"; + vector u; + t0 = high_resolution_clock::now(); + jacobi_csr_parallel(K_noatom, f, u, maxit, omega, tol); + t1 = high_resolution_clock::now(); + cout << "Jacobi time = " << duration(t1 - t0).count() << " s\n"; + + cout << "\nDone.\n"; + return 0; +}