From 4f94e7ef9920eab5545fc6ccfdd3b1741732a8bb Mon Sep 17 00:00:00 2001 From: David Goz <david.goz@inaf.it> Date: Tue, 25 Jun 2024 09:21:08 +0200 Subject: [PATCH] hpc_school --- .../not_opt/src/jacobi_2D_omp_not_opt.c | 8 +- .../not_opt/src/jacobi_2D_serial_not_opt.c | 22 +- .../mpi/SendRecv/Makefile | 0 .../mpi/SendRecv/include/allvars.h | 0 .../mpi/SendRecv/include/tools.h | 0 .../mpi/SendRecv/make.def | 0 .../mpi/SendRecv/make_mpi_path | 0 .../mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c | 0 .../mpi/SendRecv/src/tools.c | 0 .../mpi/Send_Recv_blocking/Makefile | 0 .../mpi/Send_Recv_blocking/include/allvars.h | 0 .../mpi/Send_Recv_blocking/include/tools.h | 0 .../mpi/Send_Recv_blocking/make.def | 0 .../mpi/Send_Recv_blocking/make_mpi_path | 0 .../script/input_parameters | 0 .../Send_Recv_blocking/script/run_pleiadi.sh | 0 .../src/jacobi_2D_mpi_send_recv_blocking.c | 0 .../mpi/Send_Recv_blocking/src/tools.c | 0 .../mpi/Send_Recv_nonblocking/Makefile | 0 .../Send_Recv_nonblocking/include/allvars.h | 0 .../mpi/Send_Recv_nonblocking/include/tools.h | 0 .../mpi/Send_Recv_nonblocking/make.def | 0 .../mpi/Send_Recv_nonblocking/make_mpi_path | 0 .../script/input_parameters | 0 .../script/run_pleiadi.sh | 0 .../src/jacobi_2D_mpi_send_recv_nonblocking.c | 0 .../mpi/Send_Recv_nonblocking/src/tools.c | 0 .../mpi/Send_Recv_paired/Makefile | 0 .../mpi/Send_Recv_paired/include/allvars.h | 0 .../mpi/Send_Recv_paired/include/tools.h | 0 .../mpi/Send_Recv_paired/make.def | 0 .../mpi/Send_Recv_paired/make_mpi_path | 0 .../src/jacobi_2D_mpi_send_recv_paired.c | 0 .../mpi/Send_Recv_paired/src/tools.c | 0 .../mpi/cartesian/Makefile | 0 .../mpi/cartesian/include/allvars.h | 0 .../mpi/cartesian/include/tools.h | 0 .../mpi/cartesian/make.def | 0 .../mpi/cartesian/make_mpi_path | 0 .../cartesian/src/jacobi_2D_mpi_cartesian.c | 0 .../mpi/cartesian/src/tools.c | 0 .../mpi/comp_comm/Makefile | 0 .../mpi/comp_comm/include/allvars.h | 0 .../mpi/comp_comm/include/tools.h | 0 .../mpi/comp_comm/make.def | 0 .../mpi/comp_comm/make_mpi_path | 0 .../mpi/comp_comm/script/input_parameters | 0 .../mpi/comp_comm/script/run_pleiadi.sh | 0 .../comp_comm/src/jacobi_2D_mpi_comp_comm.c | 0 .../mpi/comp_comm/src/tools.c | 0 .../mpi/comp_comm_io/Makefile | 0 .../mpi/comp_comm_io/include/allvars.h | 0 .../mpi/comp_comm_io/include/tools.h | 0 .../mpi/comp_comm_io/make.def | 0 .../mpi/comp_comm_io/make_mpi_path | 0 .../mpi/comp_comm_io/script/input_parameters | 0 .../mpi/comp_comm_io/script/run_pleiadi.sh | 0 .../src/jacobi_2D_mpi_comp_comm_io.c | 0 .../mpi/comp_comm_io/src/tools.c | 0 .../Broadcast_Gather_Scatter/Broadcast_1.cc | 0 .../Broadcast_Gather_Scatter/Broadcast_2.cc | 0 .../Broadcast_Gather_Scatter/Gather_Scatter.c | 0 .../Heat_Equation_Gather.c | 0 .../lecture_Broadcast_Gather_Scatter.pdf | Bin .../miscellaneous/MPI_Datatypes/Subarray.c | 0 .../MPI_Datatypes/lecture_MPI_Datatypes.pdf | Bin .../mpi/miscellaneous/MPI_Datatypes/tools.c | 0 .../Parallel_IO/lecture_Parallel_IO.pdf | Bin .../miscellaneous/Parallel_IO/write_arr1D.c | 0 .../miscellaneous/Parallel_IO/write_arr2D.c | 0 .../mpi/miscellaneous/cartesian | Bin .../mpi/miscellaneous/cartesian.c | 0 .../mpi/miscellaneous/cartesian.cpp | 0 .../mpi/miscellaneous/color_ring.c | 0 .../mpi/miscellaneous/lecture_color_ring.pdf | Bin .../mpi/miscellaneous/subarray | Bin .../mpi/miscellaneous/subarray.c | 0 .../openmp/not_opt}/Makefile | 0 .../openmp/not_opt/include/allvars.h | 20 ++ .../openmp/not_opt}/include/tools.h | 0 jacobi_solutions/openmp/not_opt/make.def | 53 +++ .../openmp/not_opt/script/input_parameters | 9 + jacobi_solutions/openmp/not_opt/script/run.sh | 63 ++++ .../not_opt/src/jacobi_2D_omp_not_opt.c | 309 ++++++++++++++++++ .../openmp/not_opt}/src/tools.c | 0 jacobi_solutions/openmp/opt/Makefile | 66 ++++ .../openmp/opt/include/allvars.h | 0 .../openmp}/opt/include/tools.h | 0 .../openmp/opt/make.def | 0 .../openmp/opt/src/jacobi_2D_omp_opt.c | 6 +- .../openmp}/opt/src/tools.c | 0 jacobi_solutions/serial/not_opt/Makefile | 63 ++++ .../serial/not_opt}/include/allvars.h | 0 .../serial/not_opt/include/tools.h | 18 + jacobi_solutions/serial/not_opt/make.def | 45 +++ .../serial/not_opt/script/input_parameters | 8 + jacobi_solutions/serial/not_opt/script/run.sh | 52 +++ .../not_opt/src/jacobi_2D_serial_not_opt.c | 274 ++++++++++++++++ jacobi_solutions/serial/not_opt/src/tools.c | 59 ++++ .../serial/opt/Makefile | 0 jacobi_solutions/serial/opt/include/allvars.h | 9 + jacobi_solutions/serial/opt/include/tools.h | 18 + .../serial/opt/make.def | 0 .../serial/opt/src/jacobi_2D_serial_opt.c | 0 jacobi_solutions/serial/opt/src/tools.c | 59 ++++ ...C_course_2024_hands-on_session_OpenMP.pdf} | Bin 84051 -> 91732 bytes ...se_2024_hands-on_session_presentation.pdf} | Bin 224267 -> 225898 bytes 107 files changed, 1136 insertions(+), 25 deletions(-) rename {jacobi => jacobi_solutions}/mpi/SendRecv/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c (100%) rename {jacobi => jacobi_solutions}/mpi/SendRecv/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/script/input_parameters (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/script/run_pleiadi.sh (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/src/jacobi_2D_mpi_send_recv_blocking.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_blocking/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/script/input_parameters (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/script/run_pleiadi.sh (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/src/jacobi_2D_mpi_send_recv_nonblocking.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_nonblocking/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/src/jacobi_2D_mpi_send_recv_paired.c (100%) rename {jacobi => jacobi_solutions}/mpi/Send_Recv_paired/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/src/jacobi_2D_mpi_cartesian.c (100%) rename {jacobi => jacobi_solutions}/mpi/cartesian/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/script/input_parameters (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/script/run_pleiadi.sh (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/src/jacobi_2D_mpi_comp_comm.c (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/Makefile (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/include/allvars.h (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/include/tools.h (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/make.def (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/make_mpi_path (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/script/input_parameters (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/script/run_pleiadi.sh (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/src/jacobi_2D_mpi_comp_comm_io.c (100%) rename {jacobi => jacobi_solutions}/mpi/comp_comm_io/src/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_1.cc (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_2.cc (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Broadcast_Gather_Scatter/Gather_Scatter.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Broadcast_Gather_Scatter/Heat_Equation_Gather.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Broadcast_Gather_Scatter/lecture_Broadcast_Gather_Scatter.pdf (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/MPI_Datatypes/Subarray.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/MPI_Datatypes/lecture_MPI_Datatypes.pdf (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/MPI_Datatypes/tools.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Parallel_IO/lecture_Parallel_IO.pdf (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Parallel_IO/write_arr1D.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/Parallel_IO/write_arr2D.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/cartesian (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/cartesian.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/cartesian.cpp (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/color_ring.c (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/lecture_color_ring.pdf (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/subarray (100%) rename {jacobi => jacobi_solutions}/mpi/miscellaneous/subarray.c (100%) rename {jacobi/openmp/opt => jacobi_solutions/openmp/not_opt}/Makefile (100%) create mode 100644 jacobi_solutions/openmp/not_opt/include/allvars.h rename {jacobi/openmp/opt => jacobi_solutions/openmp/not_opt}/include/tools.h (100%) create mode 100644 jacobi_solutions/openmp/not_opt/make.def create mode 100644 jacobi_solutions/openmp/not_opt/script/input_parameters create mode 100755 jacobi_solutions/openmp/not_opt/script/run.sh create mode 100644 jacobi_solutions/openmp/not_opt/src/jacobi_2D_omp_not_opt.c rename {jacobi/openmp/opt => jacobi_solutions/openmp/not_opt}/src/tools.c (100%) create mode 100644 jacobi_solutions/openmp/opt/Makefile rename {jacobi => jacobi_solutions}/openmp/opt/include/allvars.h (100%) rename {jacobi/serial => jacobi_solutions/openmp}/opt/include/tools.h (100%) rename {jacobi => jacobi_solutions}/openmp/opt/make.def (100%) rename {jacobi => jacobi_solutions}/openmp/opt/src/jacobi_2D_omp_opt.c (98%) rename {jacobi/serial => jacobi_solutions/openmp}/opt/src/tools.c (100%) create mode 100644 jacobi_solutions/serial/not_opt/Makefile rename {jacobi/serial/opt => jacobi_solutions/serial/not_opt}/include/allvars.h (100%) create mode 100644 jacobi_solutions/serial/not_opt/include/tools.h create mode 100644 jacobi_solutions/serial/not_opt/make.def create mode 100644 jacobi_solutions/serial/not_opt/script/input_parameters create mode 100755 jacobi_solutions/serial/not_opt/script/run.sh create mode 100644 jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c create mode 100644 jacobi_solutions/serial/not_opt/src/tools.c rename {jacobi => jacobi_solutions}/serial/opt/Makefile (100%) create mode 100644 jacobi_solutions/serial/opt/include/allvars.h create mode 100644 jacobi_solutions/serial/opt/include/tools.h rename {jacobi => jacobi_solutions}/serial/opt/make.def (100%) rename {jacobi => jacobi_solutions}/serial/opt/src/jacobi_2D_serial_opt.c (100%) create mode 100644 jacobi_solutions/serial/opt/src/tools.c rename material/slides/{INAF_HPC_course_hands-on_session_OpenMP.pdf => INAF_HPC_course_2024_hands-on_session_OpenMP.pdf} (79%) rename material/slides/{INAF_HPC_course_hands-on_session_presentation.pdf => INAF_HPC_course_2024_hands-on_session_presentation.pdf} (89%) diff --git a/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c b/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c index a43c5bb..d61d7fd 100644 --- a/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c +++ b/jacobi/openmp/not_opt/src/jacobi_2D_omp_not_opt.c @@ -225,9 +225,7 @@ void JacobiAlgorithm(MyData **const restrict Phi, { *error = 0.0; -#pragma omp parallel default(none) shared(error, delta, Phi, Phi0) \ - firstprivate(ibeg, iend, jbeg, jend) \ - num_threads(Nthreads) +#pragma omp parallel default(none) /**** MISSING CLAUSES ****/ { #if defined(DEBUG) const int id = omp_get_thread_num(); @@ -236,7 +234,9 @@ void JacobiAlgorithm(MyData **const restrict Phi, #pragma omp barrier #endif /* DEBUG */ - #pragma omp for schedule(static) + + /***** MISSING LOOP(s) PARALLELIZATION *****/ + for (int j=jbeg ; j<=jend ; j++) { for (int i=ibeg ; i<=iend ; i++) diff --git a/jacobi/serial/not_opt/src/jacobi_2D_serial_not_opt.c b/jacobi/serial/not_opt/src/jacobi_2D_serial_not_opt.c index ba53f32..ea1d8ed 100644 --- a/jacobi/serial/not_opt/src/jacobi_2D_serial_not_opt.c +++ b/jacobi/serial/not_opt/src/jacobi_2D_serial_not_opt.c @@ -75,7 +75,7 @@ int main(int argc, char **argv) 2. Generate grid, allocate memory -------------------------------------------------------- */ - /* memory allocation */ + /* memory allocation for I.C. */ MyData *xg = (MyData *) malloc((NX_GLOB + 2*NGHOST) * sizeof(MyData)); MyData *yg = (MyData *) malloc((NY_GLOB + 2*NGHOST) * sizeof(MyData)); assert((xg != NULL) && (yg != NULL)); @@ -136,24 +136,10 @@ int main(int argc, char **argv) printf("\n\t NX_GLOB x NY_GLOB = %d x %d\n", NX_GLOB, NY_GLOB); printf("\n\t Time = %lf [s]\n\n", seconds() - time_start); - // free memory - if (phi0) - { - free(phi0[0]); - free(phi0); - } - - if (phi) - { - free(phi[0]); - free(phi); - } - if (yg) - free(yg); - - if (xg) - free(xg); + /******************** MISSING CODE ********************************/ + /* free memory dynamically allocated */ + /******************** MISSING CODE ********************************/ return 0; } diff --git a/jacobi/mpi/SendRecv/Makefile b/jacobi_solutions/mpi/SendRecv/Makefile similarity index 100% rename from jacobi/mpi/SendRecv/Makefile rename to jacobi_solutions/mpi/SendRecv/Makefile diff --git a/jacobi/mpi/SendRecv/include/allvars.h b/jacobi_solutions/mpi/SendRecv/include/allvars.h similarity index 100% rename from jacobi/mpi/SendRecv/include/allvars.h rename to jacobi_solutions/mpi/SendRecv/include/allvars.h diff --git a/jacobi/mpi/SendRecv/include/tools.h b/jacobi_solutions/mpi/SendRecv/include/tools.h similarity index 100% rename from jacobi/mpi/SendRecv/include/tools.h rename to jacobi_solutions/mpi/SendRecv/include/tools.h diff --git a/jacobi/mpi/SendRecv/make.def b/jacobi_solutions/mpi/SendRecv/make.def similarity index 100% rename from jacobi/mpi/SendRecv/make.def rename to jacobi_solutions/mpi/SendRecv/make.def diff --git a/jacobi/mpi/SendRecv/make_mpi_path b/jacobi_solutions/mpi/SendRecv/make_mpi_path similarity index 100% rename from jacobi/mpi/SendRecv/make_mpi_path rename to jacobi_solutions/mpi/SendRecv/make_mpi_path diff --git a/jacobi/mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c b/jacobi_solutions/mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c similarity index 100% rename from jacobi/mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c rename to jacobi_solutions/mpi/SendRecv/src/jacobi_2D_mpi_sendrecv.c diff --git a/jacobi/mpi/SendRecv/src/tools.c b/jacobi_solutions/mpi/SendRecv/src/tools.c similarity index 100% rename from jacobi/mpi/SendRecv/src/tools.c rename to jacobi_solutions/mpi/SendRecv/src/tools.c diff --git a/jacobi/mpi/Send_Recv_blocking/Makefile b/jacobi_solutions/mpi/Send_Recv_blocking/Makefile similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/Makefile rename to jacobi_solutions/mpi/Send_Recv_blocking/Makefile diff --git a/jacobi/mpi/Send_Recv_blocking/include/allvars.h b/jacobi_solutions/mpi/Send_Recv_blocking/include/allvars.h similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/include/allvars.h rename to jacobi_solutions/mpi/Send_Recv_blocking/include/allvars.h diff --git a/jacobi/mpi/Send_Recv_blocking/include/tools.h b/jacobi_solutions/mpi/Send_Recv_blocking/include/tools.h similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/include/tools.h rename to jacobi_solutions/mpi/Send_Recv_blocking/include/tools.h diff --git a/jacobi/mpi/Send_Recv_blocking/make.def b/jacobi_solutions/mpi/Send_Recv_blocking/make.def similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/make.def rename to jacobi_solutions/mpi/Send_Recv_blocking/make.def diff --git a/jacobi/mpi/Send_Recv_blocking/make_mpi_path b/jacobi_solutions/mpi/Send_Recv_blocking/make_mpi_path similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/make_mpi_path rename to jacobi_solutions/mpi/Send_Recv_blocking/make_mpi_path diff --git a/jacobi/mpi/Send_Recv_blocking/script/input_parameters b/jacobi_solutions/mpi/Send_Recv_blocking/script/input_parameters similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/script/input_parameters rename to jacobi_solutions/mpi/Send_Recv_blocking/script/input_parameters diff --git a/jacobi/mpi/Send_Recv_blocking/script/run_pleiadi.sh b/jacobi_solutions/mpi/Send_Recv_blocking/script/run_pleiadi.sh similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/script/run_pleiadi.sh rename to jacobi_solutions/mpi/Send_Recv_blocking/script/run_pleiadi.sh diff --git a/jacobi/mpi/Send_Recv_blocking/src/jacobi_2D_mpi_send_recv_blocking.c b/jacobi_solutions/mpi/Send_Recv_blocking/src/jacobi_2D_mpi_send_recv_blocking.c similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/src/jacobi_2D_mpi_send_recv_blocking.c rename to jacobi_solutions/mpi/Send_Recv_blocking/src/jacobi_2D_mpi_send_recv_blocking.c diff --git a/jacobi/mpi/Send_Recv_blocking/src/tools.c b/jacobi_solutions/mpi/Send_Recv_blocking/src/tools.c similarity index 100% rename from jacobi/mpi/Send_Recv_blocking/src/tools.c rename to jacobi_solutions/mpi/Send_Recv_blocking/src/tools.c diff --git a/jacobi/mpi/Send_Recv_nonblocking/Makefile b/jacobi_solutions/mpi/Send_Recv_nonblocking/Makefile similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/Makefile rename to jacobi_solutions/mpi/Send_Recv_nonblocking/Makefile diff --git a/jacobi/mpi/Send_Recv_nonblocking/include/allvars.h b/jacobi_solutions/mpi/Send_Recv_nonblocking/include/allvars.h similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/include/allvars.h rename to jacobi_solutions/mpi/Send_Recv_nonblocking/include/allvars.h diff --git a/jacobi/mpi/Send_Recv_nonblocking/include/tools.h b/jacobi_solutions/mpi/Send_Recv_nonblocking/include/tools.h similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/include/tools.h rename to jacobi_solutions/mpi/Send_Recv_nonblocking/include/tools.h diff --git a/jacobi/mpi/Send_Recv_nonblocking/make.def b/jacobi_solutions/mpi/Send_Recv_nonblocking/make.def similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/make.def rename to jacobi_solutions/mpi/Send_Recv_nonblocking/make.def diff --git a/jacobi/mpi/Send_Recv_nonblocking/make_mpi_path b/jacobi_solutions/mpi/Send_Recv_nonblocking/make_mpi_path similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/make_mpi_path rename to jacobi_solutions/mpi/Send_Recv_nonblocking/make_mpi_path diff --git a/jacobi/mpi/Send_Recv_nonblocking/script/input_parameters b/jacobi_solutions/mpi/Send_Recv_nonblocking/script/input_parameters similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/script/input_parameters rename to jacobi_solutions/mpi/Send_Recv_nonblocking/script/input_parameters diff --git a/jacobi/mpi/Send_Recv_nonblocking/script/run_pleiadi.sh b/jacobi_solutions/mpi/Send_Recv_nonblocking/script/run_pleiadi.sh similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/script/run_pleiadi.sh rename to jacobi_solutions/mpi/Send_Recv_nonblocking/script/run_pleiadi.sh diff --git a/jacobi/mpi/Send_Recv_nonblocking/src/jacobi_2D_mpi_send_recv_nonblocking.c b/jacobi_solutions/mpi/Send_Recv_nonblocking/src/jacobi_2D_mpi_send_recv_nonblocking.c similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/src/jacobi_2D_mpi_send_recv_nonblocking.c rename to jacobi_solutions/mpi/Send_Recv_nonblocking/src/jacobi_2D_mpi_send_recv_nonblocking.c diff --git a/jacobi/mpi/Send_Recv_nonblocking/src/tools.c b/jacobi_solutions/mpi/Send_Recv_nonblocking/src/tools.c similarity index 100% rename from jacobi/mpi/Send_Recv_nonblocking/src/tools.c rename to jacobi_solutions/mpi/Send_Recv_nonblocking/src/tools.c diff --git a/jacobi/mpi/Send_Recv_paired/Makefile b/jacobi_solutions/mpi/Send_Recv_paired/Makefile similarity index 100% rename from jacobi/mpi/Send_Recv_paired/Makefile rename to jacobi_solutions/mpi/Send_Recv_paired/Makefile diff --git a/jacobi/mpi/Send_Recv_paired/include/allvars.h b/jacobi_solutions/mpi/Send_Recv_paired/include/allvars.h similarity index 100% rename from jacobi/mpi/Send_Recv_paired/include/allvars.h rename to jacobi_solutions/mpi/Send_Recv_paired/include/allvars.h diff --git a/jacobi/mpi/Send_Recv_paired/include/tools.h b/jacobi_solutions/mpi/Send_Recv_paired/include/tools.h similarity index 100% rename from jacobi/mpi/Send_Recv_paired/include/tools.h rename to jacobi_solutions/mpi/Send_Recv_paired/include/tools.h diff --git a/jacobi/mpi/Send_Recv_paired/make.def b/jacobi_solutions/mpi/Send_Recv_paired/make.def similarity index 100% rename from jacobi/mpi/Send_Recv_paired/make.def rename to jacobi_solutions/mpi/Send_Recv_paired/make.def diff --git a/jacobi/mpi/Send_Recv_paired/make_mpi_path b/jacobi_solutions/mpi/Send_Recv_paired/make_mpi_path similarity index 100% rename from jacobi/mpi/Send_Recv_paired/make_mpi_path rename to jacobi_solutions/mpi/Send_Recv_paired/make_mpi_path diff --git a/jacobi/mpi/Send_Recv_paired/src/jacobi_2D_mpi_send_recv_paired.c b/jacobi_solutions/mpi/Send_Recv_paired/src/jacobi_2D_mpi_send_recv_paired.c similarity index 100% rename from jacobi/mpi/Send_Recv_paired/src/jacobi_2D_mpi_send_recv_paired.c rename to jacobi_solutions/mpi/Send_Recv_paired/src/jacobi_2D_mpi_send_recv_paired.c diff --git a/jacobi/mpi/Send_Recv_paired/src/tools.c b/jacobi_solutions/mpi/Send_Recv_paired/src/tools.c similarity index 100% rename from jacobi/mpi/Send_Recv_paired/src/tools.c rename to jacobi_solutions/mpi/Send_Recv_paired/src/tools.c diff --git a/jacobi/mpi/cartesian/Makefile b/jacobi_solutions/mpi/cartesian/Makefile similarity index 100% rename from jacobi/mpi/cartesian/Makefile rename to jacobi_solutions/mpi/cartesian/Makefile diff --git a/jacobi/mpi/cartesian/include/allvars.h b/jacobi_solutions/mpi/cartesian/include/allvars.h similarity index 100% rename from jacobi/mpi/cartesian/include/allvars.h rename to jacobi_solutions/mpi/cartesian/include/allvars.h diff --git a/jacobi/mpi/cartesian/include/tools.h b/jacobi_solutions/mpi/cartesian/include/tools.h similarity index 100% rename from jacobi/mpi/cartesian/include/tools.h rename to jacobi_solutions/mpi/cartesian/include/tools.h diff --git a/jacobi/mpi/cartesian/make.def b/jacobi_solutions/mpi/cartesian/make.def similarity index 100% rename from jacobi/mpi/cartesian/make.def rename to jacobi_solutions/mpi/cartesian/make.def diff --git a/jacobi/mpi/cartesian/make_mpi_path b/jacobi_solutions/mpi/cartesian/make_mpi_path similarity index 100% rename from jacobi/mpi/cartesian/make_mpi_path rename to jacobi_solutions/mpi/cartesian/make_mpi_path diff --git a/jacobi/mpi/cartesian/src/jacobi_2D_mpi_cartesian.c b/jacobi_solutions/mpi/cartesian/src/jacobi_2D_mpi_cartesian.c similarity index 100% rename from jacobi/mpi/cartesian/src/jacobi_2D_mpi_cartesian.c rename to jacobi_solutions/mpi/cartesian/src/jacobi_2D_mpi_cartesian.c diff --git a/jacobi/mpi/cartesian/src/tools.c b/jacobi_solutions/mpi/cartesian/src/tools.c similarity index 100% rename from jacobi/mpi/cartesian/src/tools.c rename to jacobi_solutions/mpi/cartesian/src/tools.c diff --git a/jacobi/mpi/comp_comm/Makefile b/jacobi_solutions/mpi/comp_comm/Makefile similarity index 100% rename from jacobi/mpi/comp_comm/Makefile rename to jacobi_solutions/mpi/comp_comm/Makefile diff --git a/jacobi/mpi/comp_comm/include/allvars.h b/jacobi_solutions/mpi/comp_comm/include/allvars.h similarity index 100% rename from jacobi/mpi/comp_comm/include/allvars.h rename to jacobi_solutions/mpi/comp_comm/include/allvars.h diff --git a/jacobi/mpi/comp_comm/include/tools.h b/jacobi_solutions/mpi/comp_comm/include/tools.h similarity index 100% rename from jacobi/mpi/comp_comm/include/tools.h rename to jacobi_solutions/mpi/comp_comm/include/tools.h diff --git a/jacobi/mpi/comp_comm/make.def b/jacobi_solutions/mpi/comp_comm/make.def similarity index 100% rename from jacobi/mpi/comp_comm/make.def rename to jacobi_solutions/mpi/comp_comm/make.def diff --git a/jacobi/mpi/comp_comm/make_mpi_path b/jacobi_solutions/mpi/comp_comm/make_mpi_path similarity index 100% rename from jacobi/mpi/comp_comm/make_mpi_path rename to jacobi_solutions/mpi/comp_comm/make_mpi_path diff --git a/jacobi/mpi/comp_comm/script/input_parameters b/jacobi_solutions/mpi/comp_comm/script/input_parameters similarity index 100% rename from jacobi/mpi/comp_comm/script/input_parameters rename to jacobi_solutions/mpi/comp_comm/script/input_parameters diff --git a/jacobi/mpi/comp_comm/script/run_pleiadi.sh b/jacobi_solutions/mpi/comp_comm/script/run_pleiadi.sh similarity index 100% rename from jacobi/mpi/comp_comm/script/run_pleiadi.sh rename to jacobi_solutions/mpi/comp_comm/script/run_pleiadi.sh diff --git a/jacobi/mpi/comp_comm/src/jacobi_2D_mpi_comp_comm.c b/jacobi_solutions/mpi/comp_comm/src/jacobi_2D_mpi_comp_comm.c similarity index 100% rename from jacobi/mpi/comp_comm/src/jacobi_2D_mpi_comp_comm.c rename to jacobi_solutions/mpi/comp_comm/src/jacobi_2D_mpi_comp_comm.c diff --git a/jacobi/mpi/comp_comm/src/tools.c b/jacobi_solutions/mpi/comp_comm/src/tools.c similarity index 100% rename from jacobi/mpi/comp_comm/src/tools.c rename to jacobi_solutions/mpi/comp_comm/src/tools.c diff --git a/jacobi/mpi/comp_comm_io/Makefile b/jacobi_solutions/mpi/comp_comm_io/Makefile similarity index 100% rename from jacobi/mpi/comp_comm_io/Makefile rename to jacobi_solutions/mpi/comp_comm_io/Makefile diff --git a/jacobi/mpi/comp_comm_io/include/allvars.h b/jacobi_solutions/mpi/comp_comm_io/include/allvars.h similarity index 100% rename from jacobi/mpi/comp_comm_io/include/allvars.h rename to jacobi_solutions/mpi/comp_comm_io/include/allvars.h diff --git a/jacobi/mpi/comp_comm_io/include/tools.h b/jacobi_solutions/mpi/comp_comm_io/include/tools.h similarity index 100% rename from jacobi/mpi/comp_comm_io/include/tools.h rename to jacobi_solutions/mpi/comp_comm_io/include/tools.h diff --git a/jacobi/mpi/comp_comm_io/make.def b/jacobi_solutions/mpi/comp_comm_io/make.def similarity index 100% rename from jacobi/mpi/comp_comm_io/make.def rename to jacobi_solutions/mpi/comp_comm_io/make.def diff --git a/jacobi/mpi/comp_comm_io/make_mpi_path b/jacobi_solutions/mpi/comp_comm_io/make_mpi_path similarity index 100% rename from jacobi/mpi/comp_comm_io/make_mpi_path rename to jacobi_solutions/mpi/comp_comm_io/make_mpi_path diff --git a/jacobi/mpi/comp_comm_io/script/input_parameters b/jacobi_solutions/mpi/comp_comm_io/script/input_parameters similarity index 100% rename from jacobi/mpi/comp_comm_io/script/input_parameters rename to jacobi_solutions/mpi/comp_comm_io/script/input_parameters diff --git a/jacobi/mpi/comp_comm_io/script/run_pleiadi.sh b/jacobi_solutions/mpi/comp_comm_io/script/run_pleiadi.sh similarity index 100% rename from jacobi/mpi/comp_comm_io/script/run_pleiadi.sh rename to jacobi_solutions/mpi/comp_comm_io/script/run_pleiadi.sh diff --git a/jacobi/mpi/comp_comm_io/src/jacobi_2D_mpi_comp_comm_io.c b/jacobi_solutions/mpi/comp_comm_io/src/jacobi_2D_mpi_comp_comm_io.c similarity index 100% rename from jacobi/mpi/comp_comm_io/src/jacobi_2D_mpi_comp_comm_io.c rename to jacobi_solutions/mpi/comp_comm_io/src/jacobi_2D_mpi_comp_comm_io.c diff --git a/jacobi/mpi/comp_comm_io/src/tools.c b/jacobi_solutions/mpi/comp_comm_io/src/tools.c similarity index 100% rename from jacobi/mpi/comp_comm_io/src/tools.c rename to jacobi_solutions/mpi/comp_comm_io/src/tools.c diff --git a/jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_1.cc b/jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_1.cc similarity index 100% rename from jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_1.cc rename to jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_1.cc diff --git a/jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_2.cc b/jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_2.cc similarity index 100% rename from jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_2.cc rename to jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Broadcast_2.cc diff --git a/jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Gather_Scatter.c b/jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Gather_Scatter.c similarity index 100% rename from jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Gather_Scatter.c rename to jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Gather_Scatter.c diff --git a/jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Heat_Equation_Gather.c b/jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Heat_Equation_Gather.c similarity index 100% rename from jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/Heat_Equation_Gather.c rename to jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/Heat_Equation_Gather.c diff --git a/jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/lecture_Broadcast_Gather_Scatter.pdf b/jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/lecture_Broadcast_Gather_Scatter.pdf similarity index 100% rename from jacobi/mpi/miscellaneous/Broadcast_Gather_Scatter/lecture_Broadcast_Gather_Scatter.pdf rename to jacobi_solutions/mpi/miscellaneous/Broadcast_Gather_Scatter/lecture_Broadcast_Gather_Scatter.pdf diff --git a/jacobi/mpi/miscellaneous/MPI_Datatypes/Subarray.c b/jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/Subarray.c similarity index 100% rename from jacobi/mpi/miscellaneous/MPI_Datatypes/Subarray.c rename to jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/Subarray.c diff --git a/jacobi/mpi/miscellaneous/MPI_Datatypes/lecture_MPI_Datatypes.pdf b/jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/lecture_MPI_Datatypes.pdf similarity index 100% rename from jacobi/mpi/miscellaneous/MPI_Datatypes/lecture_MPI_Datatypes.pdf rename to jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/lecture_MPI_Datatypes.pdf diff --git a/jacobi/mpi/miscellaneous/MPI_Datatypes/tools.c b/jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/tools.c similarity index 100% rename from jacobi/mpi/miscellaneous/MPI_Datatypes/tools.c rename to jacobi_solutions/mpi/miscellaneous/MPI_Datatypes/tools.c diff --git a/jacobi/mpi/miscellaneous/Parallel_IO/lecture_Parallel_IO.pdf b/jacobi_solutions/mpi/miscellaneous/Parallel_IO/lecture_Parallel_IO.pdf similarity index 100% rename from jacobi/mpi/miscellaneous/Parallel_IO/lecture_Parallel_IO.pdf rename to jacobi_solutions/mpi/miscellaneous/Parallel_IO/lecture_Parallel_IO.pdf diff --git a/jacobi/mpi/miscellaneous/Parallel_IO/write_arr1D.c b/jacobi_solutions/mpi/miscellaneous/Parallel_IO/write_arr1D.c similarity index 100% rename from jacobi/mpi/miscellaneous/Parallel_IO/write_arr1D.c rename to jacobi_solutions/mpi/miscellaneous/Parallel_IO/write_arr1D.c diff --git a/jacobi/mpi/miscellaneous/Parallel_IO/write_arr2D.c b/jacobi_solutions/mpi/miscellaneous/Parallel_IO/write_arr2D.c similarity index 100% rename from jacobi/mpi/miscellaneous/Parallel_IO/write_arr2D.c rename to jacobi_solutions/mpi/miscellaneous/Parallel_IO/write_arr2D.c diff --git a/jacobi/mpi/miscellaneous/cartesian b/jacobi_solutions/mpi/miscellaneous/cartesian similarity index 100% rename from jacobi/mpi/miscellaneous/cartesian rename to jacobi_solutions/mpi/miscellaneous/cartesian diff --git a/jacobi/mpi/miscellaneous/cartesian.c b/jacobi_solutions/mpi/miscellaneous/cartesian.c similarity index 100% rename from jacobi/mpi/miscellaneous/cartesian.c rename to jacobi_solutions/mpi/miscellaneous/cartesian.c diff --git a/jacobi/mpi/miscellaneous/cartesian.cpp b/jacobi_solutions/mpi/miscellaneous/cartesian.cpp similarity index 100% rename from jacobi/mpi/miscellaneous/cartesian.cpp rename to jacobi_solutions/mpi/miscellaneous/cartesian.cpp diff --git a/jacobi/mpi/miscellaneous/color_ring.c b/jacobi_solutions/mpi/miscellaneous/color_ring.c similarity index 100% rename from jacobi/mpi/miscellaneous/color_ring.c rename to jacobi_solutions/mpi/miscellaneous/color_ring.c diff --git a/jacobi/mpi/miscellaneous/lecture_color_ring.pdf b/jacobi_solutions/mpi/miscellaneous/lecture_color_ring.pdf similarity index 100% rename from jacobi/mpi/miscellaneous/lecture_color_ring.pdf rename to jacobi_solutions/mpi/miscellaneous/lecture_color_ring.pdf diff --git a/jacobi/mpi/miscellaneous/subarray b/jacobi_solutions/mpi/miscellaneous/subarray similarity index 100% rename from jacobi/mpi/miscellaneous/subarray rename to jacobi_solutions/mpi/miscellaneous/subarray diff --git a/jacobi/mpi/miscellaneous/subarray.c b/jacobi_solutions/mpi/miscellaneous/subarray.c similarity index 100% rename from jacobi/mpi/miscellaneous/subarray.c rename to jacobi_solutions/mpi/miscellaneous/subarray.c diff --git a/jacobi/openmp/opt/Makefile b/jacobi_solutions/openmp/not_opt/Makefile similarity index 100% rename from jacobi/openmp/opt/Makefile rename to jacobi_solutions/openmp/not_opt/Makefile diff --git a/jacobi_solutions/openmp/not_opt/include/allvars.h b/jacobi_solutions/openmp/not_opt/include/allvars.h new file mode 100644 index 0000000..6ffdbda --- /dev/null +++ b/jacobi_solutions/openmp/not_opt/include/allvars.h @@ -0,0 +1,20 @@ +#pragma once + +#define NGHOST 1 +#define NDIM 2 /* 2D */ +#define X 0 +#define Y 1 +#define TOL 1.e-5 + +typedef double MyData; + +#if defined(_OPENMP) + +#include <omp.h> + +#else + +#define omp_get_thread_num() 0 +#define omp_get_num_threads() 1 + +#endif /* _OPENMP */ diff --git a/jacobi/openmp/opt/include/tools.h b/jacobi_solutions/openmp/not_opt/include/tools.h similarity index 100% rename from jacobi/openmp/opt/include/tools.h rename to jacobi_solutions/openmp/not_opt/include/tools.h diff --git a/jacobi_solutions/openmp/not_opt/make.def b/jacobi_solutions/openmp/not_opt/make.def new file mode 100644 index 0000000..83eb877 --- /dev/null +++ b/jacobi_solutions/openmp/not_opt/make.def @@ -0,0 +1,53 @@ +CC = gcc +CFLAGS = -Wall -Wextra -march=native +OMP = -fopenmp +LIBS = -lm + +SYSTYPE = $(strip $(shell uname -n)) + +PROG = jacobi_serial_not_opt_$(SYSTYPE) +PROG_OMP = jacobi_omp_not_opt_$(SYSTYPE) +PROG_DEBUG = $(PROG_OMP)_DEBUG +PROG_MEMCHECK = $(PROG_OMP)_MEMCHECK +PROG_CALLGRIND = $(PROG_OMP)_CALLGRIND +PROG_CACHEGRIND = $(PROG_OMP)_CACHEGRIND + +HEADERS = $(wildcard ./include/*.h) +SOURCES = $(wildcard ./src/*.c) +DEPENDENCIES = $(SOURCES) $(HEADERS) Makefile + +$(PROG): $(DEPENDENCIES) + $(CC) $(CFLAGS) -O3 -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_OMP): $(DEPENDENCIES) + $(CC) $(CFLAGS) -O3 $(OMP) -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_DEBUG): $(DEPENDENCIES) + $(CC) $(CFLAGS) -Og -ggdb3 $(OMP) -fno-omit-frame-pointer -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_DEBUG) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_MEMCHECK): $(DEPENDENCIES) + $(CC) $(CFLAGS) -Og $(OMP) -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_MEMCHECK) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_CALLGRIND): $(DEPENDENCIES) + $(CC) $(CFLAGS) -g -O3 $(OMP) -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_CALLGRIND) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_CACHEGRIND): $(DEPENDENCIES) + $(CC) $(CFLAGS) -g -O3 $(OMP) -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_CACHEGRIND) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' diff --git a/jacobi_solutions/openmp/not_opt/script/input_parameters b/jacobi_solutions/openmp/not_opt/script/input_parameters new file mode 100644 index 0000000..c5fd600 --- /dev/null +++ b/jacobi_solutions/openmp/not_opt/script/input_parameters @@ -0,0 +1,9 @@ +########################################################################## + +# set the grid size + +GRID_SIZE_X=128 +GRID_SIZE_Y=128 + +OMP_THREADS=(1 2 4 8) +########################################################################## diff --git a/jacobi_solutions/openmp/not_opt/script/run.sh b/jacobi_solutions/openmp/not_opt/script/run.sh new file mode 100755 index 0000000..b0d9005 --- /dev/null +++ b/jacobi_solutions/openmp/not_opt/script/run.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +######################### RESOURSE ALLOCATION ##################################### +#SBATCH --account=hpc_school +#SBATCH --partition=hpc_school +#SBATCH --job-name="Jacobi" +#SBATCH --nodes=1 +#SBATCH --ntasks-per-node=1 +#SBATCH --cpus-per-task=8 +#SBATCH --output=Jacobi-omp-no-opt-%j.out +#SBATCH --error=Jacobi-omp-no-opt.%j.err +#SBATCH --time=00:05:00 +################################################################################### + +################################## MODULES ######################################## +export MODULE_VERSION=5.0.1 +source /opt/cluster/spack/share/spack/setup-env.sh + +# module purge +module purge +# load GCC +module load default-gcc-11.2.0 +################################################################################### + +# input parameters +source input_parameters + +WORKDIR=${PWD} +# compile the application +cd .. && make clean && make omp +if [[ "$?" != "0" ]] +then + echo "Cannot compile the application ...aborting..." + exit 1 +fi + +# get the executable +EXEC=$(find $(realpath ./) -maxdepth 1 -executable -name "jacobi_*" -type f -print) +if [[ "$?" != "0" ]] +then + echo "Cannot find the executable ...aborting..." + exit 2 +fi + + +# OMP stuff +export OMP_DISPLAY_AFFINITY=1 +export OMP_WAIT_POLICY=ACTIVE +# export OMP_PLACES=( "cores", "threads" ) +# export BINDING=( "master" "close" "spread" ) + +for OMP in ${OMP_THREADS[@]} +do + # not necessary because the clause 'num_threads' + # is specified in the source code + # export OMP_NUM_THREADS=${OMP} + + # run the application + time ${EXEC} ${GRID_SIZE_X} ${GRID_SIZE_Y} ${OMP} |& tee ${EXEC}_OMP_${OMP}_output.txt +done +cd ${WORKDIR} + +exit 0 diff --git a/jacobi_solutions/openmp/not_opt/src/jacobi_2D_omp_not_opt.c b/jacobi_solutions/openmp/not_opt/src/jacobi_2D_omp_not_opt.c new file mode 100644 index 0000000..a43c5bb --- /dev/null +++ b/jacobi_solutions/openmp/not_opt/src/jacobi_2D_omp_not_opt.c @@ -0,0 +1,309 @@ +/* ///////////////////////////////////////////////////////////////////// */ +/* Authors: A. Mignone (mignone@to.infn.it) */ +/* V. Cesare (valentina.cesare@inaf.it) */ +/* D. Goz (david.goz@inaf.it) */ +/* */ +/* Date : June 2024 */ +/* */ +/* ///////////////////////////////////////////////////////////////////// */ + +#include "allvars.h" +#include "tools.h" +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +/* function prototypes */ +void BoundaryConditions(MyData **const restrict, + MyData *const restrict, + MyData *const restrict, + const int, + const int); + +void JacobiAlgorithm(MyData **const restrict, MyData **const restrict, MyData *const restrict, + const MyData *const restrict, int, int, int, int, const int); + +void WriteSolution(MyData **const phi, const int nx, const int ny); + +void copy_grids(MyData **const restrict A, + MyData **const restrict B, + const int xbeg, + const int xend, + const int ybeg, + const int yend); + +int main(int argc, char **argv) +{ +#if defined(_OPENMP) + if (argc <= 3) + + { + printf("\n\t Usage: <executable> <x_grid_size> <y_grid_size> <omp threads>\n\n"); + exit(EXIT_FAILURE); + } +#else + if (argc <= 2) + { + printf("\n\t Usage: <executable> <x_grid_size> <y_grid_size>\n\n"); + exit(EXIT_FAILURE); + } +#endif /* _OPENMP */ + + /* global X and Y grid size */ + const int NX_GLOB = (int) strtol(argv[1], NULL, 10); + const int NY_GLOB = (int) strtol(argv[2], NULL, 10); +#if defined(_OPENMP) + const int Nthread = (int) strtol(argv[3], NULL, 10); +#else + const int Nthread = 1; +#endif /* _OPENMP */ + + const MyData xbeg = 0.0; + const MyData xend = 1.0; + const MyData ybeg = 0.0; + const MyData yend = 1.0; + + const MyData delta[NDIM] = {(xend - xbeg)/(NX_GLOB + 1), + (yend - ybeg)/(NY_GLOB + 1)}; + + /* -------------------------------------------------------- + 1. Set grid indices + -------------------------------------------------------- */ + + const int ibeg = NGHOST; + const int iend = ibeg + NX_GLOB - 1; + const int nx = iend - ibeg + 1; + const int nx_tot = nx + 2 * NGHOST; + + const int jbeg = NGHOST; + const int jend = jbeg + NY_GLOB - 1; + const int ny = jend - jbeg + 1; + const int ny_tot = ny + 2 * NGHOST; + + printf("\n\t Grid indices:"); + printf("\n\t\t ibeg, iend = %d, %d; nx_tot = %d" ,ibeg, iend, nx_tot); + printf("\n\t\t jbeg, jend = %d, %d; ny_tot = %d\n\n",jbeg, jend, ny_tot); + + /* -------------------------------------------------------- + 2. Generate grid, allocate memory + -------------------------------------------------------- */ + + /* memory allocation */ + MyData *xg = (MyData *) malloc((NX_GLOB + 2*NGHOST) * sizeof(MyData)); + MyData *yg = (MyData *) malloc((NY_GLOB + 2*NGHOST) * sizeof(MyData)); + assert((xg != NULL) && (yg != NULL)); + + /* initial conditions */ + for (int i=0 ; i<(NX_GLOB + 2*NGHOST) ; i++) xg[i] = xbeg + (i - ibeg + 1) * delta[X]; + for (int j=0 ; j<(NY_GLOB + 2*NGHOST) ; j++) yg[j] = ybeg + (j - jbeg + 1) * delta[Y]; + MyData *x = xg; /* Global and local grids are the same */ + MyData *y = yg; /* for serial version of the code */ + + /* grids memory allocation */ + MyData **phi = Allocate_2DdblArray(ny_tot, nx_tot); + MyData **phi0 = Allocate_2DdblArray(ny_tot, nx_tot); + + /* -------------------------------------------------------- + 3. Initialize solution array to 0 + -------------------------------------------------------- */ + + for (int j=jbeg ; j<=jend ; j++) + for (int i=ibeg ; i<=iend ; i++) + phi0[j][i] = 0.0; + + /* -------------------------------------------------------- + 4. Main iteration cycle + -------------------------------------------------------- */ + + const double time_start = seconds(); + + MyData err = 1.0; + /* iterations */ + int k = 0; + while (err > TOL) + { + /* -- 4a. Set boundary conditions first -- */ + + BoundaryConditions(phi0, x, y, nx, ny); + + /* -- 4b. Jacobi's method and residual (interior points) -- */ + /* core algorithm */ + + err = 0.0; + JacobiAlgorithm(phi, phi0, &err, delta, + ibeg, iend, jbeg, jend, Nthread); + + /* -- 4c. Copy grids --*/ + copy_grids(phi0, phi, + jbeg, jend, + ibeg, jend); + + printf ("\n\t Iteration = %d - err = %lg\n",k, err); + + /* increase the counter of loop iterations */ + k++; + } + + WriteSolution(phi, nx, ny); + + printf("\n\t NX_GLOB x NY_GLOB = %d x %d\n", NX_GLOB, NY_GLOB); + printf("\n\t Time = %lf [s]\n\n", seconds() - time_start); + + // free memory + if (phi0) + { + free(phi0[0]); + free(phi0); + } + + if (phi) + { + free(phi[0]); + free(phi); + } + + if (yg) + free(yg); + + if (xg) + free(xg); + + return 0; +} + +/* ********************************************************************* */ +void BoundaryConditions(MyData **const restrict phi, + MyData *const restrict x, + MyData *const restrict y, + const int nx, + const int ny) +/* +*********************************************************************** */ +{ + const int ibeg = NGHOST; + const int iend = ibeg + nx - 1; + + const int jbeg = NGHOST; + const int jend = jbeg + ny - 1; + + int i,j; + + /* -- Left -- */ + i = ibeg - 1; + for (int j=jbeg ; j<=jend ; j++) + phi[j][i] = (1.0 - y[j]); + + /* -- Right -- */ + i = jend + 1; + for (int j=jbeg ; j<=jend ; j++) + phi[j][i] = (y[j] * y[j]); + + /* -- Bottom -- */ + j = jbeg - 1; + for (int i=ibeg ; i<=iend ; i++) + phi[j][i] = (1.0 - x[i]); + + /* -- Top -- */ + j = jend + 1; + for (int i=ibeg ; i<=iend ; i++) + phi[j][i] = x[i]; + + return; +} + +/* ********************************************************************* */ + +void JacobiAlgorithm(MyData **const restrict Phi, + MyData **const restrict Phi0, + MyData *const restrict error, + const MyData *const restrict delta, + int ibeg, + int iend, + int jbeg, + int jend, + const int Nthreads) +{ + *error = 0.0; + +#pragma omp parallel default(none) shared(error, delta, Phi, Phi0) \ + firstprivate(ibeg, iend, jbeg, jend) \ + num_threads(Nthreads) + { +#if defined(DEBUG) + const int id = omp_get_thread_num(); + const int thr = omp_get_num_threads(); + printf("\n\t I am the omp thread %d out of %d", id, thr); + #pragma omp barrier +#endif /* DEBUG */ + + #pragma omp for schedule(static) + for (int j=jbeg ; j<=jend ; j++) + { + for (int i=ibeg ; i<=iend ; i++) + { + Phi[j][i] = 0.25 * (Phi0[j][i-1] + Phi0[j][i+1] + + Phi0[j-1][i] + Phi0[j+1][i]); + + #pragma omp critical + { + *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]); + } + } /* loop over columns */ + } /* loop over rows */ + } /* omp parallel */ + + return; +} + +/* ********************************************************************* */ + +/* ********************************************************************* */ +void copy_grids(MyData **const restrict A, + MyData **const restrict B, + const int xbeg, + const int xend, + const int ybeg, + const int yend) +{ + for (int i=xbeg ; i<=xend ; i++) + for (int j=ybeg ; j<=yend ; j++) + A[i][j] = B[i][j]; + + return; +} +/* +************************************************************************ */ + + +/* ********************************************************************* */ +void WriteSolution (MyData **const phi, + const int nx, + const int ny) +/* +*********************************************************************** */ +{ + const int ibeg = NGHOST; + const int jbeg = NGHOST; + const int jend = jbeg + ny - 1; + + static int nfile = 0; /* File counter */ + + char fname[32]; +#if defined(_OPENMP) + sprintf(fname,"jacobi2D_omp_not_opt_%02d.bin", nfile); +#else + sprintf(fname,"jacobi2D_serial_not_opt_%02d.bin", nfile); +#endif /* _OPENMP */ + + FILE *fp; + printf ("> Writing %s\n",fname); + fp = fopen(fname, "wb"); + + for (int j=jbeg ; j<=jend ; j++) + { + fwrite (phi[j] + ibeg, sizeof(MyData), nx, fp); + } + + nfile++; + fclose(fp); +} diff --git a/jacobi/openmp/opt/src/tools.c b/jacobi_solutions/openmp/not_opt/src/tools.c similarity index 100% rename from jacobi/openmp/opt/src/tools.c rename to jacobi_solutions/openmp/not_opt/src/tools.c diff --git a/jacobi_solutions/openmp/opt/Makefile b/jacobi_solutions/openmp/opt/Makefile new file mode 100644 index 0000000..fc4833d --- /dev/null +++ b/jacobi_solutions/openmp/opt/Makefile @@ -0,0 +1,66 @@ +####################################################################### +# Author: David Goz (david.goz@inaf.it) # +# June 2024 # +####################################################################### +# +# To see all the compilation options +# $ make info +####################################################################### + +# make.def defines how the application is compiled +include make.def +####################################################################### + +.PHONY: info serial omp valgrind_memcheck valgrind_callgrind valgrind_cachegrind debug clean + +info: + @echo ' ' + @echo '--------------------------------------------------------------------------------------------' + @echo '$$ make serial ---> compile the serial application ' + @echo '$$ make omp ---> compile the omp application ' + @echo '$$ make debug ---> debug the omp application ' + @echo '$$ make valgrind_memcheck ---> run the omp application using Valgrind under Memcheck ' + @echo '$$ make valgrind_callgrind ---> run the omp application using Valgrind under Callgrind ' + @echo '$$ make valgrind_cachegrind ---> run the omp application using Valgrind under Cachegrind ' + @echo '$$ make clean ---> clean up all ' + @echo '$$ make info ---> get make info ' + @echo '--------------------------------------------------------------------------------------------' + @echo ' ' + +serial: $(PROG) + +omp: $(PROG_OMP) + +debug: $(PROG_DEBUG) + @echo 'OOOooo... debugging ...oooOOO' + gdb --args ./$< + @echo 'OOOooo... debugging ... oooOOO' + +valgrind_memcheck: $(PROG_MEMCHECK) + @echo 'oooOOO... valgrind_memcheck ...OOOooo' + valgrind --tool=memcheck -s --leak-check=full --show-leak-kinds=all --track-origins=yes --read-var-info=yes --log-file=valgrind_memcheck_log_%p.txt ./$< 10 10 2 + @echo 'oooOOO... valgrind_memcheck ...OOOooo' + +valgrind_callgrind: $(PROG_CALLGRIND) + @echo 'oooOOO... valgrind_callgrind ...OOOooo' + valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes --log-file=valgrind_callgrind_log_.%p.txt ./$< 128 128 2 + @echo ' ' + @echo 'To generate a function-by-function summary from the profile data file:' + @echo '$$ callgrind_annotate --auto=yes callgrind.out.<pid> | less' + @echo '(kcachegrind is required in order to visualize the output using the GUI)' + +valgrind_cachegrind: $(PROG_CACHEGRIND) + @echo 'oooOOO... valgrind_cachegrind ...OOOooo' + valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128 2 + @echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less' + @echo '(kcachegrind is required in order to visualize the output using the GUI)' + @echo 'oooOOO... valgrind_cachegrind ...OOOooo' + +clean: + rm -f *~ .*~ ./src/*~ ./src/*# ./include/*~ ./include/*# *~ + rm -f $(PROG) $(PROG_OMP) $(PROG_DEBUG) $(PROG_MEMCHECK) $(PROG_CALLGRIND) $(PROG_CACHEGRIND) + rm -f valgrind_*.txt + rm -f cachegrind.out.* + rm -f callgrind.* + rm -f *bin + rm -f jacobi_* diff --git a/jacobi/openmp/opt/include/allvars.h b/jacobi_solutions/openmp/opt/include/allvars.h similarity index 100% rename from jacobi/openmp/opt/include/allvars.h rename to jacobi_solutions/openmp/opt/include/allvars.h diff --git a/jacobi/serial/opt/include/tools.h b/jacobi_solutions/openmp/opt/include/tools.h similarity index 100% rename from jacobi/serial/opt/include/tools.h rename to jacobi_solutions/openmp/opt/include/tools.h diff --git a/jacobi/openmp/opt/make.def b/jacobi_solutions/openmp/opt/make.def similarity index 100% rename from jacobi/openmp/opt/make.def rename to jacobi_solutions/openmp/opt/make.def diff --git a/jacobi/openmp/opt/src/jacobi_2D_omp_opt.c b/jacobi_solutions/openmp/opt/src/jacobi_2D_omp_opt.c similarity index 98% rename from jacobi/openmp/opt/src/jacobi_2D_omp_opt.c rename to jacobi_solutions/openmp/opt/src/jacobi_2D_omp_opt.c index 2a47ed6..b1b84b4 100644 --- a/jacobi/openmp/opt/src/jacobi_2D_omp_opt.c +++ b/jacobi_solutions/openmp/opt/src/jacobi_2D_omp_opt.c @@ -244,9 +244,9 @@ void JacobiAlgorithm(MyData **const restrict Phi, /* ********************************************************************* */ /* ********************************************************************* */ -void WriteSolution (MyData **const phi, - const int nx, - const int ny) +void WriteSolution(MyData **const phi, + const int nx, + const int ny) /* *********************************************************************** */ { diff --git a/jacobi/serial/opt/src/tools.c b/jacobi_solutions/openmp/opt/src/tools.c similarity index 100% rename from jacobi/serial/opt/src/tools.c rename to jacobi_solutions/openmp/opt/src/tools.c diff --git a/jacobi_solutions/serial/not_opt/Makefile b/jacobi_solutions/serial/not_opt/Makefile new file mode 100644 index 0000000..191f891 --- /dev/null +++ b/jacobi_solutions/serial/not_opt/Makefile @@ -0,0 +1,63 @@ +####################################################################### +# Author: David Goz (david.goz@inaf.it) # +# June 2024 # +####################################################################### +# +# To see all the compilation options +# $ make info +####################################################################### + +# make.def defines how the application is compiled +include make.def +####################################################################### + +.PHONY: info serial valgrind_memcheck valgrind_callgrind valgrind_cachegrind debug clean + +info: + @echo ' ' + @echo '-----------------------------------------------------------------------------------------------' + @echo '$$ make serial ---> compile the serial application ' + @echo '$$ make debug ---> debug the serial application ' + @echo '$$ make valgrind_memcheck ---> run the serial application using Valgrind under Memcheck ' + @echo '$$ make valgrind_callgrind ---> run the serial application using Valgrind under Callgrind ' + @echo '$$ make valgrind_cachegrind ---> run the serial application using Valgrind under Cachegrind ' + @echo '$$ make clean ---> clean up all ' + @echo '$$ make info ---> get make info ' + @echo '-----------------------------------------------------------------------------------------------' + @echo ' ' + +serial: $(PROG) + +debug: $(PROG_DEBUG) + @echo 'OOOooo... debugging ...oooOOO' + gdb --args ./$< + @echo 'OOOooo... debugging ... oooOOO' + +valgrind_memcheck: $(PROG_MEMCHECK) + @echo 'oooOOO... valgrind_memcheck ...OOOooo' + valgrind --tool=memcheck -s --leak-check=full --show-leak-kinds=all --track-origins=yes --read-var-info=yes --log-file=valgrind_memcheck_log_%p.txt ./$< 10 10 + @echo 'oooOOO... valgrind_memcheck ...OOOooo' + +valgrind_callgrind: $(PROG_CALLGRIND) + @echo 'oooOOO... valgrind_callgrind ...OOOooo' + valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes --log-file=valgrind_callgrind_log_.%p.txt ./$< 128 128 + @echo ' ' + @echo 'To generate a function-by-function summary from the profile data file:' + @echo '$$ callgrind_annotate --auto=yes callgrind.out.<pid> | less' + @echo '(kcachegrind is required in order to visualize the output using the GUI)' + +valgrind_cachegrind: $(PROG_CACHEGRIND) + @echo 'oooOOO... valgrind_cachegrind ...OOOooo' + valgrind --tool=cachegrind --log-file=valgrind_cachegrind_log_.%p.txt ./$< 128 128 + @echo '$$ cg_annotate --auto=yes cachegrind.out.<pid> | less' + @echo '(kcachegrind is required in order to visualize the output using the GUI)' + @echo 'oooOOO... valgrind_cachegrind ...OOOooo' + +clean: + rm -f *~ .*~ ./src/*~ ./src/*# ./include/*~ ./include/*# *~ + rm -f $(PROG) $(PROG_DEBUG) $(PROG_MEMCHECK) $(PROG_CALLGRIND) $(PROG_CACHEGRIND) + rm -f valgrind_*.txt + rm -f cachegrind.out.* + rm -f callgrind.* + rm -f *bin + rm -rf jacobi_serial_* diff --git a/jacobi/serial/opt/include/allvars.h b/jacobi_solutions/serial/not_opt/include/allvars.h similarity index 100% rename from jacobi/serial/opt/include/allvars.h rename to jacobi_solutions/serial/not_opt/include/allvars.h diff --git a/jacobi_solutions/serial/not_opt/include/tools.h b/jacobi_solutions/serial/not_opt/include/tools.h new file mode 100644 index 0000000..82859ec --- /dev/null +++ b/jacobi_solutions/serial/not_opt/include/tools.h @@ -0,0 +1,18 @@ +#pragma once + +#include "allvars.h" +#include <assert.h> +#include <sys/time.h> +#include <time.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> + +/* function prototypes */ +MyData **Allocate_2DdblArray(const int nx, const int ny); +void Show_2DdblArray(const MyData **const A, + const int nx, + const int ny, + const char *const string); + +double seconds(void); diff --git a/jacobi_solutions/serial/not_opt/make.def b/jacobi_solutions/serial/not_opt/make.def new file mode 100644 index 0000000..54b8cd6 --- /dev/null +++ b/jacobi_solutions/serial/not_opt/make.def @@ -0,0 +1,45 @@ +CC = gcc +CFLAGS = -Wall -Wextra -march=native +LIBS = -lm + +SYSTYPE = $(strip $(shell uname -n)) + +PROG = jacobi_serial_not_opt_$(SYSTYPE) +PROG_DEBUG = $(PROG)_DEBUG +PROG_MEMCHECK = $(PROG)_MEMCHECK +PROG_CALLGRIND = $(PROG)_CALLGRIND +PROG_CACHEGRIND = $(PROG)_CACHEGRIND + +HEADERS = $(wildcard ./include/*.h) +SOURCES = $(wildcard ./src/*.c) +DEPENDENCIES = $(SOURCES) $(HEADERS) Makefile + +$(PROG): $(DEPENDENCIES) + $(CC) $(CFLAGS) -O3 -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_DEBUG): $(DEPENDENCIES) + $(CC) $(CFLAGS) -Og -ggdb3 -fno-omit-frame-pointer -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_DEBUG) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_MEMCHECK): $(DEPENDENCIES) + $(CC) $(CFLAGS) -Og -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_MEMCHECK) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_CALLGRIND): $(DEPENDENCIES) + $(CC) $(CFLAGS) -g -O3 -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_CALLGRIND) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' + +$(PROG_CACHEGRIND): $(DEPENDENCIES) + $(CC) $(CFLAGS) -g -O3 -I./include $(SOURCES) -o $@ $(LIBS) + @echo ' ' + @echo 'Program' $(PROG_CACHEGRIND) 'compiled for' $(SYSTYPE) 'machine' + @echo ' ' diff --git a/jacobi_solutions/serial/not_opt/script/input_parameters b/jacobi_solutions/serial/not_opt/script/input_parameters new file mode 100644 index 0000000..06ef59f --- /dev/null +++ b/jacobi_solutions/serial/not_opt/script/input_parameters @@ -0,0 +1,8 @@ +########################################################################## + +# set the grid size + +GRID_SIZE_X=128 +GRID_SIZE_Y=128 + +########################################################################## diff --git a/jacobi_solutions/serial/not_opt/script/run.sh b/jacobi_solutions/serial/not_opt/script/run.sh new file mode 100755 index 0000000..e5d5d69 --- /dev/null +++ b/jacobi_solutions/serial/not_opt/script/run.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +######################### RESOURSE ALLOCATION ##################################### +#SBATCH --account=hpc_school +#SBATCH --partition=hpc_school +#SBATCH --job-name="Jacobi" +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=1 +#SBATCH --output=Jacobi-serial-no-opt-%j.out +#SBATCH --error=Jacobi-serial-no-opt.%j.err +#SBATCH --time=00:05:00 +################################################################################### + +################################## MODULES ######################################## +export MODULE_VERSION=5.0.1 +source /opt/cluster/spack/share/spack/setup-env.sh + +# module purge +module purge +# load GCC +module load default-gcc-11.2.0 +# load valgrind (optional) +module load valgrind-3.18.1-gcc-11.2.0-3hcfkwk +################################################################################### + +# input parameters +source input_parameters + +WORKDIR=${PWD} +# compile the application +cd .. && make clean && make serial +if [[ "$?" != "0" ]] +then + echo "Cannot compile the application ...aborting..." + exit 1 +fi + +# get the executable +EXEC=$(find $(realpath ./) -maxdepth 1 -executable -name "jacobi_*" -type f -print) +if [[ "$?" != "0" ]] +then + echo "Cannot find the executable ...aborting..." + exit 2 +fi + + +# run +time ${EXEC} ${GRID_SIZE_X} ${GRID_SIZE_Y} |& tee ${EXEC}_output.txt + +cd ${WORKDIR} + +exit 0 diff --git a/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c b/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c new file mode 100644 index 0000000..ba53f32 --- /dev/null +++ b/jacobi_solutions/serial/not_opt/src/jacobi_2D_serial_not_opt.c @@ -0,0 +1,274 @@ +/* ///////////////////////////////////////////////////////////////////// */ +/* Authors: A. Mignone (mignone@to.infn.it) */ +/* V. Cesare (valentina.cesare@inaf.it) */ +/* D. Goz (david.goz@inaf.it) */ +/* */ +/* Date : June 2024 */ +/* */ +/* ///////////////////////////////////////////////////////////////////// */ + +#include "allvars.h" +#include "tools.h" +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + + +/* function prototypes */ +void BoundaryConditions(MyData **const restrict, + MyData *const restrict, + MyData *const restrict, + const int, + const int); + +void JacobiAlgorithm(MyData **const restrict, MyData **const restrict, MyData *const restrict, + const MyData *const restrict, const int, const int, const int, const int); + +void WriteSolution(MyData **const phi, const int nx, const int ny); + +void copy_grids(MyData **const restrict A, + MyData **const restrict B, + const int xbeg, + const int xend, + const int ybeg, + const int yend); + +int main(int argc, char **argv) +{ + if (argc <= 2) + { + printf("\n\t Usage: <executable> <x_grid_size> <y_grid_size> \n\n"); + exit(EXIT_FAILURE); + } + + /* global X and Y grid size */ + const int NX_GLOB = (int) strtol(argv[1], NULL, 10); + const int NY_GLOB = (int) strtol(argv[2], NULL, 10); + + const MyData xbeg = 0.0; + const MyData xend = 1.0; + const MyData ybeg = 0.0; + const MyData yend = 1.0; + + const MyData delta[NDIM] = {(xend - xbeg)/(NX_GLOB + 1), + (yend - ybeg)/(NY_GLOB + 1)}; + + /* -------------------------------------------------------- + 1. Set grid indices + -------------------------------------------------------- */ + + const int ibeg = NGHOST; + const int iend = ibeg + NX_GLOB - 1; + const int nx = iend - ibeg + 1; + const int nx_tot = nx + 2 * NGHOST; + + const int jbeg = NGHOST; + const int jend = jbeg + NY_GLOB - 1; + const int ny = jend - jbeg + 1; + const int ny_tot = ny + 2 * NGHOST; + + printf("\n\t Grid indices:"); + printf("\n\t\t ibeg, iend = %d, %d; nx_tot = %d" ,ibeg, iend, nx_tot); + printf("\n\t\t jbeg, jend = %d, %d; ny_tot = %d\n\n",jbeg, jend, ny_tot); + + /* -------------------------------------------------------- + 2. Generate grid, allocate memory + -------------------------------------------------------- */ + + /* memory allocation */ + MyData *xg = (MyData *) malloc((NX_GLOB + 2*NGHOST) * sizeof(MyData)); + MyData *yg = (MyData *) malloc((NY_GLOB + 2*NGHOST) * sizeof(MyData)); + assert((xg != NULL) && (yg != NULL)); + + /* initial conditions */ + for (int i=0 ; i<(NX_GLOB + 2*NGHOST) ; i++) xg[i] = xbeg + (i - ibeg + 1) * delta[X]; + for (int j=0 ; j<(NY_GLOB + 2*NGHOST) ; j++) yg[j] = ybeg + (j - jbeg + 1) * delta[Y]; + MyData *x = xg; /* Global and local grids are the same */ + MyData *y = yg; /* for serial version of the code */ + + /* grids memory allocation */ + MyData **phi = Allocate_2DdblArray(ny_tot, nx_tot); + MyData **phi0 = Allocate_2DdblArray(ny_tot, nx_tot); + + /* -------------------------------------------------------- + 3. Initialize solution array to 0 + -------------------------------------------------------- */ + + for (int j=jbeg ; j<=jend ; j++) + for (int i=ibeg ; i<=iend ; i++) + phi0[j][i] = 0.0; + + /* -------------------------------------------------------- + 4. Main iteration cycle + -------------------------------------------------------- */ + + const double time_start = seconds(); + + MyData err = 1.0; + /* iterations */ + int k = 0; + while (err > TOL) + { + /* -- 4a. Set boundary conditions first -- */ + + BoundaryConditions(phi0, x, y, nx, ny); + + /* -- 4b. Jacobi's method and residual (interior points) -- */ + /* core algorithm */ + + err = 0.0; + JacobiAlgorithm(phi, phi0, &err, delta, + ibeg, iend, jbeg, jend); + + /* -- 4c. Copy grids --*/ + copy_grids(phi0, phi, + jbeg, jend, + ibeg, jend); + + printf ("\n\t Iteration = %d - err = %lg\n",k, err); + + /* increase the counter of loop iterations */ + k++; + } + + WriteSolution(phi, nx, ny); + + printf("\n\t NX_GLOB x NY_GLOB = %d x %d\n", NX_GLOB, NY_GLOB); + printf("\n\t Time = %lf [s]\n\n", seconds() - time_start); + + // free memory + if (phi0) + { + free(phi0[0]); + free(phi0); + } + + if (phi) + { + free(phi[0]); + free(phi); + } + + if (yg) + free(yg); + + if (xg) + free(xg); + + return 0; +} + +/* ********************************************************************* */ +void BoundaryConditions(MyData **const restrict phi, + MyData *const restrict x, + MyData *const restrict y, + const int nx, + const int ny) +/* +*********************************************************************** */ +{ + const int ibeg = NGHOST; + const int iend = ibeg + nx - 1; + + const int jbeg = NGHOST; + const int jend = jbeg + ny - 1; + + int i,j; + + /* -- Left -- */ + i = ibeg - 1; + for (int j=jbeg ; j<=jend ; j++) + phi[j][i] = (1.0 - y[j]); + + /* -- Right -- */ + i = jend + 1; + for (int j=jbeg ; j<=jend ; j++) + phi[j][i] = (y[j] * y[j]); + + /* -- Bottom -- */ + j = jbeg - 1; + for (int i=ibeg ; i<=iend ; i++) + phi[j][i] = (1.0 - x[i]); + + /* -- Top -- */ + j = jend + 1; + for (int i=ibeg ; i<=iend ; i++) + phi[j][i] = x[i]; + + return; +} + +/* ********************************************************************* */ + +void JacobiAlgorithm(MyData **const restrict Phi, + MyData **const restrict Phi0, + MyData *const restrict error, + const MyData *const restrict delta, + const int ibeg, + const int iend, + const int jbeg, + const int jend) +{ + *error = 0.0; + for (int j=jbeg ; j<=jend ; j++) + { + for (int i=ibeg ; i<=iend ; i++) + { + Phi[j][i] = 0.25 * (Phi0[j][i-1] + Phi0[j][i+1] + + Phi0[j-1][i] + Phi0[j+1][i]); + + *error += delta[X] * delta[Y] * fabs(Phi[j][i] - Phi0[j][i]); + } /* loop over columns */ + } /* loop over rows */ + + return; +} + +/* ********************************************************************* */ + +/* ********************************************************************* */ +void copy_grids(MyData **const restrict A, + MyData **const restrict B, + const int xbeg, + const int xend, + const int ybeg, + const int yend) +{ + for (int i=xbeg ; i<=xend ; i++) + for (int j=ybeg ; j<=yend ; j++) + A[i][j] = B[i][j]; + + return; +} +/* +************************************************************************ */ + + +/* ********************************************************************* */ +void WriteSolution (MyData **const phi, + const int nx, + const int ny) +/* +*********************************************************************** */ +{ + const int ibeg = NGHOST; + const int jbeg = NGHOST; + const int jend = jbeg + ny - 1; + + static int nfile = 0; /* File counter */ + + char fname[32]; + sprintf(fname,"jacobi2D_serial_not_opt_%02d.bin", nfile); + + FILE *fp; + printf ("> Writing %s\n",fname); + fp = fopen(fname, "wb"); + + for (int j=jbeg ; j<=jend ; j++) + { + fwrite (phi[j] + ibeg, sizeof(MyData), nx, fp); + } + + nfile++; + fclose(fp); +} diff --git a/jacobi_solutions/serial/not_opt/src/tools.c b/jacobi_solutions/serial/not_opt/src/tools.c new file mode 100644 index 0000000..be2761d --- /dev/null +++ b/jacobi_solutions/serial/not_opt/src/tools.c @@ -0,0 +1,59 @@ +/* ///////////////////////////////////////////////////////////////////// */ +/* Authors: A. Mignone (mignone@to.infn.it) */ +/* V. Cesare (valentina.cesare@inaf.it) */ +/* D. Goz (david.goz@inaf.it) */ +/* */ +/* Date : June 2024 */ +/* */ +/* ///////////////////////////////////////////////////////////////////// */ + +#include "tools.h" + +/* ********************************************************************* */ +MyData **Allocate_2DdblArray(const int nx, const int ny) +/* + * Allocate memory for a double precision array with + * nx rows and ny columns + *********************************************************************** */ +{ + MyData **buf = malloc(nx * sizeof(MyData *)); + assert(buf != NULL); + + buf[0] = (MyData *) malloc(nx * ny * sizeof(MyData)); + assert(buf[0] != NULL); + + for (int j=1 ; j<nx ; j++) + buf[j] = buf[j-1] + ny; + + return buf; +} + +/* ********************************************************************* */ +void Show_2DdblArray(const MyData **const A, + const int nx, + const int ny, + const char *const string) +/* *********************************************************************** */ +{ + printf ("%s\n",string); + printf ("------------------------------\n"); + for (int i=0 ; i<nx ; i++) + { + for (int j=0 ; j<ny ; j++) + { + printf ("%8.2f ", A[i][j]); + } + printf ("\n"); + } + printf ("------------------------------\n"); +} +/* ********************************************************************* */ + +double seconds() +{ + struct timeval tmp; + gettimeofday(&tmp, (struct timezone *)0); + double sec = tmp.tv_sec + ((double)tmp.tv_usec)/1000000.0; + + return sec; +} diff --git a/jacobi/serial/opt/Makefile b/jacobi_solutions/serial/opt/Makefile similarity index 100% rename from jacobi/serial/opt/Makefile rename to jacobi_solutions/serial/opt/Makefile diff --git a/jacobi_solutions/serial/opt/include/allvars.h b/jacobi_solutions/serial/opt/include/allvars.h new file mode 100644 index 0000000..468de4a --- /dev/null +++ b/jacobi_solutions/serial/opt/include/allvars.h @@ -0,0 +1,9 @@ +#pragma once + +#define NGHOST 1 +#define NDIM 2 /* 2D */ +#define X 0 +#define Y 1 +#define TOL 1.e-5 + +typedef double MyData; diff --git a/jacobi_solutions/serial/opt/include/tools.h b/jacobi_solutions/serial/opt/include/tools.h new file mode 100644 index 0000000..82859ec --- /dev/null +++ b/jacobi_solutions/serial/opt/include/tools.h @@ -0,0 +1,18 @@ +#pragma once + +#include "allvars.h" +#include <assert.h> +#include <sys/time.h> +#include <time.h> +#include <sys/stat.h> +#include <stdio.h> +#include <stdlib.h> + +/* function prototypes */ +MyData **Allocate_2DdblArray(const int nx, const int ny); +void Show_2DdblArray(const MyData **const A, + const int nx, + const int ny, + const char *const string); + +double seconds(void); diff --git a/jacobi/serial/opt/make.def b/jacobi_solutions/serial/opt/make.def similarity index 100% rename from jacobi/serial/opt/make.def rename to jacobi_solutions/serial/opt/make.def diff --git a/jacobi/serial/opt/src/jacobi_2D_serial_opt.c b/jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c similarity index 100% rename from jacobi/serial/opt/src/jacobi_2D_serial_opt.c rename to jacobi_solutions/serial/opt/src/jacobi_2D_serial_opt.c diff --git a/jacobi_solutions/serial/opt/src/tools.c b/jacobi_solutions/serial/opt/src/tools.c new file mode 100644 index 0000000..be2761d --- /dev/null +++ b/jacobi_solutions/serial/opt/src/tools.c @@ -0,0 +1,59 @@ +/* ///////////////////////////////////////////////////////////////////// */ +/* Authors: A. Mignone (mignone@to.infn.it) */ +/* V. Cesare (valentina.cesare@inaf.it) */ +/* D. Goz (david.goz@inaf.it) */ +/* */ +/* Date : June 2024 */ +/* */ +/* ///////////////////////////////////////////////////////////////////// */ + +#include "tools.h" + +/* ********************************************************************* */ +MyData **Allocate_2DdblArray(const int nx, const int ny) +/* + * Allocate memory for a double precision array with + * nx rows and ny columns + *********************************************************************** */ +{ + MyData **buf = malloc(nx * sizeof(MyData *)); + assert(buf != NULL); + + buf[0] = (MyData *) malloc(nx * ny * sizeof(MyData)); + assert(buf[0] != NULL); + + for (int j=1 ; j<nx ; j++) + buf[j] = buf[j-1] + ny; + + return buf; +} + +/* ********************************************************************* */ +void Show_2DdblArray(const MyData **const A, + const int nx, + const int ny, + const char *const string) +/* *********************************************************************** */ +{ + printf ("%s\n",string); + printf ("------------------------------\n"); + for (int i=0 ; i<nx ; i++) + { + for (int j=0 ; j<ny ; j++) + { + printf ("%8.2f ", A[i][j]); + } + printf ("\n"); + } + printf ("------------------------------\n"); +} +/* ********************************************************************* */ + +double seconds() +{ + struct timeval tmp; + gettimeofday(&tmp, (struct timezone *)0); + double sec = tmp.tv_sec + ((double)tmp.tv_usec)/1000000.0; + + return sec; +} diff --git a/material/slides/INAF_HPC_course_hands-on_session_OpenMP.pdf b/material/slides/INAF_HPC_course_2024_hands-on_session_OpenMP.pdf similarity index 79% rename from material/slides/INAF_HPC_course_hands-on_session_OpenMP.pdf rename to material/slides/INAF_HPC_course_2024_hands-on_session_OpenMP.pdf index e55239651f5a01f40ca1fffc7cf24ef2d4c83981..6f3883674f4eb3e7bd39a4cd401e119aa8b0d1a9 100644 GIT binary patch delta 20405 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 delta 13127 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 diff --git a/material/slides/INAF_HPC_course_hands-on_session_presentation.pdf b/material/slides/INAF_HPC_course_2024_hands-on_session_presentation.pdf similarity index 89% rename from material/slides/INAF_HPC_course_hands-on_session_presentation.pdf rename to material/slides/INAF_HPC_course_2024_hands-on_session_presentation.pdf index c4fcb149f80e5f5246499529f38bb7e714b074dd..5487794d8ce31860cf70f9aceee91921f0ff3a6b 100644 GIT binary patch delta 25141 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℘4 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 delta 23382 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 KRdw}u;{pKOlxU3r -- GitLab