From bb820c116764d7a1b8e071137d32b74e7f34dd2f Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Mon, 30 Aug 2010 11:05:15 -0800 Subject: integrating CL 7421-7434 from fermi-test this integrates the ptxplus functional model changes, but has only been verified with CUDA 3.1 PTX regressions (which pass) still need to verify ptxplus itself is working in this branch [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7435] --- src/cuda-sim/ptx_sim.cc | 86 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 18 deletions(-) (limited to 'src/cuda-sim/ptx_sim.cc') diff --git a/src/cuda-sim/ptx_sim.cc b/src/cuda-sim/ptx_sim.cc index 685aedb..6dea2e3 100644 --- a/src/cuda-sim/ptx_sim.cc +++ b/src/cuda-sim/ptx_sim.cc @@ -238,6 +238,8 @@ ptx_thread_info::ptx_thread_info() m_last_dram_callback.function = NULL; m_last_dram_callback.instruction = NULL; m_regs.push_back( reg_map_t() ); + m_debug_trace_regs_modified.push_back( reg_map_t() ); + m_debug_trace_regs_read.push_back( reg_map_t() ); m_callstack.push_back( stack_entry() ); m_RPC = -1; m_RPC_updated = false; @@ -266,7 +268,12 @@ unsigned ptx_thread_info::get_builtin( int builtin_id, unsigned dim_mod ) return (unsigned)(gpu_sim_cycle + gpu_tot_sim_cycle); case CLOCK64_REG: abort(); // change return value to unsigned long long? - return gpu_sim_cycle + gpu_tot_sim_cycle; + // GPGPUSim clock is 4 times slower - multiply by 4 + return (gpu_sim_cycle + gpu_tot_sim_cycle)*4; + case HALFCLOCK_ID: + // GPGPUSim clock is 4 times slower - multiply by 4 + // Hardware clock counter is incremented at half the shader clock frequency - divide by 2 (Henry '10) + return (gpu_sim_cycle + gpu_tot_sim_cycle)*2; case CTAID_REG: assert( dim_mod < 3 ); return m_ctaid[dim_mod]; @@ -305,6 +312,18 @@ void ptx_thread_info::set_info( function_info *func ) m_PC = func->get_start_PC(); } +void ptx_thread_info::cpy_tid_to_reg( int x, int y, int z) +{ + //copies %tid.x, %tid.y and %tid.z into $r0 + ptx_reg_t data; + data.s64=0; + + data.u32=(x + (y<<16) + (z<<26)); + + const symbol *r0 = m_symbol_table->lookup("$r0"); + set_reg(r0,data); +} + void ptx_thread_info::print_insn( unsigned pc, FILE * fp ) const { m_func_info->print_insn(pc,fp); @@ -346,6 +365,7 @@ static void print_reg( FILE *fp, std::string name, ptx_reg_t value, symbol_table fprintf( fp, "non-scalar type\n" ); break; } + fflush(fp); } static void print_reg( std::string name, ptx_reg_t value, symbol_table *symtab ) @@ -361,6 +381,8 @@ void ptx_thread_info::callstack_push( unsigned pc, unsigned rpc, const symbol *r assert( m_func_info != NULL ); m_callstack.push_back( stack_entry(m_symbol_table,m_func_info,pc,rpc,return_var_src,return_var_dst,call_uid) ); m_regs.push_back( reg_map_t() ); + m_debug_trace_regs_modified.push_back( reg_map_t() ); + m_debug_trace_regs_read.push_back( reg_map_t() ); m_local_mem_stack_pointer += m_func_info->local_mem_framesize(); } @@ -387,6 +409,8 @@ bool ptx_thread_info::callstack_pop() } m_callstack.pop_back(); m_regs.pop_back(); + m_debug_trace_regs_modified.pop_back(); + m_debug_trace_regs_read.pop_back(); // write return value into caller frame if( rv_dst != NULL ) @@ -441,38 +465,63 @@ const ptx_instruction *ptx_thread_info::get_inst( addr_t pc ) const return m_func_info->get_instruction(pc); } -void ptx_thread_info::dump_regs() -{ - dump_regs(stdout); -} - void ptx_thread_info::dump_regs( FILE *fp ) { + if(m_regs.empty()) return; + if(m_regs.back().empty()) return; fprintf(fp,"Register File Contents:\n"); + fflush(fp); reg_map_t::const_iterator r; for ( r=m_regs.back().begin(); r != m_regs.back().end(); ++r ) { - std::string name = r->first->name(); + const symbol *sym = r->first; ptx_reg_t value = r->second; + std::string name = sym->name(); print_reg(name,value,m_symbol_table); } } -void ptx_thread_info::dump_modifiedregs() +void ptx_thread_info::dump_modifiedregs(FILE *fp) { - dump_modifiedregs(stdout); + if( !(m_debug_trace_regs_modified.empty() || + m_debug_trace_regs_modified.back().empty()) ) { + fprintf(fp,"Output Registers:\n"); + fflush(fp); + reg_map_t::iterator r; + for ( r=m_debug_trace_regs_modified.back().begin(); r != m_debug_trace_regs_modified.back().end(); ++r ) { + const symbol *sym = r->first; + std::string name = sym->name(); + ptx_reg_t value = r->second; + print_reg(fp,name,value,m_symbol_table); + } + } + if( !(m_debug_trace_regs_read.empty() || + m_debug_trace_regs_read.back().empty()) ) { + fprintf(fp,"Input Registers:\n"); + fflush(fp); + reg_map_t::iterator r; + for ( r=m_debug_trace_regs_read.back().begin(); r != m_debug_trace_regs_read.back().end(); ++r ) { + const symbol *sym = r->first; + std::string name = sym->name(); + ptx_reg_t value = r->second; + print_reg(fp,name,value,m_symbol_table); + } + } } -void ptx_thread_info::dump_modifiedregs(FILE *fp) +void ptx_thread_info::push_breakaddr(const operand_info &breakaddr) { - if( m_debug_trace_regs_modified.empty() ) - return; - fprintf(fp,"Modified Registers:\n"); - reg_map_t::const_iterator r; - for ( r=m_debug_trace_regs_modified.begin(); r != m_debug_trace_regs_modified.end(); ++r ) { - std::string name = r->first->name(); - ptx_reg_t value = r->second; - print_reg(name,value,m_symbol_table); + m_breakaddrs.push(breakaddr); +} + +const operand_info& ptx_thread_info::pop_breakaddr() +{ + if(m_breakaddrs.empty()) { + printf("empty breakaddrs stack"); + assert(0); } + operand_info& breakaddr = m_breakaddrs.top(); + m_breakaddrs.pop(); + return breakaddr; } void ptx_thread_info::set_npc( const function_info *f ) @@ -482,6 +531,7 @@ void ptx_thread_info::set_npc( const function_info *f ) m_symbol_table = m_func_info->get_symtab(); } + void feature_not_implemented( const char *f ) { printf("GPGPU-Sim: feature '%s' not supported\n", f ); -- cgit v1.3