123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /*
- * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of NVIDIA CORPORATION nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /**
- * @file
- * <b>NVIDIA Multimedia API: Application Resource Profiling API</b>
- *
- * @b Description: This file declares the NvApplicationProfiler API.
- */
- #ifndef __NV_PROFILER_H__
- #define __NV_PROFILER_H__
- #include <iostream>
- #include <pthread.h>
- #include <stdint.h>
- #include <sys/time.h>
- #include <time.h>
- /**
- *
- * Helper class for profiling the overall application
- * resource usage.
- *
- * NvApplicationProfiler spawns a background thread which periodically measures resource
- * usage. This sampling interval can be configured. Smaller sampling intervals
- * may lead to more accurate results but the background thread itself will
- * have a higher CPU usage.
- *
- * Only one instance of NvApplicationProfiler object gets created for the application.
- * It can be accessed using getProfilerInstance().
- *
- * NvApplicationProfiler currently samples CPU usage and provides peak and average CPU
- * usage during the profiling duration. It requires that the CPU frequency be
- * constant over the entire duration. To force this, NvApplicationProfiler will start only
- * when the CPU governor is set to @b performance.
- *
- * @defgroup l4t_mm_nvapplicationprofiler_group Application Resource Profiler API
- * @ingroup aa_framework_api_group
- * @{
- */
- class NvApplicationProfiler
- {
- public:
- /**
- * Holds the profiling data.
- */
- typedef struct
- {
- /** Total time for which the profiler ran or is running. */
- struct timeval total_time;
- /** Peak CPU usage during the profiling time. */
- float peak_cpu_usage;
- /** Average CPU usage over the entire profiling duration. */
- float avg_cpu_usage;
- /** Number of cpu cores. */
- uint32_t num_cpu_cores;
- /** Operating frequency of the cpu in MHz. */
- uint32_t cpu_freq_mhz;
- } NvAppProfilerData;
- static const uint64_t DefaultSamplingInterval = 100;
- /**
- * Gets a reference to the global #NvApplicationProfiler instance.
- *
- * @return A reference to the global NvApplicationProfiler instance.
- */
- static NvApplicationProfiler& getProfilerInstance();
- /**
- * Starts the profiler with the specified sampling interval.
- *
- * This method resets the internal profiler data measurements.
- *
- * Starting an already started profiler does nothing.
- *
- * @param[in] sampling_interval_ms Sampling interval in milliseconds.
- */
- void start(uint32_t sampling_interval_ms);
- /**
- * Stops the profiler.
- */
- void stop();
- /**
- * Prints the profiler data to an output stream.
- *
- * @param[in] outstream A reference to an output stream of type std::ostream.
- * std::cout if not specified.
- */
- void printProfilerData(std::ostream &outstream = std::cout);
- /**
- * Gets the profiler data.
- *
- * @param[out] data Pointer to the ProfilerData structure to be filled.
- */
- void getProfilerData(NvAppProfilerData &data);
- private:
- /**
- * Method run by the background profiling thread.
- *
- * Waits on a condition till the next periodic sampling time and calls
- * profile() for measurement.
- *
- * Runs in an infinite loop till signaled to stop.
- */
- static void * ProfilerThread(void *);
- bool running; /**< Boolean flag indicating if profiling thread is running. */
- uint32_t sampling_interval; /**< Interval between two measurements,
- in milliseconds. */
- pthread_mutex_t thread_lock; /**< Lock for synchronized multithreaded
- access to NvApplicationProfiler::data */
- pthread_t profiling_thread; /** ID of the profiling thread running in
- background */
- uint32_t num_cpu_cores; /**< Number of CPU cores. */
- uint32_t cpu_freq; /**< Operating frequency of CPU cores in MHz. */
- bool check_cpu_usage; /**< Flag indicating if cpu usage should be checked. */
- /**
- * Holds resource usage readings (internal use only).
- */
- struct ProfilerDataInternal
- {
- /** Wall-clock time at which profiler was started. */
- struct timeval start_time;
- /** Wall-clock time at which profiler was stopped. */
- struct timeval stop_time;
- /** CPU clock time occupied by the process when the
- * profiler was started. */
- struct timespec start_proc_cpu_clock_time;
- /** Total CPU clock time when the profiler was started. */
- struct timespec start_cpu_clock_time;
- /** CPU clock time occupied by the process when the
- * latest readings were taken. */
- struct timespec stop_proc_cpu_clock_time;
- /** Total CPU clock time when the latest readings were taken. */
- struct timespec stop_cpu_clock_time;
- /** Maximum of CPU usages of all sampled periods. */
- float max_cpu_usage;
- /** Minimum of CPU usages of all sampled periods. */
- float min_cpu_usage;
- /** Average CPU usage over the entire profiling duration. */
- float avg_cpu_usage;
- /** Number of readings taken. */
- uint64_t num_readings;
- } data; /**< Internal structure to hold intermediate measurements. */
- /**
- * Measures resource usage parameters.
- */
- void profile();
- /**
- * Default constructor used by getProfilerInstance.
- */
- NvApplicationProfiler();
- /**
- * Disallows copy constructor.
- */
- NvApplicationProfiler(const NvApplicationProfiler& that);
- /**
- * Disallows assignment.
- */
- void operator=(NvApplicationProfiler const&);
- };
- /** @} */
- #endif
|