#ifndef CAFFE2_CORE_NET_SIMPLE_H_ #define CAFFE2_CORE_NET_SIMPLE_H_ #include #include "c10/util/Registry.h" #include "caffe2/core/common.h" #include "caffe2/core/logging.h" #include "caffe2/core/net.h" #include "caffe2/core/tensor.h" #include "caffe2/core/workspace.h" #include "caffe2/proto/caffe2_pb.h" namespace caffe2 { struct IndividualMetrics { public: explicit IndividualMetrics(const std::vector& operators) : main_runs_(0), operators_(operators) { const auto num_ops = operators_.size(); time_per_op.resize(num_ops, 0.0); } // run ops while collecting profiling results void RunOpsWithProfiling(); // print out profiling results void PrintOperatorProfilingResults(); const vector& GetTimePerOp() { return time_per_op; } float setup_time{0.0}; float memory_alloc_time{0.0}; float memory_dealloc_time{0.0}; float output_dealloc_time{0.0}; private: int main_runs_; const std::vector& operators_; vector time_per_op; vector flops_per_op; vector memory_bytes_read_per_op; vector memory_bytes_written_per_op; vector param_bytes_per_op; CaffeMap num_ops_per_op_type_; CaffeMap time_per_op_type; CaffeMap flops_per_op_type; CaffeMap memory_bytes_read_per_op_type; CaffeMap memory_bytes_written_per_op_type; CaffeMap param_bytes_per_op_type; }; // This is the very basic structure you need to run a network - all it // does is simply to run everything in sequence. If you want more fancy control // such as a DAG-like execution, check out other better net implementations. class TORCH_API SimpleNet : public NetBase { public: SimpleNet(const std::shared_ptr& net_def, Workspace* ws); bool SupportsAsync() override { return false; } vector TEST_Benchmark( const int warmup_runs, const int main_runs, const bool run_individual) override; /* * This returns a list of pointers to objects stored in unique_ptrs. * Used by Observers. * * Think carefully before using. */ vector GetOperators() const override { vector op_list; for (auto& op : operators_) { op_list.push_back(op.get()); } return op_list; } protected: bool Run() override; bool RunAsync() override; vector> operators_; C10_DISABLE_COPY_AND_ASSIGN(SimpleNet); }; } // namespace caffe2 #endif // CAFFE2_CORE_NET_SIMPLE_H_