diff options
Diffstat (limited to 'Carpet/LoopControl/src/loopcontrol_fortran.h')
-rw-r--r-- | Carpet/LoopControl/src/loopcontrol_fortran.h | 207 |
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 */ |