MAPL_Profiler.F90 Source File


This file depends on

AbstractColumn.F90wMAPL_Profiler.F90
w
AbstractMeter.F90w
w
AbstractMeterFactory.F90w
w
AbstractMeterNode.F90w
w
AdvancedMeter.F90w
w
BaseProfiler.F90w
w
DistributedMeter.F90w
w
DistributedProfiler.F90w
w
ErrorHandling.F90w
w
ExclusiveColumn.F90w
w
FormattedTextColumn.F90w
w
FortranTimerGauge.F90w
w
GlobalProfilers.F90w
w
InclusiveColumn.F90w
w
KeywordEnforcer.F90w
w
MaxCycleColumn.F90w
w
MeanCycleColumn.F90w
w
MemoryProfiler.F90w
w
MemoryTextColumn.F90w
w
MeterNode.F90w
w
MeterNodeVector.F90w
w
MinCycleColumn.F90w
w
MpiTimerGauge.F90w
w
MultiColumn.F90w
w
NameColumn.F90w
w
NumCyclesColumn.F90w
w
PercentageColumn.F90w
w
pflogger_stub.F90w
w
ProfileReporter.F90w
w
RssMemoryGauge.F90w
w
SeparatorColumn.F90w
w
SimpleColumn.F90w
w
SimpleTextColumn.F90w
w
StdDevColumn.F90w
w
TextColumn.F90w
w
TextColumnVector.F90w
w
TimeProfiler.F90w
w
VmstatMemoryGauge.F90w
w

Files dependent on this one

sourcefile~~mapl_profiler.f90~~AfferentGraph sourcefile~mapl_profiler.f90 MAPL_Profiler.F90 sourcefile~abstractserver.f90 AbstractServer.F90 sourcefile~abstractserver.f90->sourcefile~mapl_profiler.f90 sourcefile~applicationsupport.f90 ApplicationSupport.F90 sourcefile~applicationsupport.f90->sourcefile~mapl_profiler.f90 sourcefile~base_base_implementation.f90 Base_Base_implementation.F90 sourcefile~base_base_implementation.f90->sourcefile~mapl_profiler.f90 sourcefile~demo.f90 demo.F90 sourcefile~demo.f90->sourcefile~mapl_profiler.f90 sourcefile~extdatadrivergridcomp.f90 ExtDataDriverGridComp.F90 sourcefile~extdatadrivergridcomp.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl.f90 MAPL.F90 sourcefile~mapl.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl_bundleio_test.f90 mapl_bundleio_test.F90 sourcefile~mapl_bundleio_test.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl_capgridcomp.f90 MAPL_CapGridComp.F90 sourcefile~mapl_capgridcomp.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl_generic.f90 MAPL_Generic.F90 sourcefile~mapl_generic.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl_nuopcwrappermod.f90 MAPL_NUOPCWrapperMod.F90 sourcefile~mapl_nuopcwrappermod.f90->sourcefile~mapl_profiler.f90 sourcefile~mapl_verticalmethods.f90 MAPL_VerticalMethods.F90 sourcefile~mapl_verticalmethods.f90->sourcefile~mapl_profiler.f90 sourcefile~maplframework.f90 MaplFramework.F90 sourcefile~maplframework.f90->sourcefile~mapl_profiler.f90 sourcefile~mpi_demo.f90 mpi_demo.F90 sourcefile~mpi_demo.f90->sourcefile~mapl_profiler.f90 sourcefile~mpiserver.f90 MpiServer.F90 sourcefile~mpiserver.f90->sourcefile~mapl_profiler.f90 sourcefile~multigroupserver.f90 MultiGroupServer.F90 sourcefile~multigroupserver.f90->sourcefile~mapl_profiler.f90 sourcefile~regrid_util.f90 Regrid_Util.F90 sourcefile~regrid_util.f90->sourcefile~mapl_profiler.f90 sourcefile~serverthread.f90 ServerThread.F90 sourcefile~serverthread.f90->sourcefile~mapl_profiler.f90 sourcefile~test_advancedmeter.pf test_AdvancedMeter.pf sourcefile~test_advancedmeter.pf->sourcefile~mapl_profiler.f90 sourcefile~test_column.pf test_Column.pf sourcefile~test_column.pf->sourcefile~mapl_profiler.f90 sourcefile~test_distributedmeter.pf test_DistributedMeter.pf sourcefile~test_distributedmeter.pf->sourcefile~mapl_profiler.f90 sourcefile~test_exclusivecolumn.pf test_ExclusiveColumn.pf sourcefile~test_exclusivecolumn.pf->sourcefile~mapl_profiler.f90 sourcefile~test_meternode.pf test_MeterNode.pf sourcefile~test_meternode.pf->sourcefile~mapl_profiler.f90 sourcefile~test_meternodeiterator.pf test_MeterNodeIterator.pf sourcefile~test_meternodeiterator.pf->sourcefile~mapl_profiler.f90 sourcefile~test_namecolumn.pf test_NameColumn.pf sourcefile~test_namecolumn.pf->sourcefile~mapl_profiler.f90 sourcefile~test_percentagecolumn.pf test_PercentageColumn.pf sourcefile~test_percentagecolumn.pf->sourcefile~mapl_profiler.f90 sourcefile~test_profilereporter.pf test_ProfileReporter.pf sourcefile~test_profilereporter.pf->sourcefile~mapl_profiler.f90 sourcefile~test_timeprofiler.pf test_TimeProfiler.pf sourcefile~test_timeprofiler.pf->sourcefile~mapl_profiler.f90

