diff options
author | Erik Schnetter <schnetter@cct.lsu.edu> | 2009-09-21 11:28:26 -0500 |
---|---|---|
committer | Barry Wardell <barry.wardell@gmail.com> | 2011-12-14 16:45:09 +0000 |
commit | 29e373ad99f97175fd6443dd7e9307e10cc125f2 (patch) | |
tree | 1b424d49d8e2dd079b78821c5fa842e559c91732 /Carpet/LoopControl/src/loopcontrol_fortran.h | |
parent | f5b0376823ed3658847fdf2f3447c87fcdec15ff (diff) |
LoopControl: Implement cache-collaborative multi-threading
Ignore-this: 5169757c7749834ae595d4d73b39220
Add a new, additional feature to LoopControl: different threads can
work on small regions that are likely to use the same cache entries as
other threads, trying to reduce cache pressure. This makes sense
mostly when the regions are still expensive although they are small,
e.g. for the BSSN RHS.
Diffstat (limited to 'Carpet/LoopControl/src/loopcontrol_fortran.h')
-rw-r--r-- | Carpet/LoopControl/src/loopcontrol_fortran.h | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/Carpet/LoopControl/src/loopcontrol_fortran.h b/Carpet/LoopControl/src/loopcontrol_fortran.h index 7edf22d84..94020ac28 100644 --- a/Carpet/LoopControl/src/loopcontrol_fortran.h +++ b/Carpet/LoopControl/src/loopcontrol_fortran.h @@ -10,41 +10,46 @@ type (lc_statmap_t), save :: name/**/_lm &&\ logical, save :: name/**/_initialised = .false. &&\ type (lc_control_t) :: name/**/_lc &&\ integer :: name/**/_ii, name/**/_jj, name/**/_kk &&\ +integer :: name/**/_imin, name/**/_jmin, name/**/_kmin &&\ integer :: name/**/_imax, name/**/_jmax, name/**/_kmax &&\ integer :: i, j, k -#define LC_PRIVATE3(name) \ -name/**/_lc, \ +#define LC_PRIVATE3(name) \ +name/**/_lc, \ +name/**/_imin, name/**/_jmin, name/**/_kmin, \ name/**/_imax, name/**/_jmax, name/**/_kmax -#define LC_LOOP3(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, ilsh,jlsh,klsh) &&\ -if (.not. name/**/_initialised) then &&\ -!$omp single &&\ - call lc_statmap_init (name/**/_lm, "name") &&\ -!$omp end single &&\ -!$omp single &&\ - /* Set this flag only after initialising */ &&\ - name/**/_initialised = .true. &&\ -!$omp end single &&\ -end if &&\ +#define LC_LOOP3(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, ilsh,jlsh,klsh) &&\ +if (.not. name/**/_initialised) then &&\ +!$omp single &&\ + call lc_statmap_init (name/**/_lm, "name") &&\ +!$omp end single &&\ +!$omp single &&\ + /* Set this flag only after initialising */ &&\ + name/**/_initialised = .true. &&\ +!$omp end single &&\ +end if &&\ call lc_control_init (name/**/_lc, name/**/_lm, imin,jmin,kmin, imax,jmax,kmax, ilsh,jlsh,klsh) &&\ - &&\ -/* Coarse loop */ &&\ -do name/**/_kk = name/**/_lc%kkmin + 1, name/**/_lc%kkmax, name/**/_lc%kkstep &&\ - name/**/_kmax = min (name/**/_kk - 1 + name/**/_lc%kkstep, name/**/_lc%kkmax) &&\ - do name/**/_jj = name/**/_lc%jjmin + 1, name/**/_lc%jjmax, name/**/_lc%jjstep &&\ - name/**/_jmax = min (name/**/_jj - 1 + name/**/_lc%jjstep, name/**/_lc%jjmax) &&\ - do name/**/_ii = name/**/_lc%iimin + 1, name/**/_lc%iimax, name/**/_lc%iistep &&\ - name/**/_imax = min (name/**/_ii - 1 + name/**/_lc%iistep, name/**/_lc%iimax) &&\ - &&\ - /* Fine loop */ &&\ - do k = name/**/_kk, name/**/_kmax &&\ - do j = name/**/_jj, name/**/_jmax &&\ - do i = name/**/_ii, name/**/_imax + &&\ +/* Coarse loop */ &&\ +do name/**/_kk = name/**/_lc%kkmin + 1, name/**/_lc%kkmax, name/**/_lc%kkstep &&\ + name/**/_kmin = name/**/_kk + name/**/_lc%kkkkmax &&\ + name/**/_kmax = min (name/**/_kmin - 1 + name/**/_lc%kkkkstep, name/**/_lc%kkmax) &&\ + do name/**/_jj = name/**/_lc%jjmin + 1, name/**/_lc%jjmax, name/**/_lc%jjstep &&\ + name/**/_jmin = name/**/_jj + name/**/_lc%jjjjmax &&\ + name/**/_jmax = min (name/**/_jj - 1 + name/**/_lc%jjjjmax, name/**/_lc%jjmax) &&\ + do name/**/_ii = name/**/_lc%iimin + 1, name/**/_lc%iimax, name/**/_lc%iistep &&\ + name/**/_imin = name/**/_ii + name/**/_lc%iiiimax &&\ + name/**/_imax = min (name/**/_ii - 1 + name/**/_lc%iiiimax, name/**/_lc%iimax) &&\ + &&\ + /* Fine loop */ &&\ + do k = name/**/_kmin, name/**/_kmax &&\ + do j = name/**/_jmin, name/**/_jmax &&\ + do i = name/**/_imin, name/**/_imax |