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