From bba136904a0aa147bf629f76010e7f54892870a6 Mon Sep 17 00:00:00 2001 From: Dominik Zobel <zobel@dkrz.de> Date: Fri, 28 Jun 2024 13:12:51 +0200 Subject: [PATCH] Add Fortran loop hands-on --- lectures/memory-hierarchies/slides.qmd | 44 ++++++++++++++++++++ lectures/memory-hierarchies/static/loops.f90 | 13 ++++++ 2 files changed, 57 insertions(+) create mode 100644 lectures/memory-hierarchies/static/loops.f90 diff --git a/lectures/memory-hierarchies/slides.qmd b/lectures/memory-hierarchies/slides.qmd index d17ec15..d269835 100644 --- a/lectures/memory-hierarchies/slides.qmd +++ b/lectures/memory-hierarchies/slides.qmd @@ -192,6 +192,50 @@ $^*$: Lower than one due to caching effects +## Memory access patterns + +Execution speed depends on data layout in memory + +```{.fortranfree} +program loop_exchange + implicit none + integer, parameter :: nel = 20000 + ! Note: Stay below 46000 to prevent overflows below + integer, dimension(nel, nel) :: mat + integer :: i, j + + do i = 1, nel + do j = 1, nel + mat(j, i) = (i-1)*nel + j-1 + end do + end do +end program loop_exchange +``` + +Loop order with optimal access of elements (contiguous memory). + + + +## Hands-On {.handson} + +1. Compile the Fortran code from the previous slide (also [here](static/loops.f90)) + on Levante or your PC. On Levante load the `gcc` module first (`module load gcc`). + Then measure the time needed to run the program, i.e. + +```{.Bash} +gfortran loops.f90 -o loops +time ./loops +``` + +2. Exchange the loop variables `i` and `j` in line 8 and 9 and compile again. + How does it impact the run time? + +3. Try different values for `nel` (for the original loop order and the exchanged one). + How does the matrix size relate to the effect of exchanged loops? + + + + # Memory Models - Study effect of latencies, cache sizes, block sizes, ... diff --git a/lectures/memory-hierarchies/static/loops.f90 b/lectures/memory-hierarchies/static/loops.f90 new file mode 100644 index 0000000..5b0fbf1 --- /dev/null +++ b/lectures/memory-hierarchies/static/loops.f90 @@ -0,0 +1,13 @@ +program loop_exchange + implicit none + integer, parameter :: nel = 20000 + ! Note: Stay below 46000 to prevent overflows below + integer, dimension(nel, nel) :: mat + integer :: i, j + + do i = 1, nel + do j = 1, nel + mat(j, i) = (i-1)*nel + j-1 + end do + end do +end program loop_exchange -- GitLab