Source Code

#include "MAPL_ErrLog.h"

! Package exporter
module mapl_Profiler
   use mapl_AbstractMeter
   use mapl_AbstractMeterNode
   use mapl_AbstractMeterFactory
   use mapl_MeterNodeVector
   use mapl_MeterNode
   use mapl_BaseProfiler

   use mapl_AdvancedMeter
   use mapl_MpiTimerGauge
   use mapl_FortranTimerGauge
   use mapl_RssMemoryGauge
   use mapl_VmstatMemoryGauge

   use mapl_DistributedMeter
   use mapl_DistributedProfiler
   use mapl_TimeProfiler
   use mapl_MemoryProfiler

   use mapl_ProfileReporter
   use mapl_AbstractColumn
   use mapl_SimpleColumn
   use mapl_TextColumn
   use mapl_SimpleTextColumn
   use mapl_FormattedTextColumn
   use mapl_MemoryTextColumn
   use mapl_NameColumn
   use mapl_NumCyclesColumn
   use mapl_InclusiveColumn
   use mapl_ExclusiveColumn
   use mapl_StdDevColumn
   use mapl_MinCycleColumn
   use mapl_MaxCycleColumn
   use mapl_MeanCycleColumn
   use mapl_PercentageColumn
   use mapl_TextColumnVector
   use mapl_MultiColumn
   use mapl_SeparatorColumn
   use mapl_GlobalProfilers

   implicit none

