32 public :: prof_papi_rapstart
33 public :: prof_papi_rapstop
34 public :: prof_papi_rapreport
37 public :: prof_valcheck
39 interface prof_valcheck
40 module procedure prof_valcheck_sp_1d
41 module procedure prof_valcheck_sp_2d
42 module procedure prof_valcheck_sp_3d
43 module procedure prof_valcheck_sp_4d
44 module procedure prof_valcheck_sp_5d
45 module procedure prof_valcheck_sp_6d
46 module procedure prof_valcheck_dp_1d
47 module procedure prof_valcheck_dp_2d
48 module procedure prof_valcheck_dp_3d
49 module procedure prof_valcheck_dp_4d
50 module procedure prof_valcheck_dp_5d
51 module procedure prof_valcheck_dp_6d
52 end interface prof_valcheck
68 integer,
private,
parameter :: PROF_rapnlimit = 300
69 character(len=H_SHORT),
private :: PROF_prefix =
''
70 integer,
private :: PROF_rapnmax = 0
71 character(len=H_SHORT),
private :: PROF_rapname(PROF_rapnlimit)
72 integer,
private :: PROF_grpnmax = 0
73 character(len=H_SHORT),
private :: PROF_grpname(PROF_rapnlimit)
74 integer,
private :: PROF_grpid (PROF_rapnlimit)
75 real(DP),
private :: PROF_raptstr(PROF_rapnlimit)
76 real(DP),
private :: PROF_rapttot(PROF_rapnlimit)
77 integer,
private :: PROF_rapnstr(PROF_rapnlimit)
78 integer,
private :: PROF_rapnend(PROF_rapnlimit)
79 integer,
private :: PROF_raplevel(PROF_rapnlimit)
81 integer,
private,
parameter :: PROF_default_rap_level = 2
82 integer,
private :: PROF_rap_level = 2
83 logical,
private :: PROF_mpi_barrier = .false.
86 integer(DP),
private :: PROF_PAPI_flops = 0
87 real(SP),
private :: PROF_PAPI_real_time = 0.0
88 real(SP),
private :: PROF_PAPI_proc_time = 0.0
89 real(SP),
private :: PROF_PAPI_mflops = 0.0
90 integer,
private :: PROF_PAPI_check
93 character(len=7),
private :: PROF_header
94 character(len=16),
private :: PROF_item
95 real(DP),
private :: PROF_max
96 real(DP),
private :: PROF_min
97 real(DP),
private :: PROF_sum
99 logical,
private :: PROF_barrier_flag
109 namelist / param_prof / &
116 log_info(
"PROF_setup",*)
'Setup'
122 log_info(
"PROF_setup",*)
'Not found namelist. Default used.'
123 elseif( ierr > 0 )
then
124 log_error(
"PROF_setup",*)
'Not appropriate names in namelist PARAM_PROF. Check!'
130 log_info(
"PROF_setup",*)
'Rap output level = ', prof_rap_level
131 log_info(
"PROF_setup",*)
'Add MPI_barrier in every rap? = ', prof_mpi_barrier
143 character(len=*),
intent(in) :: prefxname
147 if ( prefxname ==
'' )
then
150 prof_prefix = trim(prefxname)//
'_'
158 subroutine prof_rapstart( rapname_base, level, disable_barrier )
164 character(len=*),
intent(in) :: rapname_base
165 integer,
intent(in),
optional :: level
166 logical,
intent(in),
optional :: disable_barrier
168 character(len=H_SHORT) :: rapname
173 logical :: disable_barrier_
181 if (
present(level) )
then
184 level_ = prof_default_rap_level
187 if (
present(disable_barrier) )
then
188 disable_barrier_ = disable_barrier
190 disable_barrier_ = .false.
193 if( level_ > prof_rap_level )
return
195 rapname = trim(prof_prefix)//trim(rapname_base)
197 id = get_rapid( rapname, level_ )
199 if ( ( .not. disable_barrier_ ) .and. prof_mpi_barrier )
call prc_mpibarrier
202 prof_rapnstr(id) = prof_rapnstr(id) + 1
208 call fapp_start( trim(prof_grpname(get_grpid(rapname))), id, level_ )
216 subroutine prof_rapend( rapname_base, level, disable_barrier )
222 character(len=*),
intent(in) :: rapname_base
223 integer,
intent(in),
optional :: level
224 logical,
intent(in),
optional :: disable_barrier
226 character(len=H_SHORT) :: rapname
231 logical :: disable_barrier_
240 if (
present(level) )
then
241 if( level > prof_rap_level )
return
244 if (
present(disable_barrier) )
then
245 disable_barrier_ = disable_barrier
247 disable_barrier_ = .false.
250 rapname = trim(prof_prefix)//trim(rapname_base)
252 id = get_rapid( rapname, level_ )
254 if( level_ > prof_rap_level )
return
256 prof_rapttot(id) = prof_rapttot(id) + (
prc_mpitime()-prof_raptstr(id) )
257 prof_rapnend(id) = prof_rapnend(id) + 1
259 if ( ( .not. disable_barrier_ ) .and. prof_mpi_barrier )
call prc_mpibarrier
262 call fapp_stop( trim(prof_grpname(prof_grpid(id))), id, level_ )
276 real(dp) :: avgvar(prof_rapnlimit)
277 real(dp) :: maxvar(prof_rapnlimit)
278 real(dp) :: minvar(prof_rapnlimit)
279 integer :: maxidx(prof_rapnlimit)
280 integer :: minidx(prof_rapnlimit)
286 do id = 1, prof_rapnmax
287 if ( prof_rapnstr(id) /= prof_rapnend(id) )
then
288 log_warn(
"PROF_rapreport",*)
'Mismatch Report',id,prof_rapname(id),prof_rapnstr(id),prof_rapnend(id)
293 log_info(
"PROF_rapreport",
'(1x,A,I2,A)')
'Computational Time Report (Rap level = ', prof_rap_level,
')'
297 do gid = 1, prof_rapnmax
298 do id = 1, prof_rapnmax
299 if ( prof_raplevel(id) <= prof_rap_level &
300 .AND. prof_grpid(id) == gid )
then
301 log_info_cont(
'(1x,A,I3.3,A,A,A,F10.3,A,I9)') &
302 'ID=',id,
' : ',prof_rapname(id),
' T=',prof_rapttot(id),
' N=',prof_rapnstr(id)
310 maxvar(1:prof_rapnmax), &
311 minvar(1:prof_rapnmax), &
312 maxidx(1:prof_rapnmax), &
313 minidx(1:prof_rapnmax), &
314 prof_rapttot(1:prof_rapnmax) )
319 write(*,*)
'INFO [PROF_rapreport] Computational Time Report'
326 do gid = 1, prof_rapnmax
327 do id = 1, prof_rapnmax
328 if ( prof_raplevel(id) <= prof_rap_level &
329 .AND. prof_grpid(id) == gid &
331 write(fid,
'(6x,A,I3.3,3A,F10.3,A,F10.3,A,I5,2A,F10.3,A,I5,2A,I9)') &
332 'ID=',id,
' : ',prof_rapname(id), &
333 ' T(avg)=',avgvar(id), &
334 ', T(max)=',maxvar(id),
'[',maxidx(id),
']', &
335 ', T(min)=',minvar(id),
'[',minidx(id),
']', &
336 ', N=',prof_rapnstr(id)
349 subroutine prof_papi_rapstart
353 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
356 end subroutine prof_papi_rapstart
360 subroutine prof_papi_rapstop
364 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
367 end subroutine prof_papi_rapstop
371 subroutine prof_papi_rapreport
378 real(dp) :: avgvar(3)
379 real(dp) :: maxvar(3)
380 real(dp) :: minvar(3)
385 real(dp) :: prof_papi_gflop
386 real(dp) :: statistics(3)
389 prof_papi_gflop = real(prof_papi_flops,kind=8) / 1024.0_dp**3
394 log_info(
"PROF_PAPI_rapreport",*)
'PAPI Report [Local PE information]'
395 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'Real time [sec] : ', prof_papi_real_time
396 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'CPU time [sec] : ', prof_papi_proc_time
397 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOP [GFLOP] : ', prof_papi_gflop
398 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOPS by PAPI [GFLOPS] : ', prof_papi_mflops/1024.0_dp
399 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOP / CPU Time [GFLOPS] : ', prof_papi_gflop/prof_papi_proc_time
402 statistics(1) = real(prof_papi_real_time,kind=8)
403 statistics(2) = real(prof_papi_proc_time,kind=8)
404 statistics(3) = prof_papi_gflop
413 zerosw = 0.5_dp - sign(0.5_dp,maxvar(2)-1.d-12)
416 log_info(
"PROF_PAPI_rapreport",*)
'PAPI Report'
417 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
418 'Real time [sec]',
' T(avg)=',avgvar(1), &
419 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']'
420 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
421 'CPU time [sec]',
' T(avg)=',avgvar(2), &
422 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']'
423 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
424 'FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
425 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']'
427 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3,A,I6,A)') &
429 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)') &
430 'FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
431 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)') &
432 'FLOPS per PE [GFLOPS] : ', avgvar(3) * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
438 write(*,*)
'*** PAPI Report'
439 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
440 '*** Real time [sec]',
' T(avg)=',avgvar(1), &
441 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']'
442 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
443 '*** CPU time [sec]',
' T(avg)=',avgvar(2), &
444 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']'
445 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
446 '*** FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
447 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']'
449 write(*,
'(1x,A,F15.3,A,I6,A)') &
451 write(*,
'(1x,A,F15.3)') &
452 '*** FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
453 write(*,
'(1x,A,F15.3)') &
454 '*** FLOPS per PE [GFLOPS] : ', avgvar(3) * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
460 end subroutine prof_papi_rapreport
465 function get_rapid( rapname, level )
result(id)
468 character(len=*),
intent(in) :: rapname
469 integer,
intent(inout) :: level
471 character (len=H_SHORT) :: trapname
476 trapname = trim(rapname)
478 do id = 1, prof_rapnmax
479 if ( trapname == prof_rapname(id) )
then
480 level = prof_raplevel(id)
485 prof_rapnmax = prof_rapnmax + 1
487 prof_rapname(id) = trapname
491 prof_rapttot(id) = 0.0_dp
493 prof_grpid(id) = get_grpid(trapname)
494 prof_raplevel(id) = level
497 end function get_rapid
501 function get_grpid( rapname )
result(gid)
504 character(len=*),
intent(in) :: rapname
506 character(len=H_SHORT) :: grpname
512 idx = index(rapname,
" ")
514 grpname = rapname(1:idx-1)
519 do gid = 1, prof_grpnmax
520 if( grpname == prof_grpname(gid) )
return
523 prof_grpnmax = prof_grpnmax + 1
525 prof_grpname(gid) = grpname
528 end function get_grpid
531 subroutine prof_valcheck_sp_1d( &
537 character(len=*),
intent(in) :: header
538 character(len=*),
intent(in) :: varname
539 real(sp),
intent(in) :: var(:)
542 prof_header = trim(header)
543 prof_item = trim(varname)
544 prof_max = real(maxval(var),kind=dp)
545 prof_min = real(minval(var),kind=dp)
546 prof_sum = real(sum(var),kind=dp)
547 log_info(
"PROF_valcheck_SP_1D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
548 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
551 end subroutine prof_valcheck_sp_1d
554 subroutine prof_valcheck_sp_2d( &
560 character(len=*),
intent(in) :: header
561 character(len=*),
intent(in) :: varname
562 real(sp),
intent(in) :: var(:,:)
565 prof_header = trim(header)
566 prof_item = trim(varname)
567 prof_max = real(maxval(var),kind=dp)
568 prof_min = real(minval(var),kind=dp)
569 prof_sum = real(sum(var),kind=dp)
570 log_info(
"PROF_valcheck_SP_2D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
571 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
574 end subroutine prof_valcheck_sp_2d
577 subroutine prof_valcheck_sp_3d( &
583 character(len=*),
intent(in) :: header
584 character(len=*),
intent(in) :: varname
585 real(sp),
intent(in) :: var(:,:,:)
588 prof_header = trim(header)
589 prof_item = trim(varname)
590 prof_max = real(maxval(var),kind=dp)
591 prof_min = real(minval(var),kind=dp)
592 prof_sum = real(sum(var),kind=dp)
593 log_info(
"PROF_valcheck_SP_3D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
594 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
597 end subroutine prof_valcheck_sp_3d
600 subroutine prof_valcheck_sp_4d( &
606 character(len=*),
intent(in) :: header
607 character(len=*),
intent(in) :: varname
608 real(sp),
intent(in) :: var(:,:,:,:)
611 prof_header = trim(header)
612 prof_item = trim(varname)
613 prof_max = real(maxval(var),kind=dp)
614 prof_min = real(minval(var),kind=dp)
615 prof_sum = real(sum(var),kind=dp)
616 log_info(
"PROF_valcheck_SP_4D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
617 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
620 end subroutine prof_valcheck_sp_4d
623 subroutine prof_valcheck_sp_5d( &
629 character(len=*),
intent(in) :: header
630 character(len=*),
intent(in) :: varname
631 real(sp),
intent(in) :: var(:,:,:,:,:)
634 prof_header = trim(header)
635 prof_item = trim(varname)
636 prof_max = real(maxval(var),kind=dp)
637 prof_min = real(minval(var),kind=dp)
638 prof_sum = real(sum(var),kind=dp)
639 log_info(
"PROF_valcheck_SP_5D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
640 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
643 end subroutine prof_valcheck_sp_5d
646 subroutine prof_valcheck_sp_6d( &
652 character(len=*),
intent(in) :: header
653 character(len=*),
intent(in) :: varname
654 real(sp),
intent(in) :: var(:,:,:,:,:,:)
657 prof_header = trim(header)
658 prof_item = trim(varname)
659 prof_max = real(maxval(var),kind=dp)
660 prof_min = real(minval(var),kind=dp)
661 prof_sum = real(sum(var),kind=dp)
662 log_info(
"PROF_valcheck_SP_6D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
663 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
666 end subroutine prof_valcheck_sp_6d
669 subroutine prof_valcheck_dp_1d( &
675 character(len=*),
intent(in) :: header
676 character(len=*),
intent(in) :: varname
677 real(dp),
intent(in) :: var(:)
680 prof_header = trim(header)
681 prof_item = trim(varname)
682 prof_max = real(maxval(var),kind=dp)
683 prof_min = real(minval(var),kind=dp)
684 prof_sum = real(sum(var),kind=dp)
685 log_info(
"PROF_valcheck_DP_1D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
686 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
689 end subroutine prof_valcheck_dp_1d
692 subroutine prof_valcheck_dp_2d( &
698 character(len=*),
intent(in) :: header
699 character(len=*),
intent(in) :: varname
700 real(dp),
intent(in) :: var(:,:)
703 prof_header = trim(header)
704 prof_item = trim(varname)
705 prof_max = real(maxval(var),kind=dp)
706 prof_min = real(minval(var),kind=dp)
707 prof_sum = real(sum(var),kind=dp)
708 log_info(
"PROF_valcheck_DP_2D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
709 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
712 end subroutine prof_valcheck_dp_2d
715 subroutine prof_valcheck_dp_3d( &
721 character(len=*),
intent(in) :: header
722 character(len=*),
intent(in) :: varname
723 real(dp),
intent(in) :: var(:,:,:)
726 prof_header = trim(header)
727 prof_item = trim(varname)
728 prof_max = real(maxval(var),kind=dp)
729 prof_min = real(minval(var),kind=dp)
730 prof_sum = real(sum(var),kind=dp)
731 log_info(
"PROF_valcheck_DP_3D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
732 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
735 end subroutine prof_valcheck_dp_3d
738 subroutine prof_valcheck_dp_4d( &
744 character(len=*),
intent(in) :: header
745 character(len=*),
intent(in) :: varname
746 real(dp),
intent(in) :: var(:,:,:,:)
749 prof_header = trim(header)
750 prof_item = trim(varname)
751 prof_max = real(maxval(var),kind=dp)
752 prof_min = real(minval(var),kind=dp)
753 prof_sum = real(sum(var),kind=dp)
754 log_info(
"PROF_valcheck_DP_4D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
755 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
758 end subroutine prof_valcheck_dp_4d
761 subroutine prof_valcheck_dp_5d( &
767 character(len=*),
intent(in) :: header
768 character(len=*),
intent(in) :: varname
769 real(dp),
intent(in) :: var(:,:,:,:,:)
772 prof_header = trim(header)
773 prof_item = trim(varname)
774 prof_max = real(maxval(var),kind=dp)
775 prof_min = real(minval(var),kind=dp)
776 prof_sum = real(sum(var),kind=dp)
777 log_info(
"PROF_valcheck_DP_5D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
778 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
781 end subroutine prof_valcheck_dp_5d
784 subroutine prof_valcheck_dp_6d( &
790 character(len=*),
intent(in) :: header
791 character(len=*),
intent(in) :: varname
792 real(dp),
intent(in) :: var(:,:,:,:,:,:)
795 prof_header = trim(header)
796 prof_item = trim(varname)
797 prof_max = real(maxval(var),kind=dp)
798 prof_min = real(minval(var),kind=dp)
799 prof_sum = real(sum(var),kind=dp)
800 log_info(
"PROF_valcheck_DP_6D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
801 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
804 end subroutine prof_valcheck_dp_6d