From 7ebe47ac5d1f0255527a27a9bb7cd3c29fa9f6e3 Mon Sep 17 00:00:00 2001 From: Mahmoud Date: Tue, 26 May 2020 15:12:38 -0400 Subject: splitting the trace-diven from the gpgpu-sim --- src/trace-driven/ISA_Def/trace_opcode.h | 1 - src/trace-driven/trace_driven.cc | 46 ++++++++++++++++++--------------- src/trace-driven/trace_driven.h | 26 ++++++++++--------- 3 files changed, 39 insertions(+), 34 deletions(-) (limited to 'src/trace-driven') diff --git a/src/trace-driven/ISA_Def/trace_opcode.h b/src/trace-driven/ISA_Def/trace_opcode.h index e68be45..5675957 100644 --- a/src/trace-driven/ISA_Def/trace_opcode.h +++ b/src/trace-driven/ISA_Def/trace_opcode.h @@ -218,7 +218,6 @@ enum TraceInstrOpcode { }; typedef enum TraceInstrOpcode sass_op_type; - struct OpcodeChar { OpcodeChar(unsigned m_opcode, unsigned m_opcode_category) { opcode = m_opcode; diff --git a/src/trace-driven/trace_driven.cc b/src/trace-driven/trace_driven.cc index 44468b1..8fa63b4 100644 --- a/src/trace-driven/trace_driven.cc +++ b/src/trace-driven/trace_driven.cc @@ -173,7 +173,7 @@ void trace_parser::kernel_finalizer(trace_kernel_info_t* kernel_info) { delete kernel_info; } -const trace_warp_inst_t* trace_shd_warp_t::get_next_inst() { +const trace_warp_inst_t* trace_shd_warp_t::get_next_trace_inst() { if (trace_pc < warp_traces.size()) { return &warp_traces[trace_pc++]; } else @@ -188,7 +188,7 @@ void trace_shd_warp_t::clear() { // functional_done bool trace_shd_warp_t::trace_done() { return trace_pc == (warp_traces.size()); } -address_type trace_shd_warp_t::get_start_pc() { +address_type trace_shd_warp_t::get_start_trace_pc() { assert(warp_traces.size() > 0); return warp_traces[0].pc; } @@ -629,43 +629,46 @@ void trace_config::set_latency(unsigned category, unsigned& latency, } } -unsigned trace_shader_core_ctx::trace_sim_inc_thread(kernel_info_t& kernel) { - if (kernel.no_more_ctas_to_run()) { - return 0; // finished! - } - - if (kernel.more_threads_in_cta()) { - kernel.increment_thread_id(); - } +void trace_shader_core_ctx::init_warps(unsigned cta_id, unsigned start_thread, + unsigned end_thread, unsigned ctaid, + int cta_size, kernel_info_t& kernel) { + // call base class + shader_core_ctx::init_warps(cta_id, start_thread, end_thread, ctaid, cta_size, + kernel); - if (!kernel.more_threads_in_cta()) kernel.increment_cta_id(); + // then init traces + unsigned start_warp = start_thread / m_config->warp_size; + unsigned end_warp = end_thread / m_config->warp_size + + ((end_thread % m_config->warp_size) ? 1 : 0); - return 1; + init_traces(start_warp, end_warp, kernel); } void trace_shader_core_ctx::init_traces(unsigned start_warp, unsigned end_warp, kernel_info_t& kernel) { std::vector*> threadblock_traces; for (unsigned i = start_warp; i < end_warp; ++i) { - m_trace_warp[i].clear(); - threadblock_traces.push_back(&(m_trace_warp[i].warp_traces)); + trace_shd_warp_t* m_trace_warp = static_cast(m_warp[i]); + m_trace_warp->clear(); + threadblock_traces.push_back(&(m_trace_warp->warp_traces)); } trace_kernel_info_t& trace_kernel = static_cast(kernel); trace_kernel.get_next_threadblock_traces(threadblock_traces); - // set pc + // set the pc from the traces and ignore the functional model for (unsigned i = start_warp; i < end_warp; ++i) { - m_warp[i].set_next_pc(m_trace_warp[i].get_start_pc()); + trace_shd_warp_t* m_trace_warp = static_cast(m_warp[i]); + m_trace_warp->set_next_pc(m_trace_warp->get_start_trace_pc()); } } void trace_shader_core_ctx::checkExecutionStatusAndUpdate(warp_inst_t& inst, unsigned t, unsigned tid) { - if (inst.isatomic()) m_warp[inst.warp_id()].inc_n_atomic(); + if (inst.isatomic()) m_warp[inst.warp_id()]->inc_n_atomic(); if (inst.op == EXIT_OPS) { - m_warp[inst.warp_id()].set_completed(t); + m_warp[inst.warp_id()]->set_completed(t); } } @@ -683,9 +686,10 @@ void trace_shader_core_ctx::func_exec_inst(warp_inst_t& inst) { checkExecutionStatusAndUpdate(inst, t, tid); } } - if (m_trace_warp[inst.warp_id()].trace_done() && - m_warp[inst.warp_id()].functional_done()) { - m_warp[inst.warp_id()].ibuffer_flush(); + trace_shd_warp_t* m_trace_warp = + static_cast(m_warp[inst.warp_id()]); + if (m_trace_warp->trace_done() && m_trace_warp->functional_done()) { + m_trace_warp->ibuffer_flush(); m_barriers.warp_exit(inst.warp_id()); } } diff --git a/src/trace-driven/trace_driven.h b/src/trace-driven/trace_driven.h index 09a2527..a35cd83 100644 --- a/src/trace-driven/trace_driven.h +++ b/src/trace-driven/trace_driven.h @@ -112,16 +112,19 @@ class trace_parser { gpgpu_context* m_gpgpu_context; }; -class trace_shd_warp_t { +class trace_shd_warp_t : public shd_warp_t { public: - trace_shd_warp_t() { trace_pc = 0; } + trace_shd_warp_t(class shader_core_ctx* shader, unsigned warp_size) + : shd_warp_t(shader, warp_size) { + trace_pc = 0; + } std::vector warp_traces; - const trace_warp_inst_t* get_next_inst(); + const trace_warp_inst_t* get_next_trace_inst(); void clear(); bool trace_done(); - address_type get_start_pc(); - address_type get_pc(); + address_type get_start_trace_pc(); + virtual address_type get_pc(); private: unsigned trace_pc; @@ -135,20 +138,19 @@ class trace_shader_core_ctx : public shader_core_ctx { const memory_config* mem_config, shader_core_stats* stats) : shader_core_ctx(gpu, cluster, shader_id, tpc_id, config, mem_config, - stats) { - m_trace_warp.resize(get_config()->max_warps_per_shader); - } + stats) {} virtual void checkExecutionStatusAndUpdate(warp_inst_t& inst, unsigned t, unsigned tid); - void init_traces(unsigned start_warp, unsigned end_warp, - kernel_info_t& kernel); - unsigned trace_sim_inc_thread(kernel_info_t& kernel); + virtual void init_warps(unsigned cta_id, unsigned start_thread, + unsigned end_thread, unsigned ctaid, int cta_size, + kernel_info_t& kernel); virtual void func_exec_inst(warp_inst_t& inst); friend class shader_core_ctx; private: - std::vector m_trace_warp; + void init_traces(unsigned start_warp, unsigned end_warp, + kernel_info_t& kernel); }; #endif -- cgit v1.3