//developed by Mahmoud Khairy, Purdue Univ #include #include #include #ifndef TRACE_DRIVEN_H #define TRACE_DRIVEN_H #include "../abstract_hardware_model.h" #include "../gpgpu-sim/shader.h" class trace_function_info: public function_info { public: trace_function_info(const struct gpgpu_ptx_sim_info &info, gpgpu_context* m_gpgpu_context):function_info(0, m_gpgpu_context ) { m_kernel_info = info; } virtual const struct gpgpu_ptx_sim_info* get_kernel_info () const { return &m_kernel_info; } virtual const void set_kernel_info (const struct gpgpu_ptx_sim_info &info) { m_kernel_info = info; } private: }; class trace_warp_inst_t: public warp_inst_t { public: trace_warp_inst_t() { } trace_warp_inst_t(const class core_config *config, gpgpu_context* gpgpu_context ):warp_inst_t(config) { m_gpgpu_context = gpgpu_context; m_opcode=0; } bool parse_from_string(std::string trace); private: void set_latency(unsigned cat); gpgpu_context* m_gpgpu_context; unsigned m_opcode; }; class trace_kernel_info_t: public kernel_info_t { public: trace_kernel_info_t(dim3 gridDim, dim3 blockDim, trace_function_info* m_function_info, std::ifstream* inputstream, gpgpu_sim * gpgpu_sim, gpgpu_context* gpgpu_context):kernel_info_t(gridDim, blockDim, m_function_info) { ifs = inputstream; m_gpgpu_sim = gpgpu_sim; m_gpgpu_context = gpgpu_context; } bool get_next_threadblock_traces(std::vector>& threadblock_traces); private: std::ifstream* ifs; gpgpu_sim * m_gpgpu_sim; gpgpu_context* m_gpgpu_context; }; class trace_parser { public: trace_parser(const char* kernellist_filepath, gpgpu_sim * m_gpgpu_sim, gpgpu_context* m_gpgpu_context); std::vector parse_kernellist_file(); trace_kernel_info_t* parse_kernel_info(const std::string& kerneltraces_filepath); void kernel_finalizer(trace_kernel_info_t* kernel_info); private: std::string kernellist_filename; std::ifstream ifs; gpgpu_sim * m_gpgpu_sim; gpgpu_context* m_gpgpu_context; }; class trace_shd_warp_t: public shd_warp_t { public: trace_shd_warp_t(class shader_core_ctx *shader, unsigned warp_size):shd_warp_t(shader, warp_size) { } bool get_next_threadblock_traces(std::vector>& threadblock_traces); private: }; #endif