diff --git a/lectures/memory-hierarchies/slides.qmd b/lectures/memory-hierarchies/slides.qmd index d17ec15728115d7134f760b248b957eec51435c5..d269835fe6710085876f9eb7da5eb939de642617 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 0000000000000000000000000000000000000000..5b0fbf16efe75d235d3d5d8e1b95ee08253302cb --- /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