CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
87 lines
2.2 KiB
C++
87 lines
2.2 KiB
C++
#ifndef BENCHMARK_THREAD_TIMER_H
|
|
#define BENCHMARK_THREAD_TIMER_H
|
|
|
|
#include "check.h"
|
|
#include "timers.h"
|
|
|
|
namespace benchmark {
|
|
namespace internal {
|
|
|
|
class ThreadTimer {
|
|
explicit ThreadTimer(bool measure_process_cpu_time_)
|
|
: measure_process_cpu_time(measure_process_cpu_time_) {}
|
|
|
|
public:
|
|
static ThreadTimer Create() {
|
|
return ThreadTimer(/*measure_process_cpu_time_=*/false);
|
|
}
|
|
static ThreadTimer CreateProcessCpuTime() {
|
|
return ThreadTimer(/*measure_process_cpu_time_=*/true);
|
|
}
|
|
|
|
// Called by each thread
|
|
void StartTimer() {
|
|
running_ = true;
|
|
start_real_time_ = ChronoClockNow();
|
|
start_cpu_time_ = ReadCpuTimerOfChoice();
|
|
}
|
|
|
|
// Called by each thread
|
|
void StopTimer() {
|
|
BM_CHECK(running_);
|
|
running_ = false;
|
|
real_time_used_ += ChronoClockNow() - start_real_time_;
|
|
// Floating point error can result in the subtraction producing a negative
|
|
// time. Guard against that.
|
|
cpu_time_used_ +=
|
|
std::max<double>(ReadCpuTimerOfChoice() - start_cpu_time_, 0);
|
|
}
|
|
|
|
// Called by each thread
|
|
void SetIterationTime(double seconds) { manual_time_used_ += seconds; }
|
|
|
|
bool running() const { return running_; }
|
|
|
|
// REQUIRES: timer is not running
|
|
double real_time_used() const {
|
|
BM_CHECK(!running_);
|
|
return real_time_used_;
|
|
}
|
|
|
|
// REQUIRES: timer is not running
|
|
double cpu_time_used() const {
|
|
BM_CHECK(!running_);
|
|
return cpu_time_used_;
|
|
}
|
|
|
|
// REQUIRES: timer is not running
|
|
double manual_time_used() const {
|
|
BM_CHECK(!running_);
|
|
return manual_time_used_;
|
|
}
|
|
|
|
private:
|
|
double ReadCpuTimerOfChoice() const {
|
|
if (measure_process_cpu_time) return ProcessCPUUsage();
|
|
return ThreadCPUUsage();
|
|
}
|
|
|
|
// should the thread, or the process, time be measured?
|
|
const bool measure_process_cpu_time;
|
|
|
|
bool running_ = false; // Is the timer running
|
|
double start_real_time_ = 0; // If running_
|
|
double start_cpu_time_ = 0; // If running_
|
|
|
|
// Accumulated time so far (does not contain current slice if running_)
|
|
double real_time_used_ = 0;
|
|
double cpu_time_used_ = 0;
|
|
// Manually set iteration time. User sets this with SetIterationTime(seconds).
|
|
double manual_time_used_ = 0;
|
|
};
|
|
|
|
} // namespace internal
|
|
} // namespace benchmark
|
|
|
|
#endif // BENCHMARK_THREAD_TIMER_H
|