31 public :: prof_papi_rapstart
32 public :: prof_papi_rapstop
33 public :: prof_papi_rapreport
36 public :: prof_valcheck
38 interface prof_valcheck
39 module procedure prof_valcheck_sp_1d
40 module procedure prof_valcheck_sp_2d
41 module procedure prof_valcheck_sp_3d
42 module procedure prof_valcheck_sp_4d
43 module procedure prof_valcheck_sp_5d
44 module procedure prof_valcheck_sp_6d
45 module procedure prof_valcheck_dp_1d
46 module procedure prof_valcheck_dp_2d
47 module procedure prof_valcheck_dp_3d
48 module procedure prof_valcheck_dp_4d
49 module procedure prof_valcheck_dp_5d
50 module procedure prof_valcheck_dp_6d
51 end interface prof_valcheck
67 integer,
private,
parameter :: PROF_rapnlimit = 300
68 character(len=H_SHORT),
private :: PROF_prefix =
'' 69 integer,
private :: PROF_rapnmax = 0
70 character(len=H_SHORT),
private :: PROF_rapname(PROF_rapnlimit)
71 integer,
private :: PROF_grpnmax = 0
72 character(len=H_SHORT),
private :: PROF_grpname(PROF_rapnlimit)
73 integer,
private :: PROF_grpid (PROF_rapnlimit)
74 real(DP),
private :: PROF_raptstr(PROF_rapnlimit)
75 real(DP),
private :: PROF_rapttot(PROF_rapnlimit)
76 integer,
private :: PROF_rapnstr(PROF_rapnlimit)
77 integer,
private :: PROF_rapnend(PROF_rapnlimit)
78 integer,
private :: PROF_raplevel(PROF_rapnlimit)
80 integer,
private,
parameter :: PROF_default_rap_level = 2
81 integer,
private :: PROF_rap_level = 2
82 logical,
private :: PROF_mpi_barrier = .false.
85 integer(DP),
private :: PROF_PAPI_flops = 0
86 real(SP),
private :: PROF_PAPI_real_time = 0.0
87 real(SP),
private :: PROF_PAPI_proc_time = 0.0
88 real(SP),
private :: PROF_PAPI_mflops = 0.0
89 integer,
private :: PROF_PAPI_check
92 character(len=7),
private :: PROF_header
93 character(len=16),
private :: PROF_item
94 real(DP),
private :: PROF_max
95 real(DP),
private :: PROF_min
96 real(DP),
private :: PROF_sum
106 namelist / param_prof / &
113 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[PROF] / Categ[COMMON] / Origin[SCALElib]' 119 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 120 elseif( ierr > 0 )
then 121 write(*,*)
'xxx Not appropriate names in namelist PARAM_PROF. Check!' 127 if(
io_l )
write(
io_fid_log,*)
'*** Rap output level = ', prof_rap_level
128 if(
io_l )
write(
io_fid_log,*)
'*** Add MPI_barrier in every rap? = ', prof_mpi_barrier
140 character(len=*),
intent(in) :: prefxname
144 if ( prefxname ==
'' )
then 147 prof_prefix = trim(prefxname)//
'_' 161 character(len=*),
intent(in) :: rapname_base
162 integer,
intent(in),
optional :: level
164 character(len=H_SHORT) :: rapname
170 if (
present(level) )
then 173 level_ = prof_default_rap_level
176 if( level_ > prof_rap_level )
return 178 rapname = trim(prof_prefix)//trim(rapname_base)
180 id = get_rapid( rapname, level_ )
185 prof_rapnstr(id) = prof_rapnstr(id) + 1
192 call fapp_start( trim(prof_grpname(get_grpid(rapname))), id, level_ )
195 call start_collection( rapname )
209 character(len=*),
intent(in) :: rapname_base
210 integer,
intent(in),
optional :: level
212 character(len=H_SHORT) :: rapname
218 if (
present(level) )
then 219 if( level > prof_rap_level )
return 222 rapname = trim(prof_prefix)//trim(rapname_base)
224 id = get_rapid( rapname, level_ )
226 if( level_ > prof_rap_level )
return 230 prof_rapttot(id) = prof_rapttot(id) + (
prc_mpitime()-prof_raptstr(id) )
231 prof_rapnend(id) = prof_rapnend(id) + 1
234 call stop_collection( rapname )
237 call fapp_stop( trim(prof_grpname(prof_grpid(id))), id, level_ )
251 real(DP) :: avgvar(prof_rapnlimit)
252 real(DP) :: maxvar(prof_rapnlimit)
253 real(DP) :: minvar(prof_rapnlimit)
254 integer :: maxidx(prof_rapnlimit)
255 integer :: minidx(prof_rapnlimit)
261 do id = 1, prof_rapnmax
262 if ( prof_rapnstr(id) /= prof_rapnend(id) )
then 263 write(*,*)
'*** Mismatch Report',id,prof_rapname(id),prof_rapnstr(id),prof_rapnend(id)
269 if(
io_l )
write(
io_fid_log,*)
'*** Rap level is ', prof_rap_level
273 do gid = 1, prof_rapnmax
274 do id = 1, prof_rapnmax
275 if ( prof_raplevel(id) <= prof_rap_level &
276 .AND. prof_grpid(id) == gid )
then 278 '*** ID=',id,
' : ',prof_rapname(id),
' T=',prof_rapttot(id),
' N=',prof_rapnstr(id)
286 maxvar(1:prof_rapnmax), &
287 minvar(1:prof_rapnmax), &
288 maxidx(1:prof_rapnmax), &
289 minidx(1:prof_rapnmax), &
290 prof_rapttot(1:prof_rapnmax) )
295 write(*,*)
'*** Computational Time Report' 302 do gid = 1, prof_rapnmax
303 do id = 1, prof_rapnmax
304 if ( prof_raplevel(id) <= prof_rap_level &
305 .AND. prof_grpid(id) == gid &
307 if(
io_l )
write(
io_fid_log,
'(1x,A,I3.3,3A,F10.3,A,F10.3,A,I5,2A,F10.3,A,I5,2A,I9)') &
308 '*** ID=',id,
' : ',prof_rapname(id), &
309 ' T(avg)=',avgvar(id), &
310 ', T(max)=',maxvar(id),
'[',maxidx(id),
']', &
311 ', T(min)=',minvar(id),
'[',minidx(id),
']', &
312 ' N=',prof_rapnstr(id)
325 subroutine prof_papi_rapstart
329 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
332 end subroutine prof_papi_rapstart
336 subroutine prof_papi_rapstop
340 call papif_flops( prof_papi_real_time, prof_papi_proc_time, prof_papi_flops, prof_papi_mflops, prof_papi_check )
343 end subroutine prof_papi_rapstop
347 subroutine prof_papi_rapreport
354 real(DP) :: avgvar(3)
355 real(DP) :: maxvar(3)
356 real(DP) :: minvar(3)
360 real(DP) :: prof_papi_gflop
361 real(DP) :: statistics(3)
364 prof_papi_gflop =
real(PROF_PAPI_flops,kind=8) / 1024.0_dp**3
369 if(
io_l )
write(
io_fid_log,*)
'*** PAPI Report [Local PE information]' 370 if(
io_l )
write(
io_fid_log,
'(1x,A,F15.3)')
'*** Real time [sec] : ', prof_papi_real_time
371 if(
io_l )
write(
io_fid_log,
'(1x,A,F15.3)')
'*** CPU time [sec] : ', prof_papi_proc_time
372 if(
io_l )
write(
io_fid_log,
'(1x,A,F15.3)')
'*** FLOP [GFLOP] : ', prof_papi_gflop
373 if(
io_l )
write(
io_fid_log,
'(1x,A,F15.3)')
'*** FLOPS by PAPI [GFLOPS] : ', prof_papi_mflops/1024.0_dp
374 if(
io_l )
write(
io_fid_log,
'(1x,A,F15.3)')
'*** FLOP / CPU Time [GFLOPS] : ', prof_papi_gflop/prof_papi_proc_time
377 statistics(1) =
real(prof_papi_real_time,kind=8)
378 statistics(2) =
real(prof_papi_proc_time,kind=8)
379 statistics(3) = prof_papi_gflop
390 if(
io_l )
write(
io_fid_log,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
391 '*** Real time [sec]',
' T(avg)=',avgvar(1), &
392 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']' 393 if(
io_l )
write(
io_fid_log,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
394 '*** CPU time [sec]',
' T(avg)=',avgvar(2), &
395 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']' 396 if(
io_l )
write(
io_fid_log,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
397 '*** FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
398 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']' 403 '*** FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs/maxvar(2)
405 '*** FLOPS per PE [GFLOPS] : ', avgvar(3)/maxvar(2)
411 write(*,*)
'*** PAPI Report' 412 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
413 '*** Real time [sec]',
' T(avg)=',avgvar(1), &
414 ', T(max)=',maxvar(1),
'[',maxidx(1),
']',
', T(min)=',minvar(1),
'[',minidx(1),
']' 415 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
416 '*** CPU time [sec]',
' T(avg)=',avgvar(2), &
417 ', T(max)=',maxvar(2),
'[',maxidx(2),
']',
', T(min)=',minvar(2),
'[',minidx(2),
']' 418 write(*,
'(1x,A,A,F10.3,A,F10.3,A,I5,A,A,F10.3,A,I5,A,A,I7)') &
419 '*** FLOP [GFLOP]',
' N(avg)=',avgvar(3), &
420 ', N(max)=',maxvar(3),
'[',maxidx(3),
']',
', N(min)=',minvar(3),
'[',minidx(3),
']' 422 write(*,
'(1x,A,F15.3,A,I6,A)') &
424 write(*,
'(1x,A,F15.3)') &
425 '*** FLOPS [GFLOPS] : ', avgvar(3)*
prc_nprocs/maxvar(2)
426 write(*,
'(1x,A,F15.3)') &
427 '*** FLOPS per PE [GFLOPS] : ', avgvar(3)/maxvar(2)
433 end subroutine prof_papi_rapreport
438 function get_rapid( rapname, level )
result(id)
441 character(len=*),
intent(in) :: rapname
442 integer,
intent(inout) :: level
444 character (len=H_SHORT) :: trapname
449 trapname = trim(rapname)
451 do id = 1, prof_rapnmax
452 if ( trapname == prof_rapname(id) )
then 453 level = prof_raplevel(id)
458 prof_rapnmax = prof_rapnmax + 1
460 prof_rapname(id) = trapname
464 prof_rapttot(id) = 0.0_dp
466 prof_grpid(id) = get_grpid(trapname)
467 prof_raplevel(id) = level
470 end function get_rapid
474 function get_grpid( rapname )
result(gid)
477 character(len=*),
intent(in) :: rapname
479 character(len=H_SHORT) :: grpname
485 idx = index(rapname,
" ")
487 grpname = rapname(1:idx-1)
492 do gid = 1, prof_grpnmax
493 if( grpname == prof_grpname(gid) )
return 496 prof_grpnmax = prof_grpnmax + 1
498 prof_grpname(gid) = grpname
501 end function get_grpid
504 subroutine prof_valcheck_sp_1d( &
510 character(len=*),
intent(in) :: header
511 character(len=*),
intent(in) :: varname
512 real(SP),
intent(in) :: var(:)
515 prof_header = trim(header)
516 prof_item = trim(varname)
517 prof_max =
real(maxval(var),kind=
dp)
518 prof_min =
real(minval(var),kind=
dp)
519 prof_sum =
real(sum (var),kind=
dp)
521 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
524 end subroutine prof_valcheck_sp_1d
527 subroutine prof_valcheck_sp_2d( &
533 character(len=*),
intent(in) :: header
534 character(len=*),
intent(in) :: varname
535 real(SP),
intent(in) :: var(:,:)
538 prof_header = trim(header)
539 prof_item = trim(varname)
540 prof_max =
real(maxval(var),kind=
dp)
541 prof_min =
real(minval(var),kind=
dp)
542 prof_sum =
real(sum (var),kind=
dp)
544 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
547 end subroutine prof_valcheck_sp_2d
550 subroutine prof_valcheck_sp_3d( &
556 character(len=*),
intent(in) :: header
557 character(len=*),
intent(in) :: varname
558 real(SP),
intent(in) :: var(:,:,:)
561 prof_header = trim(header)
562 prof_item = trim(varname)
563 prof_max =
real(maxval(var),kind=
dp)
564 prof_min =
real(minval(var),kind=
dp)
565 prof_sum =
real(sum (var),kind=
dp)
567 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
570 end subroutine prof_valcheck_sp_3d
573 subroutine prof_valcheck_sp_4d( &
579 character(len=*),
intent(in) :: header
580 character(len=*),
intent(in) :: varname
581 real(SP),
intent(in) :: var(:,:,:,:)
584 prof_header = trim(header)
585 prof_item = trim(varname)
586 prof_max =
real(maxval(var),kind=
dp)
587 prof_min =
real(minval(var),kind=
dp)
588 prof_sum =
real(sum (var),kind=
dp)
590 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
593 end subroutine prof_valcheck_sp_4d
596 subroutine prof_valcheck_sp_5d( &
602 character(len=*),
intent(in) :: header
603 character(len=*),
intent(in) :: varname
604 real(SP),
intent(in) :: var(:,:,:,:,:)
607 prof_header = trim(header)
608 prof_item = trim(varname)
609 prof_max =
real(maxval(var),kind=
dp)
610 prof_min =
real(minval(var),kind=
dp)
611 prof_sum =
real(sum (var),kind=
dp)
613 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
616 end subroutine prof_valcheck_sp_5d
619 subroutine prof_valcheck_sp_6d( &
625 character(len=*),
intent(in) :: header
626 character(len=*),
intent(in) :: varname
627 real(SP),
intent(in) :: var(:,:,:,:,:,:)
630 prof_header = trim(header)
631 prof_item = trim(varname)
632 prof_max =
real(maxval(var),kind=
dp)
633 prof_min =
real(minval(var),kind=
dp)
634 prof_sum =
real(sum (var),kind=
dp)
636 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
639 end subroutine prof_valcheck_sp_6d
642 subroutine prof_valcheck_dp_1d( &
648 character(len=*),
intent(in) :: header
649 character(len=*),
intent(in) :: varname
650 real(DP),
intent(in) :: var(:)
653 prof_header = trim(header)
654 prof_item = trim(varname)
655 prof_max =
real(maxval(var),kind=
dp)
656 prof_min =
real(minval(var),kind=
dp)
657 prof_sum =
real(sum (var),kind=
dp)
659 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
662 end subroutine prof_valcheck_dp_1d
665 subroutine prof_valcheck_dp_2d( &
671 character(len=*),
intent(in) :: header
672 character(len=*),
intent(in) :: varname
673 real(DP),
intent(in) :: var(:,:)
676 prof_header = trim(header)
677 prof_item = trim(varname)
678 prof_max =
real(maxval(var),kind=
dp)
679 prof_min =
real(minval(var),kind=
dp)
680 prof_sum =
real(sum (var),kind=
dp)
682 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
685 end subroutine prof_valcheck_dp_2d
688 subroutine prof_valcheck_dp_3d( &
694 character(len=*),
intent(in) :: header
695 character(len=*),
intent(in) :: varname
696 real(DP),
intent(in) :: var(:,:,:)
699 prof_header = trim(header)
700 prof_item = trim(varname)
701 prof_max =
real(maxval(var),kind=
dp)
702 prof_min =
real(minval(var),kind=
dp)
703 prof_sum =
real(sum (var),kind=
dp)
705 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
708 end subroutine prof_valcheck_dp_3d
711 subroutine prof_valcheck_dp_4d( &
717 character(len=*),
intent(in) :: header
718 character(len=*),
intent(in) :: varname
719 real(DP),
intent(in) :: var(:,:,:,:)
722 prof_header = trim(header)
723 prof_item = trim(varname)
724 prof_max =
real(maxval(var),kind=
dp)
725 prof_min =
real(minval(var),kind=
dp)
726 prof_sum =
real(sum (var),kind=
dp)
728 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
731 end subroutine prof_valcheck_dp_4d
734 subroutine prof_valcheck_dp_5d( &
740 character(len=*),
intent(in) :: header
741 character(len=*),
intent(in) :: varname
742 real(DP),
intent(in) :: var(:,:,:,:,:)
745 prof_header = trim(header)
746 prof_item = trim(varname)
747 prof_max =
real(maxval(var),kind=
dp)
748 prof_min =
real(minval(var),kind=
dp)
749 prof_sum =
real(sum (var),kind=
dp)
751 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
754 end subroutine prof_valcheck_dp_5d
757 subroutine prof_valcheck_dp_6d( &
763 character(len=*),
intent(in) :: header
764 character(len=*),
intent(in) :: varname
765 real(DP),
intent(in) :: var(:,:,:,:,:,:)
768 prof_header = trim(header)
769 prof_item = trim(varname)
770 prof_max =
real(maxval(var),kind=
dp)
771 prof_min =
real(minval(var),kind=
dp)
772 prof_sum =
real(sum (var),kind=
dp)
774 '+',prof_header,
'[',prof_item,
'] max=',prof_max,
',min=',prof_min,
',sum=',prof_sum
777 end subroutine prof_valcheck_dp_6d
subroutine, public prof_setup
logical, public prc_ismaster
master process in local communicator?
subroutine, public prc_mpistop
Abort MPI.
subroutine, public prof_setprefx(prefxname)
logical, public io_l
output log or not? (this process)
logical, public io_log_suppress
suppress all of log output?
logical, public io_nml
output log or not? (for namelist, this process)
subroutine, public prc_mpitimestat(avgvar, maxvar, minvar, maxidx, minidx, var)
Calc global statistics for timer.
logical, public io_log_allnode
output log for each node?
real(dp) function, public prc_mpitime()
Get MPI time.
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
integer, public io_fid_conf
Config file ID.
subroutine, public prc_mpibarrier
Barrier MPI.
integer, public io_fid_log
Log file ID.
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
integer, public prc_nprocs
myrank in local communicator
integer, parameter, public dp
integer, public io_fid_nml
Log file ID (only for output namelist)
subroutine, public prof_rapreport
Report raptime.