contains

   subroutine initialize(comm, unusable, enable_global_timeprof, enable_global_memprof, rc)
      use mapl_ErrorHandlingMod
      use mapl_KeywordEnforcerMod
      integer, optional, intent(in) :: comm
      class(KeywordEnforcer), optional, intent(in) :: unusable
      logical, optional, intent(in) ::  enable_global_timeprof
      logical, optional, intent(in) ::  enable_global_memprof
      integer, optional, intent(out) :: rc

      integer :: status

      call initialize_global_time_profiler(name='All', comm=comm, enabled=enable_global_timeprof, _RC)
      call initialize_global_memory_profiler(name='All', comm=comm, enabled=enable_global_memprof, _RC)

      _RETURN(_SUCCESS)
      _UNUSED_DUMMY(unusable)
   end subroutine initialize

   subroutine finalize(unusable, rc)
      use mapl_KeywordEnforcerMod
      use mapl_ErrorHandlingMod
      class(KeywordEnforcer), optional, intent(in) :: unusable
      integer, optional, intent(out) :: rc

      class(DistributedProfiler), pointer :: t_p, m_p

      integer :: status

      t_p => get_global_time_profiler()
      call t_p%stop(_RC)
      m_p => get_global_memory_profiler()
      call m_p%stop(_RC)

      call report_global_profiler()

      _RETURN(_SUCCESS)
      _UNUSED_DUMMY(unusable)

   end subroutine finalize

   subroutine report_global_profiler(unusable,comm,rc)
      use mapl_KeywordEnforcerMod
      use mapl_ErrorHandlingMod
      use mpi
      use pflogger, only: logging
      use pflogger, only: Logger

      class (KeywordEnforcer), optional, intent(in) :: unusable
      integer, optional, intent(in) :: comm
      integer, optional, intent(out) :: rc
      type (ProfileReporter) :: reporter
      integer :: i, world_comm
      character(:), allocatable :: report_lines(:)
      type (MultiColumn) :: inclusive
      type (MultiColumn) :: exclusive
      integer :: npes, my_rank, ierror
      character(1) :: empty(0)
      class (BaseProfiler), pointer :: t_p
      class (BaseProfiler), pointer :: m_p
      type(Logger), pointer :: lgr

      if (present(comm)) then
         world_comm = comm
      else
         world_comm=MPI_COMM_WORLD
      end if

      call MPI_Comm_size(world_comm, npes, ierror)
      _VERIFY(ierror)
      call MPI_Comm_Rank(world_comm, my_rank, ierror)
      _VERIFY(ierror)


      t_p => get_global_time_profiler()
      if (t_p%get_num_meters() > 0) then
         reporter = ProfileReporter(empty)
         call reporter%add_column(NameColumn(50, separator= " "))
         call reporter%add_column(FormattedTextColumn('#-cycles','(i8.0)', 8, NumCyclesColumn(),separator='-'))

         inclusive = MultiColumn(['Inclusive'], separator='=')
         call inclusive%add_column(FormattedTextColumn(' T (sec) ','(f9.3)', 9, InclusiveColumn(), separator='-'))
         call inclusive%add_column(FormattedTextColumn('   %  ','(f6.2)', 6, PercentageColumn(InclusiveColumn(),'MAX'),separator='-'))
         call reporter%add_column(inclusive)

         exclusive = MultiColumn(['Exclusive'], separator='=')
         call exclusive%add_column(FormattedTextColumn(' T (sec) ','(f9.3)', 9, ExclusiveColumn(), separator='-'))
         call exclusive%add_column(FormattedTextColumn('   %  ','(f6.2)', 6, PercentageColumn(ExclusiveColumn()), separator='-'))
         call reporter%add_column(exclusive)

         if (my_rank == 0) then
            report_lines = reporter%generate_report(t_p)
            lgr => logging%get_logger('MAPL.profiler')
            call lgr%info('Report on process: %i0', my_rank)
            do i = 1, size(report_lines)
               call lgr%info('%a', report_lines(i))
            end do
         end if
      end if

      m_p => get_global_memory_profiler()
      if (m_p%get_num_meters() > 0) then
         reporter = ProfileReporter(empty)
         call reporter%add_column(NameColumn(50, separator= " "))

         inclusive = MultiColumn(['Inclusive'], separator='=')
         call inclusive%add_column(MemoryTextColumn(['  MEM  '],'(i4,1x,a2)', 9, InclusiveColumn(), separator='-'))
!!$      call inclusive%add_column(FormattedTextColumn('   %  ','(f6.2)', 6, PercentageColumn(InclusiveColumn()), separator='-'))
         call reporter%add_column(inclusive)

         exclusive = MultiColumn(['Exclusive'], separator='=')
         call exclusive%add_column(MemoryTextColumn(['  MEM  '],'(i4,1x,a2)', 9, ExclusiveColumn(), separator='-'))
         call exclusive%add_column(FormattedTextColumn(' MEM (KB)','(-3p,f15.3, 0p)', 15, ExclusiveColumn(), separator='-'))
!!$      call exclusive%add_column(FormattedTextColumn('   %  ','(f6.2)', 6, PercentageColumn(ExclusiveColumn()), separator='-'))
         call reporter%add_column(exclusive)

         if (my_rank == 0) then
            report_lines = reporter%generate_report(m_p)
            lgr => logging%get_logger('MAPL.profiler')
            do i = 1, size(report_lines)
               call lgr%info('%a', report_lines(i))
            end do
         end if
      end if

      call MPI_Barrier(world_comm, ierror)
      _VERIFY(ierror)

      _RETURN(_SUCCESS)
      _UNUSED_DUMMY(unusable)
   end subroutine report_global_profiler

end module mapl_Profiler