From 4d441a9746616b2e45397097e6a7600a67aa973c Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Sat, 7 Aug 2010 05:35:29 -0800 Subject: watchpoint facility for ptx debugging [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7160] --- src/cuda-sim/cuda-sim.cc | 26 +++++++------------------- src/cuda-sim/cuda-sim.h | 8 ++++++++ src/cuda-sim/instructions.cc | 22 +++++++++++----------- src/cuda-sim/memory.cc | 20 +++++++++++++++++--- src/cuda-sim/memory.h | 21 +++++++++++++++------ src/cuda-sim/ptx_ir.cc | 2 +- 6 files changed, 59 insertions(+), 40 deletions(-) create mode 100644 src/cuda-sim/cuda-sim.h (limited to 'src/cuda-sim') diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc index adc9e98..5f568b4 100644 --- a/src/cuda-sim/cuda-sim.cc +++ b/src/cuda-sim/cuda-sim.cc @@ -587,7 +587,7 @@ int load_static_globals( symbol_table *symtab, unsigned min_gaddr, unsigned max_ operand_info op = *i; ptx_reg_t value = op.get_literal_value(); assert( (addr+offset+nbytes) < min_gaddr ); // min_gaddr is start of "heap" for cudaMalloc - g_global_mem->write(addr+offset,nbytes,&value); // assuming little endian here + g_global_mem->write(addr+offset,nbytes,&value,NULL,NULL); // assuming little endian here offset+=nbytes; ng_bytes+=nbytes; } @@ -631,7 +631,7 @@ int load_constants( symbol_table *symtab, addr_t min_gaddr ) unsigned addr=constant->get_address() + nbytes_written; assert( addr+nbytes < min_gaddr ); - g_global_mem->write(addr,nbytes,&value); // assume little endian (so u8 is the first byte in u32) + g_global_mem->write(addr,nbytes,&value,NULL,NULL); // assume little endian (so u8 is the first byte in u32) nc_bytes+=nbytes; nbytes_written += nbytes; } @@ -755,7 +755,7 @@ void gpgpu_ptx_sim_memcpy_to_gpu( size_t dst_start_addr, const void *src, size_t fflush(stdout); char *src_data = (char*)src; for (unsigned n=0; n < count; n ++ ) - g_global_mem->write(dst_start_addr+n,1, src_data+n); + g_global_mem->write(dst_start_addr+n,1, src_data+n,NULL,NULL); printf( " done.\n"); fflush(stdout); } @@ -779,7 +779,7 @@ void gpgpu_ptx_sim_memcpy_gpu_to_gpu( size_t dst, size_t src, size_t count ) for (unsigned n=0; n < count; n ++ ) { unsigned char tmp; g_global_mem->read(src+n,1,&tmp); - g_global_mem->write(dst+n,1, &tmp); + g_global_mem->write(dst+n,1, &tmp,NULL,NULL); } printf( " done.\n"); fflush(stdout); @@ -792,7 +792,7 @@ void gpgpu_ptx_sim_memset( size_t dst_start_addr, int c, size_t count ) fflush(stdout); unsigned char c_value = (unsigned char)c; for (unsigned n=0; n < count; n ++ ) - g_global_mem->write(dst_start_addr+n,1,&c_value); + g_global_mem->write(dst_start_addr+n,1,&c_value,NULL,NULL); printf( " done.\n"); fflush(stdout); } @@ -1058,7 +1058,7 @@ void function_info::finalize( memory_space *param_mem, symbol_table *symtab ) const size_t word_size = 4; for (size_t idx = 0; idx < size; idx += word_size) { const char *pdata = reinterpret_cast(param_value.pdata) + idx; // cast to char * for ptr arithmetic - param_mem->write(param_address + idx, word_size, pdata); + param_mem->write(param_address + idx, word_size, pdata,NULL,NULL); } param->set_address(param_address); param_address += size; @@ -1681,7 +1681,7 @@ void gpgpu_ptx_sim_memcpy_symbol(const char *hostVar, const void *src, size_t co printf("GPGPU-Sim PTX: gpgpu_ptx_sim_memcpy_symbol: copying %zu bytes %s symbol %s+%zu @0x%x ...\n", count, (to?" to ":"from"), sym_name.c_str(), offset, dst ); for ( unsigned n=0; n < count; n++ ) { - if( to ) mem->write(dst+n,1,((char*)src)+n); + if( to ) mem->write(dst+n,1,((char*)src)+n,NULL,NULL); else mem->read(dst+n,1,((char*)src)+n); } fflush(stdout); @@ -2357,15 +2357,3 @@ void *gpgpusim_opencl_getkernel_Object( const char *kernel_name ) return i->second; } -bool thread_at_brkpt( void *thd, const struct brk_pt &b ) -{ - ptx_thread_info *thread = (ptx_thread_info *) thd; - return b.is_equal(thread->get_location(),thread->get_uid()); -} - -unsigned read_location( addr_t addr ) -{ - unsigned result=0; - g_global_mem->read(addr,4,&result); - return result; -} diff --git a/src/cuda-sim/cuda-sim.h b/src/cuda-sim/cuda-sim.h new file mode 100644 index 0000000..83e274a --- /dev/null +++ b/src/cuda-sim/cuda-sim.h @@ -0,0 +1,8 @@ +#ifndef CUDASIM_H_INCLUDED +#define CUDASIM_H_INCLUDED + +class memory_space; + +extern memory_space *g_global_mem; + +#endif diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc index 3ce0a2f..d663d0a 100644 --- a/src/cuda-sim/instructions.cc +++ b/src/cuda-sim/instructions.cc @@ -635,7 +635,7 @@ void atom_callback( void* ptx_inst, void* thd ) // Write operation result into global memory // (i.e. copy src1_data to dst) - g_global_mem->write(src1_data.u32,size/8,&op_result.s64); + g_global_mem->write(src1_data.u32,size/8,&op_result.s64,thread,pI); } // atom_impl will now result in a callback being called in mem_ctrl_pop (gpu-sim.c) @@ -2638,30 +2638,30 @@ void st_impl( const ptx_instruction *pI, ptx_thread_info *thread ) if (!vector_spec) { data = thread->get_operand_value(src1); - mem->write(addr,size/8,&data.s64); + mem->write(addr,size/8,&data.s64,thread,pI); } else { if (vector_spec == V2_TYPE) { ptx_reg_t* ptx_regs = new ptx_reg_t[2]; thread->get_vector_operand_values(src1, ptx_regs, 2); - mem->write(addr,size/8,&ptx_regs[0].s64); - mem->write(addr+size/8,size/8,&ptx_regs[1].s64); + mem->write(addr,size/8,&ptx_regs[0].s64,thread,pI); + mem->write(addr+size/8,size/8,&ptx_regs[1].s64,thread,pI); free(ptx_regs); } if (vector_spec == V3_TYPE) { ptx_reg_t* ptx_regs = new ptx_reg_t[3]; thread->get_vector_operand_values(src1, ptx_regs, 3); - mem->write(addr,size/8,&ptx_regs[0].s64); - mem->write(addr+size/8,size/8,&ptx_regs[1].s64); - mem->write(addr+2*size/8,size/8,&ptx_regs[2].s64); + mem->write(addr,size/8,&ptx_regs[0].s64,thread,pI); + mem->write(addr+size/8,size/8,&ptx_regs[1].s64,thread,pI); + mem->write(addr+2*size/8,size/8,&ptx_regs[2].s64,thread,pI); free(ptx_regs); } if (vector_spec == V4_TYPE) { ptx_reg_t* ptx_regs = new ptx_reg_t[4]; thread->get_vector_operand_values(src1, ptx_regs, 4); - mem->write(addr,size/8,&ptx_regs[0].s64); - mem->write(addr+size/8,size/8,&ptx_regs[1].s64); - mem->write(addr+2*size/8,size/8,&ptx_regs[2].s64); - mem->write(addr+3*size/8,size/8,&ptx_regs[3].s64); + mem->write(addr,size/8,&ptx_regs[0].s64,thread,pI); + mem->write(addr+size/8,size/8,&ptx_regs[1].s64,thread,pI); + mem->write(addr+2*size/8,size/8,&ptx_regs[2].s64,thread,pI); + mem->write(addr+3*size/8,size/8,&ptx_regs[3].s64,thread,pI); free(ptx_regs); } } diff --git a/src/cuda-sim/memory.cc b/src/cuda-sim/memory.cc index 09c9e81..b825f12 100644 --- a/src/cuda-sim/memory.cc +++ b/src/cuda-sim/memory.cc @@ -63,6 +63,7 @@ #include "memory.h" #include +#include "../debug.h" template memory_space_impl::memory_space_impl( std::string name, unsigned hash_size ) { @@ -79,13 +80,21 @@ template memory_space_impl::memory_space_impl( std::strin assert( m_log2_block_size != (unsigned)-1 ); } -template void memory_space_impl::write( mem_addr_t addr, size_t length, const void *data ) +template void memory_space_impl::write( mem_addr_t addr, size_t length, const void *data, class ptx_thread_info *thd, const ptx_instruction *pI) { mem_addr_t index = addr >> m_log2_block_size; unsigned offset = addr & (BSIZE-1); unsigned nbytes = length; assert( (addr+length) <= (index+1)*BSIZE ); m_data[index].write(offset,nbytes,(const unsigned char*)data); + if( !m_watchpoints.empty() ) { + std::map::iterator i; + for( i=m_watchpoints.begin(); i!=m_watchpoints.end(); i++ ) { + mem_addr_t wa = i->second; + if( ((addr<=wa) && ((addr+length)>wa)) || ((addr>wa) && (addr < (wa+4))) ) + hit_watchpoint(i->first,thd,pI); + } + } } template void memory_space_impl::read( mem_addr_t addr, size_t length, void *data ) const @@ -119,6 +128,11 @@ template void memory_space_impl::print( const char *forma } } +template void memory_space_impl::set_watch( addr_t addr, unsigned watchpoint ) +{ + m_watchpoints[watchpoint]=addr; +} + template class memory_space_impl<32>; template class memory_space_impl<64>; template class memory_space_impl<8192>; @@ -137,7 +151,7 @@ int main(int argc, char *argv[] ) memory_space *mem = new memory_space_impl<32>("test",4); // write address to [address] for( mem_addr_t addr=0; addr < 16*1024; addr+=4) - mem->write(addr,4,&addr); + mem->write(addr,4,&addr,NULL,NULL); for( mem_addr_t addr=0; addr < 16*1024; addr+=4) { unsigned tmp=0; @@ -150,7 +164,7 @@ int main(int argc, char *argv[] ) for( mem_addr_t addr=0; addr < 16*1024; addr+=1) { unsigned char val = (addr + 128) % 256; - mem->write(addr,1,&val); + mem->write(addr,1,&val,NULL,NULL); } for( mem_addr_t addr=0; addr < 16*1024; addr+=1) { diff --git a/src/cuda-sim/memory.h b/src/cuda-sim/memory.h index 78e7db7..bac4d24 100644 --- a/src/cuda-sim/memory.h +++ b/src/cuda-sim/memory.h @@ -62,6 +62,8 @@ #ifndef memory_h_INCLUDED #define memory_h_INCLUDED +#include "../abstract_hardware_model.h" + #ifdef __GNUC__ #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 #include @@ -85,7 +87,8 @@ #include #include #include -#include "../abstract_hardware_model.h" +#include +#include typedef address_type mem_addr_t; @@ -95,16 +98,16 @@ template class mem_storage { public: mem_storage( const mem_storage &another ) { - m_data = new unsigned char[ BSIZE ]; + m_data = (unsigned char*)calloc(1,BSIZE); memcpy(m_data,another.m_data,BSIZE); } mem_storage() { - m_data = new unsigned char[ BSIZE ]; + m_data = (unsigned char*)calloc(1,BSIZE); } ~mem_storage() { - delete[] m_data; + free(m_data); } void write( unsigned offset, size_t length, const unsigned char *data ) @@ -138,28 +141,34 @@ private: unsigned char *m_data; }; +class ptx_thread_info; +class ptx_instruction; + class memory_space { public: virtual ~memory_space() {} - virtual void write( mem_addr_t addr, size_t length, const void *data ) = 0; + virtual void write( mem_addr_t addr, size_t length, const void *data, ptx_thread_info *thd, const ptx_instruction *pI ) = 0; virtual void read( mem_addr_t addr, size_t length, void *data ) const = 0; virtual void print( const char *format, FILE *fout ) const = 0; + virtual void set_watch( addr_t addr, unsigned watchpoint ) = 0; }; template class memory_space_impl : public memory_space { public: memory_space_impl( std::string name, unsigned hash_size ); - virtual void write( mem_addr_t addr, size_t length, const void *data ); + virtual void write( mem_addr_t addr, size_t length, const void *data, ptx_thread_info *thd, const ptx_instruction *pI ); virtual void read( mem_addr_t addr, size_t length, void *data ) const; virtual void print( const char *format, FILE *fout ) const; + virtual void set_watch( addr_t addr, unsigned watchpoint ); private: std::string m_name; unsigned m_log2_block_size; typedef mem_map > map_t; map_t m_data; + std::map m_watchpoints; }; #endif diff --git a/src/cuda-sim/ptx_ir.cc b/src/cuda-sim/ptx_ir.cc index cfa6650..e0f2316 100644 --- a/src/cuda-sim/ptx_ir.cc +++ b/src/cuda-sim/ptx_ir.cc @@ -1416,7 +1416,7 @@ void copy_buffer_to_frame(ptx_thread_info * thread, const arg_buffer_t &a) const symbol *dst = a.get_dst(); addr_t frame_offset = dst->get_address(); addr_t to_addr = thread->get_local_mem_stack_pointer() + frame_offset; - thread->m_local_mem->write(to_addr,size,buffer); + thread->m_local_mem->write(to_addr,size,buffer,NULL,NULL); } } -- cgit v1.3