123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // Copyright (c) 2018 Google LLC.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- #if defined(SPIRV_TIMER_ENABLED)
- #include "source/util/timer.h"
- #include <sys/resource.h>
- #include <sys/time.h>
- #include <iomanip>
- #include <iostream>
- #include <string>
- namespace spvtools {
- namespace utils {
- void PrintTimerDescription(std::ostream* out, bool measure_mem_usage) {
- if (out) {
- *out << std::setw(30) << "PASS name" << std::setw(12) << "CPU time"
- << std::setw(12) << "WALL time" << std::setw(12) << "USR time"
- << std::setw(12) << "SYS time";
- if (measure_mem_usage) {
- *out << std::setw(12) << "RSS delta" << std::setw(16) << "PGFault delta";
- }
- *out << std::endl;
- }
- }
- // Do not change the order of invoking system calls. We want to make CPU/Wall
- // time correct as much as possible. Calling functions to get CPU/Wall time must
- // closely surround the target code of measuring.
- void Timer::Start() {
- if (report_stream_) {
- if (getrusage(RUSAGE_SELF, &usage_before_) == -1)
- usage_status_ |= kGetrusageFailed;
- if (clock_gettime(CLOCK_MONOTONIC, &wall_before_) == -1)
- usage_status_ |= kClockGettimeWalltimeFailed;
- if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_before_) == -1)
- usage_status_ |= kClockGettimeCPUtimeFailed;
- }
- }
- // The order of invoking system calls is important with the same reason as
- // Timer::Start().
- void Timer::Stop() {
- if (report_stream_ && usage_status_ == kSucceeded) {
- if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_after_) == -1)
- usage_status_ |= kClockGettimeCPUtimeFailed;
- if (clock_gettime(CLOCK_MONOTONIC, &wall_after_) == -1)
- usage_status_ |= kClockGettimeWalltimeFailed;
- if (getrusage(RUSAGE_SELF, &usage_after_) == -1)
- usage_status_ = kGetrusageFailed;
- }
- }
- void Timer::Report(const char* tag) {
- if (!report_stream_) return;
- report_stream_->precision(2);
- *report_stream_ << std::fixed << std::setw(30) << tag;
- if (usage_status_ & kClockGettimeCPUtimeFailed)
- *report_stream_ << std::setw(12) << "Failed";
- else
- *report_stream_ << std::setw(12) << CPUTime();
- if (usage_status_ & kClockGettimeWalltimeFailed)
- *report_stream_ << std::setw(12) << "Failed";
- else
- *report_stream_ << std::setw(12) << WallTime();
- if (usage_status_ & kGetrusageFailed) {
- *report_stream_ << std::setw(12) << "Failed" << std::setw(12) << "Failed";
- if (measure_mem_usage_) {
- *report_stream_ << std::setw(12) << "Failed" << std::setw(12) << "Failed";
- }
- } else {
- *report_stream_ << std::setw(12) << UserTime() << std::setw(12)
- << SystemTime();
- if (measure_mem_usage_) {
- *report_stream_ << std::fixed << std::setw(12) << RSS() << std::setw(16)
- << PageFault();
- }
- }
- *report_stream_ << std::endl;
- }
- } // namespace utils
- } // namespace spvtools
- #endif // defined(SPIRV_TIMER_ENABLED)
|