summaryrefslogtreecommitdiff
path: root/src/cuda-sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuda-sim')
-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
6 files changed, 59 insertions, 40 deletions
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);
}
}