aboutsummaryrefslogtreecommitdiff
path: root/Carpet/LoopControl/src/loopcontrol_fortran.h
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2013-01-16 14:46:17 -0500
committerErik Schnetter <schnetter@gmail.com>2013-01-16 14:46:17 -0500
commite0ddb73239c73c6de42a01204194173ce65ebff4 (patch)
treed0380bec049f7807836d68a0001f2ec492f62d0e /Carpet/LoopControl/src/loopcontrol_fortran.h
parent1cddd960d62da42ccd111022f1326740f688b48d (diff)
LoopControl: Rewrite
Rewrite code in C++. Remove dependency on GSL. Modify algorithm; now traverses arrays bottom-up (by splitting the looping region into equal-sized blocks) instead of top-down (splitting the region into a certain number of blocks) Make multi-threading dynamic Support SMT (hyper-threading), i.e. threads which share the same cache
Diffstat (limited to 'Carpet/LoopControl/src/loopcontrol_fortran.h')
-rw-r--r--Carpet/LoopControl/src/loopcontrol_fortran.h207
1 files changed, 131 insertions, 76 deletions
diff --git a/Carpet/LoopControl/src/loopcontrol_fortran.h b/Carpet/LoopControl/src/loopcontrol_fortran.h
index dcde8e149..f0548b7c3 100644
--- a/Carpet/LoopControl/src/loopcontrol_fortran.h
+++ b/Carpet/LoopControl/src/loopcontrol_fortran.h
@@ -3,86 +3,141 @@
#ifndef LOOPCONTROL_FORTRAN_H
#define LOOPCONTROL_FORTRAN_H
+#include "cctk.h"
+
+
+
+
+#define LC_COARSE_DECLARE(name, D) \
+ CCTK_POINTER :: name/**/_cmin/**/D, name/**/_cmax/**/D, \
+ name/**/_cstep/**/D, name/**/_cpos/**/D
+#define LC_COARSE_OMP_PRIVATE(name, D) \
+ name/**/_cmin/**/D, name/**/_cmax/**/D, \
+ name/**/_cstep/**/D, name/**/_cpos/**/D
+#define LC_COARSE_SETUP(name, D) \
+ name/**/_control%coarse%min%v(D) = name/**/_control%thread%pos%v(D) && \
+ name/**/_control%coarse%max%v(D) = \
+ min(name/**/_control%thread%max%v(D), \
+ name/**/_control%coarse%min%v(D) + \
+ name/**/_control%thread%step%v(D)) && \
+ name/**/_cmin/**/D = name/**/_control%coarse%min%v(D) && \
+ name/**/_cmax/**/D = name/**/_control%coarse%max%v(D) && \
+ name/**/_cstep/**/D = name/**/_control%coarse%step%v(D)
+#define LC_COARSE_LOOP(name, D) \
+ do name/**/_cpos/**/D = name/**/_cmin/**/D, name/**/_cmax/**/D, \
+ name/**/_cstep/**/D
+
+#define LC_FINE_DECLARE(name, I, D) \
+ CCTK_POINTER :: name/**/_fmin/**/D, name/**/_fmax/**/D, \
+ name/**/_fstep/**/D, I
+#define LC_FINE_OMP_PRIVATE(name, I, D) \
+ name/**/_fmin/**/D, name/**/_fmax/**/D, \
+ name/**/_fstep/**/D, I
+#define LC_FINE_SETUP(name, D) \
+ name/**/_control%fine%min%v(D) = name/**/_cpos/**/D && \
+ name/**/_control%fine%max%v(D) = \
+ min(name/**/_control%coarse%max%v(D), \
+ name/**/_control%fine%min%v(D) + \
+ name/**/_control%coarse%step%v(D)) && \
+ name/**/_fmin/**/D = name/**/_control%fine%min%v(D) && \
+ name/**/_fmax/**/D = name/**/_control%fine%max%v(D) && \
+ name/**/_fstep/**/D = name/**/_control%fine%step%v(D)
+#define LC_FINE_LOOP(name, I, D) \
+ do I = name/**/_fmin/**/D, name/**/_fmax/**/D, name/**/_fstep/**/D
+
+
+
+#define LC_DECLARE3(name, i,j,k) \
+ CCTK_POINTER :: name/**/_ash1, name/**/_ash2, name/**/_ash3 && \
+ CCTK_POINTER :: name/**/_align1, name/**/_align2, name/**/_align3 && \
+ CCTK_POINTER, save :: name/**/_stats = 0 && \
+ type(lc_control_t) :: name/**/_control && \
+ LC_COARSE_DECLARE(name, 1) && \
+ LC_COARSE_DECLARE(name, 2) && \
+ LC_COARSE_DECLARE(name, 3) && \
+ LC_FINE_DECLARE(name, i, 1) && \
+ LC_FINE_DECLARE(name, j, 2) && \
+ LC_FINE_DECLARE(name, k, 3)
+
+#define LC_OMP_PRIVATE(name, i,j,k) \
+ name/**/_ash1, name/**/_ash2, name/**/_ash3, \
+ name/**/_align1, name/**/_align2, name/**/_align3, \
+ name/**/_control, \
+ LC_COARSE_OMP_PRIVATE(name, 1), \
+ LC_COARSE_OMP_PRIVATE(name, 2), \
+ LC_COARSE_OMP_PRIVATE(name, 3), \
+ LC_FINE_OMP_PRIVATE(name, i, 1), \
+ LC_FINE_OMP_PRIVATE(name, j, 2), \
+ LC_FINE_OMP_PRIVATE(name, k, 3)
+
+
+
+#define LC_LOOP3STR(name, i,j,k, imin_,jmin_,kmin_, imax_,jmax_,kmax_, \
+ iash_,jash_,kash_, di_) \
+ name/**/_ash1 = (iash_) && \
+ name/**/_ash2 = (jash_) && \
+ name/**/_ash3 = (kash_) && \
+ name/**/_aligh1 = (di_) && \
+ name/**/_aligh2 = 1 && \
+ name/**/_aligh3 = 1 && \
+ && \
+ call lc_stats_init(name/**/stats, #name) && \
+ call lc_control_init(name/**/control, name/**/stats, \
+ (imin_), (jmin_), (kmin_), \
+ (imax_), (jmax_), (kmax_), \
+ name/**/ash1, name/**/ash2, name/**/ash3, \
+ name/**/align1, name/**/align2, name/**/align3) && \
+ && \
+ /* Multithreading */ && \
+ call lc_thread_init(name/**/control) && \
+ do while (.not. lc_thread_done(name/**/control)) && \
+ && \
+ /* Coarse loops */ && \
+ LC_COARSE_SETUP(3) && \
+ LC_COARSE_SETUP(2) && \
+ LC_COARSE_SETUP(1) && \
+ LC_COARSE_LOOP(3) && \
+ LC_COARSE_LOOP(2) && \
+ LC_COARSE_LOOP(1) && \
+ && \
+ /* Fine loops */ && \
+ LC_FINE_SETUP(3) && \
+ LC_FINE_SETUP(2) && \
+ LC_FINE_SETUP(1) && \
+ LC_FINE_LOOP(3) && \
+ LC_FINE_LOOP(2) && \
+ LC_FINE_LOOP(1)
+
+#define LC_ENDLOOP3STR(name) && \
+ end do && \
+ end do && \
+ end do && \
+ end do && \
+ end do && \
+ end do && \
+ call lc_thread_step(name/**/control) && \
+ end do && \
+ call lc_control_finish(name/**/control, name/**/stats)
+
+
+
+#define LC_LOOP3(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, iash,jash,kash) \
+ LC_LOOP3STR(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, iash,jash,kash, 1)
+#define LC_ENDLOOP3(name) \
+ LC_ENDLOOP3STR(name)
-#define LC_DECLARE3(name, i,j,k) &&\
-type (lc_statmap_t), save :: name/**/_lm &&\
-integer, save :: name/**/_initialised = 0 &&\
-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 :: name/**/_ipos, name/**/_ioffset, name/**/_di &&\
-integer :: i, j, k
-
-
-
-#define LC_PRIVATE3(name) \
-name/**/_lc, \
-name/**/_imin, name/**/_jmin, name/**/_kmin, \
-name/**/_imax, name/**/_jmax, name/**/_kmax, \
-name/**/_ipos, name/**/_ioffset, name/**/_di
+/* Replace CCTK_LOOP macros */
+#undef CCTK_LOOP3_DECLARE
+#undef CCTK_LOOP3_OMP_PRIVATE
+#undef CCTK_LOOP3
+#undef CCTK_ENDLOOP3
+#define CCTK_LOOP3_DECLARE LC_LOOP3_DECLARE
+#define CCTK_LOOP3_OMP_PRIVATE LC_LOOP3_OMP_PRIVATE
+#define CCTK_LOOP3 LC_LOOP3
+#define CCTK_ENDLOOP3 LC_ENDLOOP3
-#define LC_LOOP3(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, ilsh,jlsh,klsh) \
- LC_LOOP3VEC(name, i,j,k, imin,jmin,kmin, imax,jmax,kmax, ilsh,jlsh,klsh, 1)
-#define LC_ENDLOOP3(name) \
- LC_ENDLOOP3VEC(name)
-
-#define LC_LOOP3VEC(name, i,j,k, imin_,jmin_,kmin_, imax_,jmax_,kmax_, ilsh_,jlsh_,klsh_, di_) &&\
- if (name/**/_initialised .eq. 0) then &&\
- call lc_statmap_init (name/**/_initialised, name/**/_lm, "name") &&\
- end if &&\
- name/**/_di = (di_) &&\
- call lc_control_init (name/**/_lc, name/**/_lm, \
- (imin_), (jmin_), (kmin_), \
- (imax_), (jmax_), (kmax_), \
- (ilsh_), (jlsh_), (klsh_), \
- name/**/_di) &&\
- &&\
- /* Coarse loop */ &&\
-name/**/_lc_loop3vec: \
- do name/**/_kk = name/**/_lc%kkmin + 1, name/**/_lc%kkmax, name/**/_lc%kkstep &&\
- name/**/_kmin = name/**/_kk - 1 + name/**/_lc%kkkkmin &&\
- name/**/_kmax = min (name/**/_kk - 1 + name/**/_lc%kkkkmax, name/**/_lc%kkmax) &&\
- &&\
- do name/**/_jj = name/**/_lc%jjmin + 1, name/**/_lc%jjmax, name/**/_lc%jjstep &&\
- name/**/_jmin = name/**/_jj - 1 + name/**/_lc%jjjjmin &&\
- 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 - 1 + name/**/_lc%iiiimin &&\
- name/**/_imax = min (name/**/_ii - 1 + name/**/_lc%iiiimax, name/**/_lc%iimax) &&\
- &&\
- /* Fine loop */ &&\
- do k = name/**/_kmin + 1, name/**/_kmax &&\
- do j = name/**/_jmin + 1, name/**/_jmax &&\
- LC_PRELOOP_STATEMENTS &&\
- name/**/_ipos = \
- name/**/_imin + name/**/_lc%ilsh * (j - 1 + name/**/_lc%jlsh * (k-1)) &&\
- /* round down to the next multiple of lc_di, assuming that lc_di is a power */ &&\
- /* of 2, and integers are encoded as two's-complement */ &&\
- name/**/_ioffset = iand(name/**/_ipos, - name/**/_di) - name/**/_ipos &&\
- do i = name/**/_imin + name/**/_ioffset + 1, name/**/_imax, name/**/_di
-
-
-
-#define LC_ENDLOOP3VEC(name) &&\
- end do &&\
- end do &&\
- LC_POSTLOOP_STATEMENTS &&\
- end do &&\
- &&\
- end do &&\
- end do &&\
-end do name/**/_lc_loop3vec &&\
- &&\
-call lc_control_finish (name/**/_lc)
-
-/* Pre- and post loop statements are inserted around the innermost
- loop, which is executed serially. By default these are empty. */
-#define LC_PRELOOP_STATEMENTS
-#define LC_POSTLOOP_STATEMENTS
#endif /* #ifndef LOOPCONTROL_FORTRAN_H */