--- MITgcm_contrib/cg2d_bench/cg2d.F 2006/05/12 21:58:05 1.1 +++ MITgcm_contrib/cg2d_bench/cg2d.F 2006/05/12 22:21:21 1.2 @@ -1,3 +1,4 @@ +C $Id: cg2d.F,v 1.2 2006/05/12 22:21:21 ce107 Exp $ SUBROUTINE CG2D C /==========================================================\ C | SUBROUTINE CG2D | @@ -28,6 +29,11 @@ #include "EEPARAMS.h" #include "PARAMS.h" #include "CG2D.h" +#if defined(USE_PAPI_FLOPS) || defined(USE_PAPI_FLIPS) +#if defined(PAPI_PER_ITERATION) || defined(PAPI_PER_TIMESTEP) +#include "PAPI.h" +#endif +#endif C === Routine arguments === C myThid - Thread on which I am working. @@ -49,29 +55,43 @@ C err - Measure of residual of Ax - b, usually the norm. C I, J, N - Loop counters ( N counts CG iterations ) INTEGER actualIts - REAL actualResidual INTEGER bi, bj INTEGER I, J, N - REAL err - REAL errSum - REAL etaN - REAL etaNM1 - REAL etaNSum - REAL beta - REAL alpha - REAL alphaSum - REAL sumRHS - REAL temp +#ifdef USE_MIXED_PRECISION + REAL*8 actualResidual + REAL*8 err + REAL*8 errSum + REAL*8 etaN + REAL*8 etaNM1 + REAL*8 etaNSum + REAL*8 beta + REAL*8 alpha + REAL*8 alphaSum + REAL*8 sumRHS + REAL*8 temp +#else + Real actualResidual + Real err + Real errSum + Real etaN + Real etaNM1 + Real etaNSum + Real beta + Real alpha + Real alphaSum + Real sumRHS + Real temp +#endif C-- Initialise inverter - etaNM1 = 1. D0 + etaNM1 = 1. _d 0 C-- Initial residual calculation err = 0. _d 0 sumRHS = 0. _d 0 DO J=1,sNy DO I=1,sNx - cg2d_s(I,J) = 0. + cg2d_s(I,J) = 0. _d 0 cg2d_r(I,J) = cg2d_b(I,J) - & ( aW2d(I ,J )*cg2d_x(I-1,J )+aW2d(I+1,J )*cg2d_x(I+1,J ) & +aS2d(I ,J )*cg2d_x(I ,J-1)+aS2d(I ,J+1)*cg2d_x(I ,J+1) @@ -92,7 +112,7 @@ actualIts = 0 actualResidual = SQRT(err) WRITE(6,*) ' CG2D iters, err = ', actualIts, actualResidual - IF ( actualResidual .EQ. 0. ) STOP 'ABNORMAL END: RESIDUAL 0' + IF ( actualResidual .EQ. 0. _d 0) STOP 'ABNORMAL END: RESIDUAL 0' C >>>>>>>>>>>>>>> BEGIN SOLVER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DO 10 N=1, cg2dMaxIters @@ -277,14 +297,44 @@ err = SQRT(err) actualIts = N actualResidual = err -CcnhDebugStarts -C WRITE(6,*) ' CG2D iters, err = ', actualIts, actualResidual -CcnhDebugEnds +#ifdef RESIDUAL_PER_ITERATION + WRITE(6,*) ' CG2D iters, err = ', actualIts, actualResidual +#endif IF ( err .LT. cg2dTargetResidual ) GOTO 11 CALL EXCH_XY_R8(cg2d_r ) +#ifdef PAPI_PER_ITERATION +#ifdef USE_PAPI_FLOPS + call PAPIF_flops(real_time, proc_time, flpops, mflops, check) + WRITE(6,'(F10.3,A7,F10.3,A37,I8)') + $ mflops, ' user ', mflops*proc_time/real_time, + $ ' wallclock Mflop/s during iteration ', N +#else +#ifdef USE_PAPI_FLIPS + call PAPIF_flips(real_time, proc_time, flpops, mflops, check) + WRITE(6,'(F10.3,A7,F10.3,A37,I8)') + $ mflops, ' user ', mflops*proc_time/real_time, + $ ' wallclock Mflip/s during iteration ', N +#endif +#endif +#endif 10 CONTINUE 11 CONTINUE CALL EXCH_XY_R8(cg2d_x ) +#ifdef PAPI_PER_TIMESTEP +#ifdef USE_PAPI_FLOPS + call PAPIF_flops(real_time, proc_time, flpops, mflops, check) + WRITE(6,'(F10.3,A7,F10.3,A37,I8)') + $ mflops, ' user ', mflops*proc_time/real_time, + $ ' wallclock Mflop/s during iteration ', N +#else +#ifdef USE_PAPI_FLIPS + call PAPIF_flips(real_time, proc_time, flpops, mflops, check) + WRITE(6,'(F10.3,A7,F10.3,A37,I8)') + $ mflops, ' user ', mflops*proc_time/real_time, + $ ' wallclock Mflip/s during iteration ', N +#endif +#endif +#endif WRITE(6,*) ' CG2D iters, err = ', actualIts, actualResidual C Calc Ax to check result