Benchmarks VSH_POL_UP_ALL (batch) against looped VSH_POL_UP
(single-mode) calls, for , swept over NX colatitude points.
LMAX N_MODES T_BATCH T_LOOP SPEEDUP (seconds per grid-point
evaluation).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i4), | intent(in) | :: | LMAX |
Maximum degree benchmarked, . |
||
| integer(kind=i4), | intent(in) | :: | NX |
Number of colatitude points swept per timing measurement. |
||
| integer(kind=i4), | intent(in) | :: | OUTUNIT |
Fortran unit number to append one result row to: |
SUBROUTINE BENCH_VSH_POL_UP(LMAX, NX, OUTUNIT) IMPLICIT NONE INTEGER(KIND=i4), INTENT(IN) :: LMAX INTEGER(KIND=i4), INTENT(IN) :: NX INTEGER(KIND=i4), INTENT(IN) :: OUTUNIT INTEGER(KIND=i4) :: L, M, IX, R, NREP, NYLM REAL(KIND=dp) :: THETA, PHI, DTH, T0, T1, T_BATCH, T_LOOP COMPLEX(KIND=dp) :: ACC COMPLEX(KIND=dp), ALLOCATABLE :: OUT(:,:) NYLM = (LMAX+1)**2 ALLOCATE(OUT(3,NYLM)) PHI = 0.123d0 DTH = pi / (NX - 1) NREP = 1 DO T0 = WALL_TIME() DO R = 1, NREP DO IX = 0, NX-1 THETA = IX*DTH CALL VSH_POL_UP_ALL(OUT, LMAX, THETA, PHI) ENDDO ENDDO T1 = WALL_TIME() IF (T1-T0 >= MIN_TIME .OR. NREP >= NREP_CAP) EXIT NREP = NREP*2 ENDDO T_BATCH = (T1-T0) / (NREP*NX) ACC = SUM(OUT) IF (ACC == (-1.0d300,0.d0)) WRITE(*,'(A)') "" IF (LMAX <= LOOP_LMAX_CAP) THEN NREP = 1 DO ACC = DCMPLX(0.d0,0.d0) T0 = WALL_TIME() DO R = 1, NREP DO IX = 0, NX-1 THETA = IX*DTH DO L = 0, LMAX DO M = -L, L ACC = ACC + SUM(VSH_POL_UP(L, M, THETA, PHI)) ENDDO ENDDO ENDDO ENDDO T1 = WALL_TIME() IF (T1-T0 >= MIN_TIME .OR. NREP >= NREP_CAP) EXIT NREP = NREP*2 ENDDO T_LOOP = (T1-T0) / (NREP*NX) IF (ACC == (-1.0d300,0.d0)) WRITE(*,'(A)') "" ELSE T_LOOP = -1.0_dp !- sentinel: not measured, see LOOP_LMAX_CAP END IF IF (T_LOOP >= 0.0_dp) THEN WRITE(OUTUNIT,'(I6,1X,I8,1X,ES14.6,1X,ES14.6,1X,F12.3)') & LMAX, NYLM, T_BATCH, T_LOOP, T_LOOP/T_BATCH ELSE WRITE(OUTUNIT,'(I6,1X,I8,1X,ES14.6,1X,ES14.6,1X,F12.3)') & LMAX, NYLM, T_BATCH, T_LOOP, -1.0_dp END IF DEALLOCATE(OUT) RETURN END SUBROUTINE BENCH_VSH_POL_UP