diff options
| author | Tor Aamodt <[email protected]> | 2010-07-17 08:42:20 -0800 |
|---|---|---|
| committer | Tor Aamodt <[email protected]> | 2010-07-17 08:42:20 -0800 |
| commit | ca7e2e58e7fd932d67c6d28477a5c15ed3b156b0 (patch) | |
| tree | 1a66586b291019476ec06715d259560818baf923 /src/cuda-sim/cuda-sim.cc | |
| parent | b6661da800739b0fca9e01ba6d5afaca4f286d84 (diff) | |
- add support for cvta and isspacep instructions (currently assuming
a fixed address mapping between shared,local to generic that depends
upon hardware thread context used... might be interesting to explore
tradeoffs at some point)
- remove util.h... we don't need TRUE, FALSE anymore now that
everything is C++
- remove some dead code from shader_decode
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6867]
Diffstat (limited to 'src/cuda-sim/cuda-sim.cc')
| -rw-r--r-- | src/cuda-sim/cuda-sim.cc | 92 |
1 files changed, 77 insertions, 15 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc index e2326f2..f8a8db0 100644 --- a/src/cuda-sim/cuda-sim.cc +++ b/src/cuda-sim/cuda-sim.cc @@ -73,7 +73,7 @@ #include "dram_callback.h" #include <set> #include <map> -#include "../util.h" +#include "../abstract_hardware_model.h" #include "memory.h" #include "ptx-stats.h" @@ -293,6 +293,7 @@ ptx_instruction::ptx_instruction( int opcode, m_hi = false; m_lo = false; m_uni = false; + m_to_option = false; m_rounding_mode = RN_OPTION; m_compare_op = -1; m_saturation_mode = 0; @@ -401,6 +402,9 @@ ptx_instruction::ptx_instruction( int opcode, break; case FTZ_OPTION: break; + case TO_OPTION: + m_to_option = true; + break; default: assert(0); @@ -587,7 +591,7 @@ int load_static_globals( symbol_table *symtab, unsigned min_gaddr, unsigned max_ return ng_bytes; } -int load_constants( symbol_table *symtab ) +int load_constants( symbol_table *symtab, addr_t min_gaddr ) { printf( "GPGPU-Sim PTX: loading constants with explicit initializers... " ); fflush(stdout); @@ -617,6 +621,7 @@ int load_constants( symbol_table *symtab ) abort(); } 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) nc_bytes+=nbytes; @@ -629,7 +634,70 @@ int load_constants( symbol_table *symtab ) return nc_bytes; } -unsigned long long g_dev_malloc=0x10000000; // start allocating from this address (lower values used for allocating globals in .ptx file) +#define GLOBAL_HEAP_START 0x10000000 + // start allocating from this address (lower values used for allocating globals in .ptx file) + +#define SHARED_MEM_SIZE_MAX (64*1024) +#define LOCAL_MEM_SIZE_MAX 1024 +#define MAX_STREAMING_MULTIPROCESSORS 64 +#define MAX_THREAD_PER_SM 1024 +#define TOTAL_LOCAL_MEM_PER_SM (MAX_THREAD_PER_SM*LOCAL_MEM_SIZE_MAX) +#define TOTAL_SHARED_MEM (MAX_STREAMING_MULTIPROCESSORS*SHARED_MEM_SIZE_MAX) +#define TOTAL_LOCAL_MEM (MAX_STREAMING_MULTIPROCESSORS*MAX_THREAD_PER_SM*LOCAL_MEM_SIZE_MAX) +#define SHARED_GENERIC_START (GLOBAL_HEAP_START-TOTAL_SHARED_MEM) +#define LOCAL_GENERIC_START (SHARED_GENERIC_START-TOTAL_LOCAL_MEM) + +#define STATIC_ALLOC_LIMIT (GLOBAL_HEAP_START - (TOTAL_LOCAL_MEM+TOTAL_SHARED_MEM)) + +addr_t shared_to_generic( unsigned smid, addr_t addr ) +{ + assert( addr < SHARED_MEM_SIZE_MAX ); + return SHARED_GENERIC_START + smid*SHARED_MEM_SIZE_MAX + addr; +} + +bool isspace_shared( unsigned smid, addr_t addr ) +{ + addr_t start = SHARED_GENERIC_START + smid*SHARED_MEM_SIZE_MAX; + addr_t end = SHARED_GENERIC_START + (smid+1)*SHARED_MEM_SIZE_MAX; + if( (addr >= end) || (addr < start) ) + return false; + return true; +} + +bool isspace_global( addr_t addr ) +{ + return (addr > GLOBAL_HEAP_START) || (addr < STATIC_ALLOC_LIMIT); +} + +addr_t generic_to_shared( unsigned smid, addr_t addr ) +{ + assert(isspace_shared(smid,addr)); + return addr - (SHARED_GENERIC_START + smid*SHARED_MEM_SIZE_MAX); +} + +addr_t local_to_generic( unsigned smid, unsigned hwtid, addr_t addr ) +{ + assert(addr < LOCAL_MEM_SIZE_MAX); + return LOCAL_GENERIC_START + (TOTAL_LOCAL_MEM_PER_SM * smid) + (LOCAL_MEM_SIZE_MAX * hwtid) + addr; +} + +bool isspace_local( unsigned smid, unsigned hwtid, addr_t addr ) +{ + addr_t start = LOCAL_GENERIC_START + (TOTAL_LOCAL_MEM_PER_SM * smid) + (LOCAL_MEM_SIZE_MAX * hwtid); + addr_t end = LOCAL_GENERIC_START + (TOTAL_LOCAL_MEM_PER_SM * smid) + (LOCAL_MEM_SIZE_MAX * (hwtid+1)); + if( (addr >= end) || (addr < start) ) + return false; + return true; +} + +addr_t generic_to_local( unsigned smid, unsigned hwtid, addr_t addr ) +{ + assert(isspace_local(smid,hwtid,addr)); + return addr - (LOCAL_GENERIC_START + (TOTAL_LOCAL_MEM_PER_SM * smid) + (LOCAL_MEM_SIZE_MAX * hwtid)); +} + + +unsigned long long g_dev_malloc=GLOBAL_HEAP_START; void* gpgpu_ptx_sim_malloc( size_t size ) { @@ -954,12 +1022,6 @@ void function_info::add_param_data( unsigned argn, struct gpgpu_ptx_sim_arg *arg } } -int ptx_branch_taken( void *thd ) -{ - ptx_thread_info *thread = (ptx_thread_info *) thd; - return (thread != NULL) && thread->branch_taken(); -} - template<int activate_level> bool ptx_debug_exec_dump_cond(int thd_uid, addr_t pc) { @@ -1810,8 +1872,8 @@ void gpgpu_ptx_sim_load_gpu_kernels() ptx_parse(); ptxinfo_in = open_ptxinfo(g_filename); ptxinfo_parse(); - load_static_globals(g_global_symbol_table,0x10000000,0xFFFFFFFF); - load_constants(g_global_symbol_table); + load_static_globals(g_global_symbol_table,STATIC_ALLOC_LIMIT,0xFFFFFFFF); + load_constants(g_global_symbol_table,STATIC_ALLOC_LIMIT); } else { if (!g_override_embedded_ptx) { g_used_embedded_ptx_files=1; @@ -1819,8 +1881,8 @@ void gpgpu_ptx_sim_load_gpu_kernels() ptx_info_t *s; for ( s=g_ptx_source_array; s!=NULL; s=s->next ) { gpgpu_ptx_sim_load_ptx_from_string(s->str, ++source_num); - load_static_globals(g_global_symbol_table,0x10000000,0xFFFFFFFF); - load_constants(g_global_symbol_table); + load_static_globals(g_global_symbol_table,STATIC_ALLOC_LIMIT,0xFFFFFFFF); + load_constants(g_global_symbol_table,STATIC_ALLOC_LIMIT); } } else { g_filename = NULL; @@ -1845,8 +1907,8 @@ void gpgpu_ptx_sim_load_gpu_kernels() ptxinfo_in = open_ptxinfo(g_filename); ptxinfo_parse(); g_filename = NULL; - load_static_globals(g_global_symbol_table,0x10000000,0xFFFFFFFF); - load_constants(g_global_symbol_table); + load_static_globals(g_global_symbol_table,STATIC_ALLOC_LIMIT,0xFFFFFFFF); + load_constants(g_global_symbol_table,STATIC_ALLOC_LIMIT); } free(namelist); } |
