/** * \file imperative/src/impl/profiler.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include "megbrain/imperative/profiler.h" #include #include "megbrain/imperative/ops/opr_attr.h" #include "megbrain/imperative/physical_tensor.h" #include "megbrain/plugin/opr_footprint.h" #include "./function_hook.h" #include "./event_pool.h" #include "./op_trait.h" namespace mgb { namespace imperative { namespace { DeviceTimer::SharedEvent alloc_recorded_event(CompNode device) { auto event = EventPool::with_timer().alloc_shared(device); event->record(); return event; } } // namespace DeviceTimer::SharedEvent DeviceTimer::get_device_time(CompNode device) { return alloc_recorded_event(device); } SmallVector DeviceTimer::get_all(SmallVector device_list) { SmallVector results; for (auto&& device: device_list) { results.push_back(alloc_recorded_event(device)); } return results; } double HostTimer::get_msecs() { using namespace std::chrono; auto finish = steady_clock::now(); auto duration = duration_cast(finish - m_start); return (double)duration.count() / 1e3; } double HostTimer::get_started_at() { return m_started_at; } void HostTimer::reset() { using namespace std::chrono; m_start = steady_clock::now(); auto now_us = duration_cast(std::chrono::system_clock::now().time_since_epoch()); m_started_at = (double)(now_us.count()) / 1e3; } } // namespace imperative } // namespace mgb