aboutsummaryrefslogtreecommitdiff
path: root/Carpet/LoopControl/src/loopcontrol_fortran.h
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@cct.lsu.edu>2009-09-21 11:28:26 -0500
committerBarry Wardell <barry.wardell@gmail.com>2011-12-14 16:45:09 +0000
commit29e373ad99f97175fd6443dd7e9307e10cc125f2 (patch)
tree1b424d49d8e2dd079b78821c5fa842e559c91732 /Carpet/LoopControl/src/loopcontrol_fortran.h
parentf5b0376823ed3658847fdf2f3447c87fcdec15ff (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.h55
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