summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-08-07 05:35:29 -0800
committerTor Aamodt <[email protected]>2010-08-07 05:35:29 -0800
commit4d441a9746616b2e45397097e6a7600a67aa973c (patch)
tree1e4fab27e7e089b72718fbb9814bac6e8c75f471
parent0ef446ceb7b5045030724f6906fc011296623d2d (diff)
watchpoint facility for ptx debugging
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 7160]
-rw-r--r--src/abstract_hardware_model.h56
-rw-r--r--src/cuda-sim/cuda-sim.cc26
-rw-r--r--src/cuda-sim/cuda-sim.h8
-rw-r--r--src/cuda-sim/instructions.cc22
-rw-r--r--src/cuda-sim/memory.cc20
-rw-r--r--src/cuda-sim/memory.h21
-rw-r--r--src/cuda-sim/ptx_ir.cc2
-rw-r--r--src/debug.cc176
-rw-r--r--src/debug.h66
-rw-r--r--src/gpgpu-sim/Makefile248
-rw-r--r--src/gpgpu-sim/gpu-sim.cc110
-rw-r--r--src/gpgpu-sim/gpu-sim.h1
-rw-r--r--src/gpgpu-sim/shader.h2
13 files changed, 553 insertions, 205 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h
index 98d934c..3b3d07e 100644
--- a/src/abstract_hardware_model.h
+++ b/src/abstract_hardware_model.h
@@ -67,62 +67,6 @@ private:
unsigned m_bank; // n in ".const[n]"; note .const == .const[0] (see PTX 2.1 manual, sec. 5.1.3)
};
-#include <string>
-
-class brk_pt {
-public:
- brk_pt() { m_valid=false; }
- brk_pt( const char *fileline, unsigned uid )
- {
- m_valid = true;
- m_watch = false;
- m_fileline = std::string(fileline);
- m_thread_uid=uid;
- }
- brk_pt( unsigned addr, unsigned value )
- {
- m_valid = true;
- m_watch = true;
- m_addr = addr;
- m_value = value;
- }
-
- unsigned get_value() const { return m_value; }
- addr_t get_addr() const { return m_addr; }
- bool is_valid() const { return m_valid; }
- bool is_watchpoint() const { return m_watch; }
- bool is_equal( const std::string &fileline, unsigned uid ) const
- {
- if( m_watch )
- return false;
- if( (m_thread_uid != (unsigned)-1) && (uid != m_thread_uid) )
- return false;
- return m_fileline == fileline;
- }
- std::string location() const
- {
- char buffer[1024];
- sprintf(buffer,"%s thread uid = %u", m_fileline.c_str(), m_thread_uid);
- return buffer;
- }
-
- unsigned set_value( unsigned val ) { return m_value=val; }
-private:
- bool m_valid;
- bool m_watch;
-
- // break point
- std::string m_fileline;
- unsigned m_thread_uid;
-
- // watch point
- unsigned m_addr;
- unsigned m_value;
-};
-
-bool thread_at_brkpt( void *ptx_thd_info, const struct brk_pt &b );
-unsigned read_location( addr_t addr );
-
#endif
#endif
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<const char*>(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 <stdlib.h>
+#include "../debug.h"
template<unsigned BSIZE> memory_space_impl<BSIZE>::memory_space_impl( std::string name, unsigned hash_size )
{
@@ -79,13 +80,21 @@ template<unsigned BSIZE> memory_space_impl<BSIZE>::memory_space_impl( std::strin
assert( m_log2_block_size != (unsigned)-1 );
}
-template<unsigned BSIZE> void memory_space_impl<BSIZE>::write( mem_addr_t addr, size_t length, const void *data )
+template<unsigned BSIZE> void memory_space_impl<BSIZE>::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<unsigned,mem_addr_t>::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<unsigned BSIZE> void memory_space_impl<BSIZE>::read( mem_addr_t addr, size_t length, void *data ) const
@@ -119,6 +128,11 @@ template<unsigned BSIZE> void memory_space_impl<BSIZE>::print( const char *forma
}
}
+template<unsigned BSIZE> void memory_space_impl<BSIZE>::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 <unordered_map>
@@ -85,7 +87,8 @@
#include <string.h>
#include <stdio.h>
#include <string>
-#include "../abstract_hardware_model.h"
+#include <map>
+#include <stdlib.h>
typedef address_type mem_addr_t;
@@ -95,16 +98,16 @@ template<unsigned BSIZE> 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<unsigned BSIZE> 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<mem_addr_t,mem_storage<BSIZE> > map_t;
map_t m_data;
+ std::map<unsigned,mem_addr_t> 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);
}
}
diff --git a/src/debug.cc b/src/debug.cc
new file mode 100644
index 0000000..3e71209
--- /dev/null
+++ b/src/debug.cc
@@ -0,0 +1,176 @@
+#include "debug.h"
+#include "gpgpu-sim/shader.h"
+#include "gpgpu-sim/gpu-sim.h"
+#include "cuda-sim/ptx_sim.h"
+#include "cuda-sim/cuda-sim.h"
+#include "cuda-sim/ptx_ir.h"
+
+#include <map>
+#include <stdio.h>
+#include <string.h>
+
+class watchpoint_event {
+public:
+ watchpoint_event()
+ {
+ m_thread=NULL;
+ m_inst=NULL;
+ }
+ watchpoint_event(const ptx_thread_info *thd, const ptx_instruction *pI)
+ {
+ m_thread=thd;
+ m_inst = pI;
+ }
+ const ptx_thread_info *thread() const { return m_thread; }
+ const ptx_instruction *inst() const { return m_inst; }
+private:
+ const ptx_thread_info *m_thread;
+ const ptx_instruction *m_inst;
+};
+
+std::map<unsigned,watchpoint_event> g_watchpoint_hits;
+
+void hit_watchpoint( unsigned watchpoint_num, ptx_thread_info *thd, const ptx_instruction *pI )
+{
+ g_watchpoint_hits[watchpoint_num]=watchpoint_event(thd,pI);
+}
+
+/// interactive debugger
+
+void gpgpu_debug()
+{
+ bool done=true;
+
+ static bool single_step=true;
+ static unsigned next_brkpt=1;
+ static std::map<unsigned,brk_pt> breakpoints;
+
+ /// if single stepping, go to interactive debugger
+
+ if( single_step )
+ done=false;
+
+ /// check if we've reached a breakpoint
+
+ for( std::map<unsigned,brk_pt>::iterator i=breakpoints.begin(); i!=breakpoints.end(); i++) {
+ unsigned num=i->first;
+ brk_pt &b=i->second;
+ if( b.is_watchpoint() ) {
+ unsigned addr = b.get_addr();
+ unsigned new_value = read_location(addr);
+ if( new_value != b.get_value() ) {
+ printf( "GPGPU-Sim DBG: watch point %u triggered (old value=%x, new value=%x)\n",
+ num,b.get_value(),new_value );
+ std::map<unsigned,watchpoint_event>::iterator w=g_watchpoint_hits.find(num);
+ if( w==g_watchpoint_hits.end() )
+ printf( "GPGPU-Sim DBG: memory transfer modified value\n");
+ else {
+ watchpoint_event wa = w->second;
+ const ptx_thread_info *thd = wa.thread();
+ const ptx_instruction *pI = wa.inst();
+ printf( "GPGPU-Sim DBG: modified by thread uid=%u, sid=%u, hwtid=%u\n",
+ thd->get_uid(),thd->get_hw_sid(), thd->get_hw_tid() );
+ printf( "GPGPU-Sim DBG: ");
+ pI->print_insn(stdout);
+ printf( "\n" );
+ g_watchpoint_hits.erase(w);
+ }
+ b.set_value(new_value);
+ done = false;
+ }
+ } else {
+ for( unsigned sid=0; sid < gpu_n_shader; sid++ ) {
+ inst_t *fvi = first_valid_thread(sc[sid]->pipeline_reg[IF_ID]);
+ if( !fvi ) continue;
+ if( thread_at_brkpt(fvi->ptx_thd_info, b) ) {
+ done = false;
+ printf("GPGPU-Sim DBG: reached breakpoint %u at %s (sm=%u, hwtid=%u)\n",
+ num, b.location().c_str(), sid, fvi->hw_thread_id );
+ }
+ }
+ }
+ }
+
+ if( done )
+ assert( g_watchpoint_hits.empty() );
+
+ /// enter interactive debugger loop
+
+ while (!done) {
+ printf("(gpgpu-sim dbg) ");
+ fflush(stdout);
+
+ char line[1024];
+ fgets(line,1024,stdin);
+
+ char *tok = strtok(line," \t\n");
+ if( !strcmp(tok,"dp") ) {
+ int shader_num = 0;
+ tok = strtok(NULL," \t\n");
+ sscanf(tok,"%d",&shader_num);
+ dump_pipeline_impl((0x40|0x4|0x1),shader_num,0);
+ printf("\n");
+ fflush(stdout);
+ } else if( !strcmp(tok,"q") || !strcmp(tok,"quit") ) {
+ printf("\nreally quit GPGPU-Sim (y/n)?\n");
+ fgets(line,1024,stdin);
+ tok = strtok(NULL," \t\n");
+ if( !strcmp(tok,"y") ) {
+ exit(0);
+ } else {
+ printf("not quiting.\n");
+ }
+ } else if( !strcmp(tok,"b") ) {
+ tok = strtok(NULL," \t\n");
+ char brkpt[1024];
+ sscanf(tok,"%s",brkpt);
+ tok = strtok(NULL," \t\n");
+ unsigned uid;
+ sscanf(tok,"%u",&uid);
+ breakpoints[next_brkpt++] = brk_pt(brkpt,uid);
+ } else if( !strcmp(tok,"d") ) {
+ tok = strtok(NULL," \t\n");
+ unsigned uid;
+ sscanf(tok,"%u",&uid);
+ breakpoints.erase(uid);
+ } else if( !strcmp(tok,"s") ) {
+ done = true;
+ } else if( !strcmp(tok,"c") ) {
+ single_step=false;
+ done = true;
+ } else if( !strcmp(tok,"w") ) {
+ tok = strtok(NULL," \t\n");
+ unsigned addr;
+ sscanf(tok,"%x",&addr);
+ unsigned value = read_location(addr);
+ g_global_mem->set_watch(addr,next_brkpt);
+ breakpoints[next_brkpt++] = brk_pt(addr,value);
+ } else if( !strcmp(tok,"h") ) {
+ printf("commands:\n");
+ printf(" q - quit GPGPU-Sim\n");
+ printf(" b <file>:<line> <thead uid> - set breakpoint\n");
+ printf(" w <global address> - set watchpoint\n");
+ printf(" del <n> - delete breakpoint\n");
+ printf(" s - single step one shader cycle (all cores)\n");
+ printf(" c - continue simulation without single stepping\n");
+ printf(" dp <n> - display pipeline contents on SM <n>\n");
+ printf(" h - print this message\n");
+ } else {
+ printf("\ncommand not understood.\n");
+ }
+ fflush(stdout);
+ }
+}
+
+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/debug.h b/src/debug.h
new file mode 100644
index 0000000..463780a
--- /dev/null
+++ b/src/debug.h
@@ -0,0 +1,66 @@
+#ifndef PTX_DEBUG_INCLUDED
+#define PTX_DEBUG_INCLUDED
+
+#include "abstract_hardware_model.h"
+
+#include <string>
+
+class brk_pt {
+public:
+ brk_pt() { m_valid=false; }
+ brk_pt( const char *fileline, unsigned uid )
+ {
+ m_valid = true;
+ m_watch = false;
+ m_fileline = std::string(fileline);
+ m_thread_uid=uid;
+ }
+ brk_pt( unsigned addr, unsigned value )
+ {
+ m_valid = true;
+ m_watch = true;
+ m_addr = addr;
+ m_value = value;
+ }
+
+ unsigned get_value() const { return m_value; }
+ addr_t get_addr() const { return m_addr; }
+ bool is_valid() const { return m_valid; }
+ bool is_watchpoint() const { return m_watch; }
+ bool is_equal( const std::string &fileline, unsigned uid ) const
+ {
+ if( m_watch )
+ return false;
+ if( (m_thread_uid != (unsigned)-1) && (uid != m_thread_uid) )
+ return false;
+ return m_fileline == fileline;
+ }
+ std::string location() const
+ {
+ char buffer[1024];
+ sprintf(buffer,"%s thread uid = %u", m_fileline.c_str(), m_thread_uid);
+ return buffer;
+ }
+
+ unsigned set_value( unsigned val ) { return m_value=val; }
+private:
+ bool m_valid;
+ bool m_watch;
+
+ // break point
+ std::string m_fileline;
+ unsigned m_thread_uid;
+
+ // watch point
+ unsigned m_addr;
+ unsigned m_value;
+};
+
+class ptx_thread_info;
+class ptx_instruction;
+bool thread_at_brkpt( void *ptx_thd_info, const struct brk_pt &b );
+unsigned read_location( addr_t addr );
+void hit_watchpoint( unsigned watchpoint_num, ptx_thread_info *thd, const ptx_instruction *pI );
+void gpgpu_debug();
+
+#endif
diff --git a/src/gpgpu-sim/Makefile b/src/gpgpu-sim/Makefile
index 2b1412a..96b1a5c 100644
--- a/src/gpgpu-sim/Makefile
+++ b/src/gpgpu-sim/Makefile
@@ -114,3 +114,251 @@ dram_sched.$(OEXT): ../cuda-sim/ptx.tab.h
# DO NOT DELETE
+addrdec.o: /usr/include/string.h /usr/include/features.h
+addrdec.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+addrdec.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h addrdec.h
+addrdec.o: /usr/include/stdio.h /usr/include/bits/types.h
+addrdec.o: /usr/include/bits/typesizes.h /usr/include/libio.h
+addrdec.o: /usr/include/_G_config.h /usr/include/wchar.h
+addrdec.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+addrdec.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
+addrdec.o: /usr/include/endian.h /usr/include/bits/endian.h
+addrdec.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+addrdec.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+addrdec.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+addrdec.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+addrdec.o: /usr/include/assert.h ../option_parser.h
+delayqueue.o: delayqueue.h /usr/include/stdio.h /usr/include/features.h
+delayqueue.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+delayqueue.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+delayqueue.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+delayqueue.o: /usr/include/libio.h /usr/include/_G_config.h
+delayqueue.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+delayqueue.o: /usr/include/bits/sys_errlist.h /usr/include/assert.h
+delayqueue.o: /usr/include/stdlib.h /usr/include/sys/types.h
+delayqueue.o: /usr/include/time.h /usr/include/endian.h
+delayqueue.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
+delayqueue.o: /usr/include/sys/select.h /usr/include/bits/select.h
+delayqueue.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
+delayqueue.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
+delayqueue.o: /usr/include/alloca.h gpu-misc.h ../intersim/statwraper.h
+dram.o: gpu-misc.h dram.h /usr/include/stdio.h /usr/include/features.h
+dram.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+dram.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+dram.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+dram.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
+dram.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+dram.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
+dram.o: /usr/include/endian.h /usr/include/bits/endian.h
+dram.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+dram.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+dram.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+dram.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h delayqueue.h
+dram.o: /usr/include/assert.h ../cuda-sim/dram_callback.h
+dram_sched.o: dram_sched.h dram.h /usr/include/stdio.h
+dram_sched.o: /usr/include/features.h /usr/include/sys/cdefs.h
+dram_sched.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
+dram_sched.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
+dram_sched.o: /usr/include/bits/typesizes.h /usr/include/libio.h
+dram_sched.o: /usr/include/_G_config.h /usr/include/wchar.h
+dram_sched.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+dram_sched.o: /usr/include/stdlib.h /usr/include/sys/types.h
+dram_sched.o: /usr/include/time.h /usr/include/endian.h
+dram_sched.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
+dram_sched.o: /usr/include/sys/select.h /usr/include/bits/select.h
+dram_sched.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
+dram_sched.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
+dram_sched.o: /usr/include/alloca.h delayqueue.h /usr/include/assert.h
+dram_sched.o: ../cuda-sim/dram_callback.h shader.h /usr/include/math.h
+dram_sched.o: /usr/include/bits/huge_val.h /usr/include/bits/mathdef.h
+dram_sched.o: /usr/include/bits/mathcalls.h /usr/include/limits.h
+dram_sched.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
+dram_sched.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
+dram_sched.o: ../cuda-sim/ptx.tab.h gpu-cache.h ../abstract_hardware_model.h
+dram_sched.o: stack.h gpu-sim.h /usr/include/zlib.h /usr/include/zconf.h
+dram_sched.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h
+dram_sched.o: /usr/include/bits/confname.h /usr/include/getopt.h
+dram_sched.o: ../option_parser.h mem_fetch.h addrdec.h gpu-misc.h
+dwf.o: dwf.h ../abstract_hardware_model.h histogram.h /usr/include/string.h
+dwf.o: /usr/include/features.h /usr/include/sys/cdefs.h
+dwf.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
+dwf.o: /usr/include/gnu/stubs-64.h
+gpu-cache.o: gpu-cache.h /usr/include/stdio.h /usr/include/features.h
+gpu-cache.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+gpu-cache.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+gpu-cache.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+gpu-cache.o: /usr/include/libio.h /usr/include/_G_config.h
+gpu-cache.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+gpu-cache.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
+gpu-cache.o: /usr/include/sys/types.h /usr/include/time.h
+gpu-cache.o: /usr/include/endian.h /usr/include/bits/endian.h
+gpu-cache.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+gpu-cache.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+gpu-cache.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+gpu-cache.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+gpu-cache.o: ../abstract_hardware_model.h gpu-misc.h addrdec.h
+gpu-cache.o: /usr/include/assert.h ../option_parser.h /usr/include/string.h
+gpu-misc.o: gpu-misc.h
+gpu-sim.o: gpu-sim.h /usr/include/stdio.h /usr/include/features.h
+gpu-sim.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+gpu-sim.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+gpu-sim.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+gpu-sim.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
+gpu-sim.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+gpu-sim.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
+gpu-sim.o: /usr/include/endian.h /usr/include/bits/endian.h
+gpu-sim.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+gpu-sim.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+gpu-sim.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+gpu-sim.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+gpu-sim.o: /usr/include/math.h /usr/include/bits/huge_val.h
+gpu-sim.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
+gpu-sim.o: /usr/include/zlib.h /usr/include/zconf.h /usr/include/unistd.h
+gpu-sim.o: /usr/include/bits/posix_opt.h /usr/include/bits/confname.h
+gpu-sim.o: /usr/include/getopt.h ../option_parser.h shader.h
+gpu-sim.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
+gpu-sim.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
+gpu-sim.o: /usr/include/bits/posix2_lim.h /usr/include/assert.h
+gpu-sim.o: ../cuda-sim/ptx.tab.h ../cuda-sim/dram_callback.h gpu-cache.h
+gpu-sim.o: ../abstract_hardware_model.h delayqueue.h stack.h dram.h
+gpu-sim.o: mem_fetch.h addrdec.h gpu-misc.h icnt_wrapper.h dwf.h
+gpu-sim.o: warp_tracker.h cflogger.h l2cache.h ../cuda-sim/ptx-stats.h
+gpu-sim.o: ../intersim/statwraper.h ../debug.h ../abstract_hardware_model.h
+gpu-sim.o: /usr/include/string.h mem_latency_stat.h
+icnt_wrapper.o: icnt_wrapper.h /usr/include/assert.h /usr/include/features.h
+icnt_wrapper.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+icnt_wrapper.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+icnt_wrapper.o: ../intersim/interconnect_interface.h ../intersim/flit.hpp
+icnt_wrapper.o: ../intersim/booksim.hpp ../intersim/trafficmanager.hpp
+icnt_wrapper.o: ../intersim/module.hpp ../intersim/config_utils.hpp
+icnt_wrapper.o: /usr/include/stdio.h /usr/include/bits/types.h
+icnt_wrapper.o: /usr/include/bits/typesizes.h /usr/include/libio.h
+icnt_wrapper.o: /usr/include/_G_config.h /usr/include/wchar.h
+icnt_wrapper.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+icnt_wrapper.o: ../intersim/network.hpp ../intersim/credit.hpp
+icnt_wrapper.o: ../intersim/router.hpp ../intersim/buffer_state.hpp
+icnt_wrapper.o: ../intersim/stats.hpp ../intersim/traffic.hpp
+icnt_wrapper.o: ../intersim/routefunc.hpp ../intersim/outputset.hpp
+icnt_wrapper.o: ../intersim/injection.hpp
+l2cache.o: /usr/include/stdlib.h /usr/include/features.h
+l2cache.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+l2cache.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+l2cache.o: /usr/include/sys/types.h /usr/include/bits/types.h
+l2cache.o: /usr/include/bits/typesizes.h /usr/include/time.h
+l2cache.o: /usr/include/endian.h /usr/include/bits/endian.h
+l2cache.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+l2cache.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+l2cache.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+l2cache.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+l2cache.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h
+l2cache.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+l2cache.o: /usr/include/bits/sys_errlist.h /usr/include/string.h
+l2cache.o: ../tr1_hash_map.h ../option_parser.h mem_fetch.h shader.h
+l2cache.o: /usr/include/math.h /usr/include/bits/huge_val.h
+l2cache.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
+l2cache.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
+l2cache.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
+l2cache.o: /usr/include/bits/posix2_lim.h /usr/include/assert.h
+l2cache.o: ../cuda-sim/ptx.tab.h ../cuda-sim/dram_callback.h gpu-cache.h
+l2cache.o: ../abstract_hardware_model.h delayqueue.h stack.h dram.h addrdec.h
+l2cache.o: histogram.h l2cache.h ../intersim/statwraper.h
+shader.o: shader.h /usr/include/stdio.h /usr/include/features.h
+shader.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+shader.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+shader.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+shader.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
+shader.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
+shader.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
+shader.o: /usr/include/endian.h /usr/include/bits/endian.h
+shader.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+shader.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+shader.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+shader.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+shader.o: /usr/include/math.h /usr/include/bits/huge_val.h
+shader.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
+shader.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
+shader.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
+shader.o: /usr/include/bits/posix2_lim.h /usr/include/assert.h
+shader.o: ../cuda-sim/ptx.tab.h ../cuda-sim/dram_callback.h gpu-cache.h
+shader.o: ../abstract_hardware_model.h delayqueue.h stack.h dram.h gpu-sim.h
+shader.o: /usr/include/zlib.h /usr/include/zconf.h /usr/include/unistd.h
+shader.o: /usr/include/bits/posix_opt.h /usr/include/bits/confname.h
+shader.o: /usr/include/getopt.h ../option_parser.h mem_fetch.h addrdec.h
+shader.o: dwf.h warp_tracker.h cflogger.h gpu-misc.h ../cuda-sim/ptx_sim.h
+shader.o: ../cuda-sim/dram_callback.h ../cuda-sim/opcodes.h
+shader.o: ../cuda-sim/opcodes.def ../cuda-sim/ptx-stats.h
+shader.o: /usr/include/string.h
+stack.o: stack.h ../abstract_hardware_model.h /usr/include/stdlib.h
+stack.o: /usr/include/features.h /usr/include/sys/cdefs.h
+stack.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
+stack.o: /usr/include/gnu/stubs-64.h /usr/include/sys/types.h
+stack.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+stack.o: /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h
+stack.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+stack.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+stack.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+stack.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+stack.o: /usr/include/assert.h
+stat-tool.o: /usr/include/stdio.h /usr/include/features.h
+stat-tool.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+stat-tool.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+stat-tool.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+stat-tool.o: /usr/include/libio.h /usr/include/_G_config.h
+stat-tool.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+stat-tool.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
+stat-tool.o: /usr/include/sys/types.h /usr/include/time.h
+stat-tool.o: /usr/include/endian.h /usr/include/bits/endian.h
+stat-tool.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+stat-tool.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+stat-tool.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+stat-tool.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+stat-tool.o: /usr/include/assert.h /usr/include/zlib.h /usr/include/zconf.h
+stat-tool.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h
+stat-tool.o: /usr/include/bits/confname.h /usr/include/getopt.h histogram.h
+stat-tool.o: ../abstract_hardware_model.h cflogger.h
+visualizer.o: gpu-sim.h /usr/include/stdio.h /usr/include/features.h
+visualizer.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+visualizer.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+visualizer.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+visualizer.o: /usr/include/libio.h /usr/include/_G_config.h
+visualizer.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+visualizer.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
+visualizer.o: /usr/include/sys/types.h /usr/include/time.h
+visualizer.o: /usr/include/endian.h /usr/include/bits/endian.h
+visualizer.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+visualizer.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+visualizer.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+visualizer.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+visualizer.o: /usr/include/math.h /usr/include/bits/huge_val.h
+visualizer.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
+visualizer.o: /usr/include/zlib.h /usr/include/zconf.h /usr/include/unistd.h
+visualizer.o: /usr/include/bits/posix_opt.h /usr/include/bits/confname.h
+visualizer.o: /usr/include/getopt.h ../option_parser.h shader.h
+visualizer.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
+visualizer.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
+visualizer.o: /usr/include/bits/posix2_lim.h /usr/include/assert.h
+visualizer.o: ../cuda-sim/ptx.tab.h ../cuda-sim/dram_callback.h gpu-cache.h
+visualizer.o: ../abstract_hardware_model.h delayqueue.h stack.h dram.h
+visualizer.o: mem_fetch.h addrdec.h /usr/include/string.h
+visualizer.o: ../gpgpu-sim/shader.h ../gpgpu-sim/mem_fetch.h
+warp_tracker.o: warp_tracker.h ../abstract_hardware_model.h shader.h
+warp_tracker.o: /usr/include/stdio.h /usr/include/features.h
+warp_tracker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
+warp_tracker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
+warp_tracker.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
+warp_tracker.o: /usr/include/libio.h /usr/include/_G_config.h
+warp_tracker.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
+warp_tracker.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
+warp_tracker.o: /usr/include/sys/types.h /usr/include/time.h
+warp_tracker.o: /usr/include/endian.h /usr/include/bits/endian.h
+warp_tracker.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
+warp_tracker.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
+warp_tracker.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
+warp_tracker.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
+warp_tracker.o: /usr/include/math.h /usr/include/bits/huge_val.h
+warp_tracker.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
+warp_tracker.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h
+warp_tracker.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h
+warp_tracker.o: /usr/include/bits/posix2_lim.h /usr/include/assert.h
+warp_tracker.o: ../cuda-sim/ptx.tab.h ../cuda-sim/dram_callback.h gpu-cache.h
+warp_tracker.o: delayqueue.h stack.h dram.h
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc
index 2b4ebe3..1bec72f 100644
--- a/src/gpgpu-sim/gpu-sim.cc
+++ b/src/gpgpu-sim/gpu-sim.cc
@@ -82,6 +82,7 @@
#include "../cuda-sim/ptx-stats.h"
#include "../intersim/statwraper.h"
#include "../abstract_hardware_model.h"
+#include "../debug.h"
#include <stdio.h>
#include <string.h>
@@ -206,7 +207,6 @@ void check_time_vector_update(unsigned int uid,int slot ,long int latency,int ty
void node_req_hist_clear(void *p);
void node_req_hist_dump(void *p);
void node_req_hist_update(void * p,int node, long long cycle);
-static void gpgpu_debug();
/* functionally simulated memory */
extern struct mem_t *mem;
@@ -1765,111 +1765,3 @@ void dump_pipeline()
dump_pipeline_impl(0,-1,-1);
}
-/// interactive debugger
-
-static void gpgpu_debug()
-{
- bool done=true;
-
- static bool single_step=true;
- static unsigned next_brkpt=1;
- static std::map<unsigned,brk_pt> breakpoints;
-
- /// if single stepping, go to interactive debugger
-
- if( single_step )
- done=false;
-
- /// check if we've reached a breakpoint
-
- for( std::map<unsigned,brk_pt>::iterator i=breakpoints.begin(); i!=breakpoints.end(); i++) {
- unsigned num=i->first;
- brk_pt &b=i->second;
- if( b.is_watchpoint() ) {
- unsigned addr = b.get_addr();
- unsigned new_value = read_location(addr);
- if( new_value != b.get_value() ) {
- printf( "GPGPU-Sim DBG: watch point %u triggered (old value=%x, new value=%x)\n",
- num,b.get_value(),new_value );
- b.set_value(new_value);
- done = false;
- }
- } else {
- for( unsigned sid=0; sid < gpu_n_shader; sid++ ) {
- inst_t *fvi = first_valid_thread(sc[sid]->pipeline_reg[IF_ID]);
- if( !fvi ) continue;
- if( thread_at_brkpt(fvi->ptx_thd_info, b) ) {
- done = false;
- printf("GPGPU-Sim DBG: reached breakpoint %u at %s (sm=%u, hwtid=%u)\n",
- num, b.location().c_str(), sid, fvi->hw_thread_id );
- }
- }
- }
- }
-
- /// enter interactive debugger loop
-
- while (!done) {
- printf("(gpgpu-sim dbg) ");
- fflush(stdout);
-
- char line[1024];
- fgets(line,1024,stdin);
-
- char *tok = strtok(line," \t\n");
- if( !strcmp(tok,"dp") ) {
- int shader_num = 0;
- tok = strtok(NULL," \t\n");
- sscanf(tok,"%d",&shader_num);
- dump_pipeline_impl((0x40|0x4|0x1),shader_num,0);
- printf("\n");
- fflush(stdout);
- } else if( !strcmp(tok,"q") || !strcmp(tok,"quit") ) {
- printf("\nreally quit GPGPU-Sim (y/n)?\n");
- fgets(line,1024,stdin);
- tok = strtok(NULL," \t\n");
- if( !strcmp(tok,"y") ) {
- exit(0);
- } else {
- printf("not quiting.\n");
- }
- } else if( !strcmp(tok,"b") ) {
- tok = strtok(NULL," \t\n");
- char brkpt[1024];
- sscanf(tok,"%s",brkpt);
- tok = strtok(NULL," \t\n");
- unsigned uid;
- sscanf(tok,"%u",&uid);
- breakpoints[next_brkpt++] = brk_pt(brkpt,uid);
- } else if( !strcmp(tok,"d") ) {
- tok = strtok(NULL," \t\n");
- unsigned uid;
- sscanf(tok,"%u",&uid);
- breakpoints.erase(uid);
- } else if( !strcmp(tok,"s") ) {
- done = true;
- } else if( !strcmp(tok,"c") ) {
- single_step=false;
- done = true;
- } else if( !strcmp(tok,"w") ) {
- tok = strtok(NULL," \t\n");
- unsigned addr;
- sscanf(tok,"%x",&addr);
- unsigned value = read_location(addr);
- breakpoints[next_brkpt++] = brk_pt(addr,value);
- } else if( !strcmp(tok,"h") ) {
- printf("commands:\n");
- printf(" q - quit GPGPU-Sim\n");
- printf(" b <file>:<line> <thead uid> - set breakpoint\n");
- printf(" w <global address> - set watchpoint\n");
- printf(" del <n> - delete breakpoint\n");
- printf(" s - single step one shader cycle (all cores)\n");
- printf(" c - continue simulation without single stepping\n");
- printf(" dp <n> - display pipeline contents on SM <n>\n");
- printf(" h - print this message\n");
- } else {
- printf("\ncommand not understood.\n");
- }
- fflush(stdout);
- }
-}
diff --git a/src/gpgpu-sim/gpu-sim.h b/src/gpgpu-sim/gpu-sim.h
index e30797e..27d83ad 100644
--- a/src/gpgpu-sim/gpu-sim.h
+++ b/src/gpgpu-sim/gpu-sim.h
@@ -112,5 +112,6 @@ void gpu_print_stat();
int mem_ctrl_full( int mc_id );
void dramqueue_latency_log_dump();
+void dump_pipeline_impl( int mask, int s, int m );
#endif
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 9f64da5..9dd7dc8 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -896,5 +896,7 @@ unsigned int max_cta_per_shader( shader_core_ctx_t *shader);
#define WB_RT 6
#define ID_OC 7
+extern unsigned int gpu_n_shader;
+extern shader_core_ctx_t **sc;
#endif /* SHADER_H */