33 public :: prof_papi_rapstart
34 public :: prof_papi_rapstop
35 public :: prof_papi_rapreport
38 public :: prof_valcheck
40 interface prof_valcheck
41 module procedure prof_valcheck_sp_1d
42 module procedure prof_valcheck_sp_2d
43 module procedure prof_valcheck_sp_3d
44 module procedure prof_valcheck_sp_4d
45 module procedure prof_valcheck_sp_5d
46 module procedure prof_valcheck_sp_6d
47 module procedure prof_valcheck_dp_1d
48 module procedure prof_valcheck_dp_2d
49 module procedure prof_valcheck_dp_3d
50 module procedure prof_valcheck_dp_4d
51 module procedure prof_valcheck_dp_5d
52 module procedure prof_valcheck_dp_6d
53 end interface prof_valcheck
69 integer,
private,
parameter :: PROF_rapnlimit = 300
70 character(len=H_SHORT),
private :: PROF_prefix =
''
71 integer,
private :: PROF_rapnmax = 0
72 character(len=H_SHORT),
private :: PROF_rapname(PROF_rapnlimit)
73 integer,
private :: PROF_grpnmax = 0
74 character(len=H_SHORT),
private :: PROF_grpname(PROF_rapnlimit)
75 integer,
private :: PROF_grpid (PROF_rapnlimit)
76 real(DP),
private :: PROF_raptstr(PROF_rapnlimit)
77 real(DP),
private :: PROF_rapttot(PROF_rapnlimit)
78 integer,
private :: PROF_rapnstr(PROF_rapnlimit)
79 integer,
private :: PROF_rapcnt (PROF_rapnlimit)
80 integer,
private :: PROF_rapnend(PROF_rapnlimit)
81 integer,
private :: PROF_raplevel(PROF_rapnlimit)
83 integer,
private,
parameter :: PROF_default_rap_level = 2
84 integer,
private :: PROF_rap_level = 2
85 logical,
private :: PROF_mpi_barrier = .false.
88 integer(DP),
private :: PROF_PAPI_flops = 0
89 real(SP),
private :: PROF_PAPI_real_time = 0.0
90 real(SP),
private :: PROF_PAPI_proc_time = 0.0
91 real(SP),
private :: PROF_PAPI_mflops = 0.0
92 integer,
private :: PROF_PAPI_check
95 character(len=7),
private :: PROF_header
96 character(len=16),
private :: PROF_item
97 real(DP),
private :: PROF_max
98 real(DP),
private :: PROF_min
99 real(DP),
private :: PROF_sum
101 logical,
private :: PROF_barrier_flag
111 namelist / param_prof / &
118 log_info(
"PROF_setup",*)
'Setup'
124 log_info(
"PROF_setup",*)
'Not found namelist. Default used.'
125 elseif( ierr > 0 )
then
126 log_error(
"PROF_setup",*)
'Not appropriate names in namelist PARAM_PROF. Check!'
132 log_info(
"PROF_setup",*)
'Rap output level = ', prof_rap_level
133 log_info(
"PROF_setup",*)
'Add MPI_barrier in every rap? = ', prof_mpi_barrier
143 prof_mpi_barrier = .false.
146 prof_papi_real_time = 0.0
147 prof_papi_proc_time = 0.0
148 prof_papi_mflops = 0.0
162 character(len=*),
intent(in) :: prefxname
166 prof_prefix = prefxname
173 subroutine prof_rapstart( rapname_base, level, disable_barrier )
179 character(len=*),
intent(in) :: rapname_base
180 integer,
intent(in),
optional :: level
181 logical,
intent(in),
optional :: disable_barrier
183 character(len=H_SHORT) :: rapname
189 logical :: disable_barrier_
197 if (
present(level) )
then
200 level_ = prof_default_rap_level
203 if (
present(disable_barrier) )
then
204 disable_barrier_ = disable_barrier
206 disable_barrier_ = .false.
209 if( level_ > prof_rap_level )
return
211 if ( len_trim(prof_prefix) > 0 )
then
212 rapname = trim(prof_prefix)//
" "//trim(rapname_base)
214 rapname = rapname_base
217 id = get_rapid( rapname, level_ )
219 prof_rapcnt(id) = prof_rapcnt(id) + 1
221 if ( prof_rapcnt(id) > 1 )
return
223 if ( ( .not. disable_barrier_ ) .and. prof_mpi_barrier )
call prc_mpibarrier
226 prof_rapnstr(id) = prof_rapnstr(id) + 1
232 i = index(rapname,
" ")
233 if ( i == 0 .or. i > len_trim(rapname))
then
234 call fapp_start( rapname, id, level_ )
236 call fapp_start( rapname(1:i-1)//
"_"//trim(rapname(i+1:)), id, level_ )
245 subroutine prof_rapend( rapname_base, level, disable_barrier )
251 character(len=*),
intent(in) :: rapname_base
252 integer,
intent(in),
optional :: level
253 logical,
intent(in),
optional :: disable_barrier
255 character(len=H_SHORT) :: rapname
261 logical :: disable_barrier_
269 if (
present(level) )
then
270 if( level > prof_rap_level )
return
273 if ( len_trim(prof_prefix) > 0 )
then
274 rapname = trim(prof_prefix)//
" "//trim(rapname_base)
276 rapname = rapname_base
279 if (
present(disable_barrier) )
then
280 disable_barrier_ = disable_barrier
282 disable_barrier_ = .false.
287 id = get_rapid( rapname, level_ )
289 if( level_ > prof_rap_level )
return
291 prof_rapcnt(id) = prof_rapcnt(id) - 1
293 if ( prof_rapcnt(id) > 0 )
return
296 i = index(rapname,
" ")
297 if ( i == 0 .or. i > len_trim(rapname))
then
298 call fapp_stop( rapname, id, level_ )
300 call fapp_stop( rapname(1:i-1)//
"_"//trim(rapname(i+1:)), id, level_ )
304 prof_rapttot(id) = prof_rapttot(id) + (
prc_mpitime()-prof_raptstr(id) )
305 prof_rapnend(id) = prof_rapnend(id) + 1
307 if ( ( .not. disable_barrier_ ) .and. prof_mpi_barrier )
call prc_mpibarrier
320 real(dp) :: avgvar(prof_rapnlimit)
321 real(dp) :: maxvar(prof_rapnlimit)
322 real(dp) :: minvar(prof_rapnlimit)
323 integer :: maxidx(prof_rapnlimit)
324 integer :: minidx(prof_rapnlimit)
326 integer :: idx(prof_rapnlimit)
334 do id = 1, prof_rapnmax
335 if ( prof_rapnstr(id) /= prof_rapnend(id) )
then
336 log_warn(
"PROF_rapreport",*)
'Mismatch Report',id,prof_rapname(id),prof_rapnstr(id),prof_rapnend(id)
341 log_info(
"PROF_rapreport",
'(1x,A,I2,A)')
'Computational Time Report (Rap level = ', prof_rap_level,
')'
345 do gid = 1, prof_rapnmax
347 do id = 1, prof_rapnmax
348 if ( prof_raplevel(id) <= prof_rap_level &
349 .AND. prof_grpid(id) == gid )
then
356 if ( prof_raplevel(idx(i)) < prof_raplevel(idx(j)) .or. &
357 ( prof_raplevel(idx(i)) == prof_raplevel(idx(j)) &
358 .and. prof_rapname(idx(i)) < prof_rapname(idx(j)) ) )
then
367 log_info_cont(
'(1x,2A,I2,A,F10.3,A,I9)') &
368 prof_rapname(id),
' lev=', prof_raplevel(id), &
369 ': T=',prof_rapttot(id),
' N=',prof_rapnstr(id)
376 maxvar(1:prof_rapnmax), &
377 minvar(1:prof_rapnmax), &
378 maxidx(1:prof_rapnmax), &
379 minidx(1:prof_rapnmax), &
380 prof_rapttot(1:prof_rapnmax) )
385 write(*,*)
'INFO [PROF_rapreport] Computational Time Report'
393 do gid = 1, prof_rapnmax
395 do id = 1, prof_rapnmax
396 if ( prof_raplevel(id) <= prof_rap_level &
397 .AND. prof_grpid(id) == gid )
then
404 if ( prof_raplevel(idx(i)) < prof_raplevel(idx(j)) .or. &
405 ( prof_raplevel(idx(i)) == prof_raplevel(idx(j)) &
406 .and. prof_rapname(idx(i)) < prof_rapname(idx(j)) ) )
then
415 write(fid,
'(1x,2A,I2,A,F10.3,2(A,F10.3,A,I6,A),A,I9)') &
416 prof_rapname(id),
' lev=', prof_raplevel(id), &
417 ': T(avg)=',avgvar(id), &
418 ', T(max)=',maxvar(id),
'[',maxidx(id),
']', &
419 ', T(min)=',minvar(id),
'[',minidx(id),
']', &
420 ', N=',prof_rapnstr(id)
433 subroutine prof_papi_rapstart
437 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
440 end subroutine prof_papi_rapstart
444 subroutine prof_papi_rapstop
448 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
451 end subroutine prof_papi_rapstop
455 subroutine prof_papi_rapreport
462 real(dp) :: avgvar(3)
463 real(dp) :: maxvar(3)
464 real(dp) :: minvar(3)
469 real(dp) :: prof_papi_gflop
470 real(dp) :: statistics(3)
473 prof_papi_gflop = real(prof_papi_flops,kind=8) / 1024.0_dp**3
478 log_info(
"PROF_PAPI_rapreport",*)
'PAPI Report [Local PE information]'
479 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'Real time [sec] : ', prof_papi_real_time
480 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'CPU time [sec] : ', prof_papi_proc_time
481 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOP [GFLOP] : ', prof_papi_gflop
482 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOPS by PAPI [GFLOPS] : ', prof_papi_mflops/1024.0_dp
483 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)')
'FLOP / CPU Time [GFLOPS] : ', prof_papi_gflop/prof_papi_proc_time
486 statistics(1) = real(prof_papi_real_time,kind=8)
487 statistics(2) = real(prof_papi_proc_time,kind=8)
488 statistics(3) = prof_papi_gflop
497 zerosw = 0.5_dp - sign(0.5_dp,maxvar(2)-1.d-12)
500 log_info(
"PROF_PAPI_rapreport",*)
'PAPI Report'
501 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
502 'Real time [sec]',
' T(avg)=',avgvar(1), &
503 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']'
504 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
505 'CPU time [sec]',
' T(avg)=',avgvar(2), &
506 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']'
507 log_info(
"PROF_PAPI_rapreport",
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
508 'FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
509 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']'
511 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3,A,I6,A)') &
513 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)') &
514 'FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
515 log_info(
"PROF_PAPI_rapreport",
'(1x,A,F15.3)') &
516 'FLOPS per PE [GFLOPS] : ', avgvar(3) * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
522 write(*,*)
'*** PAPI Report'
523 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
524 '*** Real time [sec]',
' T(avg)=',avgvar(1), &
525 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']'
526 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
527 '*** CPU time [sec]',
' T(avg)=',avgvar(2), &
528 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']'
529 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I6,A,A,F10.3,A,I6,A)') &
530 '*** FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
531 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']'
533 write(*,
'(1x,A,F15.3,A,I6,A)') &
535 write(*,
'(1x,A,F15.3)') &
536 '*** FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
537 write(*,
'(1x,A,F15.3)') &
538 '*** FLOPS per PE [GFLOPS] : ', avgvar(3) * ( 1.0_dp-zerosw ) / ( maxvar(2)+zerosw )
544 end subroutine prof_papi_rapreport
549 function get_rapid( rapname, level )
result(id)
554 character(len=*),
intent(in) :: rapname
555 integer,
intent(inout) :: level
557 character (len=H_SHORT) :: trapname
563 trapname = trim(rapname)
565 do id = 1, prof_rapnmax
566 if ( trapname == prof_rapname(id) )
then
567 lev = prof_raplevel(id)
569 if ( level > 0 .and. lev .ne. level )
then
570 log_error(
"PROF_get_rapid",*)
'level is different ', trim(rapname), lev, level
579 prof_rapnmax = prof_rapnmax + 1
581 prof_rapname(id) = trapname
585 prof_rapttot(id) = 0.0_dp
589 prof_raplevel(id) = level
592 end function get_rapid
596 function get_grpid( rapname )
result(gid)
599 character(len=*),
intent(in) :: rapname
601 character(len=H_SHORT) :: grpname
607 idx = index(rapname,
" ")
609 grpname = rapname(1:idx-1)
614 do gid = 1, prof_grpnmax
615 if( grpname == prof_grpname(gid) )
return
618 prof_grpnmax = prof_grpnmax + 1
620 prof_grpname(gid) = grpname
626 subroutine prof_valcheck_sp_1d( &
632 character(len=*),
intent(in) :: header
633 character(len=*),
intent(in) :: varname
634 real(sp),
intent(in) :: var(:)
637 prof_header = trim(header)
638 prof_item = trim(varname)
639 prof_max = real(maxval(var),kind=dp)
640 prof_min = real(minval(var),kind=dp)
641 prof_sum = real(sum(var),kind=dp)
642 log_info(
"PROF_valcheck_SP_1D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
643 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
646 end subroutine prof_valcheck_sp_1d
649 subroutine prof_valcheck_sp_2d( &
655 character(len=*),
intent(in) :: header
656 character(len=*),
intent(in) :: varname
657 real(sp),
intent(in) :: var(:,:)
660 prof_header = trim(header)
661 prof_item = trim(varname)
662 prof_max = real(maxval(var),kind=dp)
663 prof_min = real(minval(var),kind=dp)
664 prof_sum = real(sum(var),kind=dp)
665 log_info(
"PROF_valcheck_SP_2D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
666 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
669 end subroutine prof_valcheck_sp_2d
672 subroutine prof_valcheck_sp_3d( &
678 character(len=*),
intent(in) :: header
679 character(len=*),
intent(in) :: varname
680 real(sp),
intent(in) :: var(:,:,:)
683 prof_header = trim(header)
684 prof_item = trim(varname)
685 prof_max = real(maxval(var),kind=dp)
686 prof_min = real(minval(var),kind=dp)
687 prof_sum = real(sum(var),kind=dp)
688 log_info(
"PROF_valcheck_SP_3D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
689 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
692 end subroutine prof_valcheck_sp_3d
695 subroutine prof_valcheck_sp_4d( &
701 character(len=*),
intent(in) :: header
702 character(len=*),
intent(in) :: varname
703 real(sp),
intent(in) :: var(:,:,:,:)
706 prof_header = trim(header)
707 prof_item = trim(varname)
708 prof_max = real(maxval(var),kind=dp)
709 prof_min = real(minval(var),kind=dp)
710 prof_sum = real(sum(var),kind=dp)
711 log_info(
"PROF_valcheck_SP_4D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
712 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
715 end subroutine prof_valcheck_sp_4d
718 subroutine prof_valcheck_sp_5d( &
724 character(len=*),
intent(in) :: header
725 character(len=*),
intent(in) :: varname
726 real(sp),
intent(in) :: var(:,:,:,:,:)
729 prof_header = trim(header)
730 prof_item = trim(varname)
731 prof_max = real(maxval(var),kind=dp)
732 prof_min = real(minval(var),kind=dp)
733 prof_sum = real(sum(var),kind=dp)
734 log_info(
"PROF_valcheck_SP_5D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
735 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
738 end subroutine prof_valcheck_sp_5d
741 subroutine prof_valcheck_sp_6d( &
747 character(len=*),
intent(in) :: header
748 character(len=*),
intent(in) :: varname
749 real(sp),
intent(in) :: var(:,:,:,:,:,:)
752 prof_header = trim(header)
753 prof_item = trim(varname)
754 prof_max = real(maxval(var),kind=dp)
755 prof_min = real(minval(var),kind=dp)
756 prof_sum = real(sum(var),kind=dp)
757 log_info(
"PROF_valcheck_SP_6D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
758 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
761 end subroutine prof_valcheck_sp_6d
764 subroutine prof_valcheck_dp_1d( &
770 character(len=*),
intent(in) :: header
771 character(len=*),
intent(in) :: varname
772 real(dp),
intent(in) :: var(:)
775 prof_header = trim(header)
776 prof_item = trim(varname)
777 prof_max = real(maxval(var),kind=dp)
778 prof_min = real(minval(var),kind=dp)
779 prof_sum = real(sum(var),kind=dp)
780 log_info(
"PROF_valcheck_DP_1D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
781 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
784 end subroutine prof_valcheck_dp_1d
787 subroutine prof_valcheck_dp_2d( &
793 character(len=*),
intent(in) :: header
794 character(len=*),
intent(in) :: varname
795 real(dp),
intent(in) :: var(:,:)
798 prof_header = trim(header)
799 prof_item = trim(varname)
800 prof_max = real(maxval(var),kind=dp)
801 prof_min = real(minval(var),kind=dp)
802 prof_sum = real(sum(var),kind=dp)
803 log_info(
"PROF_valcheck_DP_2D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
804 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
807 end subroutine prof_valcheck_dp_2d
810 subroutine prof_valcheck_dp_3d( &
816 character(len=*),
intent(in) :: header
817 character(len=*),
intent(in) :: varname
818 real(dp),
intent(in) :: var(:,:,:)
821 prof_header = trim(header)
822 prof_item = trim(varname)
823 prof_max = real(maxval(var),kind=dp)
824 prof_min = real(minval(var),kind=dp)
825 prof_sum = real(sum(var),kind=dp)
826 log_info(
"PROF_valcheck_DP_3D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
827 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
830 end subroutine prof_valcheck_dp_3d
833 subroutine prof_valcheck_dp_4d( &
839 character(len=*),
intent(in) :: header
840 character(len=*),
intent(in) :: varname
841 real(dp),
intent(in) :: var(:,:,:,:)
844 prof_header = trim(header)
845 prof_item = trim(varname)
846 prof_max = real(maxval(var),kind=dp)
847 prof_min = real(minval(var),kind=dp)
848 prof_sum = real(sum(var),kind=dp)
849 log_info(
"PROF_valcheck_DP_4D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
850 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
853 end subroutine prof_valcheck_dp_4d
856 subroutine prof_valcheck_dp_5d( &
862 character(len=*),
intent(in) :: header
863 character(len=*),
intent(in) :: varname
864 real(dp),
intent(in) :: var(:,:,:,:,:)
867 prof_header = trim(header)
868 prof_item = trim(varname)
869 prof_max = real(maxval(var),kind=dp)
870 prof_min = real(minval(var),kind=dp)
871 prof_sum = real(sum(var),kind=dp)
872 log_info(
"PROF_valcheck_DP_5D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
873 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
876 end subroutine prof_valcheck_dp_5d
879 subroutine prof_valcheck_dp_6d( &
885 character(len=*),
intent(in) :: header
886 character(len=*),
intent(in) :: varname
887 real(dp),
intent(in) :: var(:,:,:,:,:,:)
890 prof_header = trim(header)
891 prof_item = trim(varname)
892 prof_max = real(maxval(var),kind=dp)
893 prof_min = real(minval(var),kind=dp)
894 prof_sum = real(sum(var),kind=dp)
895 log_info(
"PROF_valcheck_DP_6D",
'(1x,A,A7,A,A16,3(A,ES24.16))') &
896 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
899 end subroutine prof_valcheck_dp_6d