summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ <[email protected]>2018-08-08 09:53:11 -0700
committerJ <[email protected]>2018-08-08 09:53:11 -0700
commit3326dfc7a3a574b6d9841b8c45e900bf262dc8cd (patch)
tree98f10f2ceb610be84155e01cd79683126138650b /src
parentbd57c117c1b109176083b3824b4775ba208eec23 (diff)
parent95121fefda110e5984e36ae630186d0c73887202 (diff)
Merge remote-tracking branch 'upstream/dev' into dev
Diffstat (limited to 'src')
-rw-r--r--src/cuda-sim/ptx_ir.h12
-rw-r--r--src/cuda-sim/ptx_parser.cc34
-rw-r--r--src/gpgpu-sim/shader.cc21
-rw-r--r--src/gpgpu-sim/shader.h2
4 files changed, 58 insertions, 11 deletions
diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h
index ef4cf48..e726ab9 100644
--- a/src/cuda-sim/ptx_ir.h
+++ b/src/cuda-sim/ptx_ir.h
@@ -1293,6 +1293,17 @@ public:
bool is_pdom_set() const { return pdom_done; } //return pdom flag
void set_pdom() { pdom_done = true; } //set pdom flag
+ void add_config_param( size_t size, unsigned alignment ){
+ unsigned offset = 0;
+ if (m_param_configs.size()>0){
+ unsigned offset_nom = m_param_configs.back().first + m_param_configs.back().second;
+ offset = offset_nom%alignment ? (offset_nom/alignment + 1) * alignment : offset_nom;
+ }
+ m_param_configs.push_back(std::pair<size_t,unsigned>(size, offset));
+ }
+
+ std::pair<size_t, unsigned> get_param_config(unsigned param_num) const { return m_param_configs[param_num]; }
+
private:
unsigned m_uid;
unsigned m_local_mem_framesize;
@@ -1306,6 +1317,7 @@ private:
unsigned m_instr_mem_size;
std::map<std::string,param_t> m_kernel_params;
std::map<unsigned,param_info> m_ptx_kernel_param_info;
+ std::vector< std::pair<size_t, unsigned> > m_param_configs;
const symbol *m_return_var_sym;
std::vector<const symbol*> m_args;
std::list<ptx_instruction*> m_instructions;
diff --git a/src/cuda-sim/ptx_parser.cc b/src/cuda-sim/ptx_parser.cc
index c418fac..e6d6325 100644
--- a/src/cuda-sim/ptx_parser.cc
+++ b/src/cuda-sim/ptx_parser.cc
@@ -61,6 +61,7 @@ memory_space_t g_ptr_spec = undefined_space;
int g_scalar_type_spec = -1;
int g_vector_spec = -1;
int g_alignment_spec = -1;
+int g_size = -1;
int g_extern_spec = 0;
// variable declaration stuff:
@@ -116,6 +117,7 @@ void init_directive_state()
g_vector_spec=-1;
g_opcode=-1;
g_alignment_spec = -1;
+ g_size = -1;
g_extern_spec = 0;
g_scalar_type.clear();
g_operands.clear();
@@ -373,6 +375,9 @@ int pad_address (new_addr_type address, unsigned size, unsigned maxalign) {
void add_identifier( const char *identifier, int array_dim, unsigned array_ident )
{
+ if(array_ident==ARRAY_IDENTIFIER){
+ g_size *= array_dim;
+ }
if( g_func_decl && (g_func_info == NULL) ) {
// return variable decl...
assert( g_add_identifier_cached__identifier == NULL );
@@ -562,10 +567,13 @@ void add_constptr(const char* identifier1, const char* identifier2, int offset)
void add_function_arg()
{
+ assert(g_size>0);
if( g_func_info ) {
PTX_PARSE_DPRINTF("add_function_arg \"%s\"", g_last_symbol->name().c_str() );
g_func_info->add_arg(g_last_symbol);
+ g_func_info->add_config_param( g_size, g_alignment_spec );
}
+
}
void add_extern_spec()
@@ -617,6 +625,32 @@ void add_vector_spec(int spec )
void add_scalar_type_spec( int type_spec )
{
+ //save size of parameter
+ switch ( type_spec ) {
+ case B8_TYPE:
+ case S8_TYPE:
+ case U8_TYPE:
+ g_size = 1; break;
+ case B16_TYPE:
+ case S16_TYPE:
+ case U16_TYPE:
+ case F16_TYPE:
+ g_size = 2; break;
+ case B32_TYPE:
+ case S32_TYPE:
+ case U32_TYPE:
+ case F32_TYPE:
+ g_size = 4; break;
+ case B64_TYPE:
+ case BB64_TYPE:
+ case S64_TYPE:
+ case U64_TYPE:
+ case F64_TYPE:
+ case FF64_TYPE:
+ g_size = 8; break;
+ case BB128_TYPE:
+ g_size = 16; break;
+ }
PTX_PARSE_DPRINTF("add_scalar_type_spec \"%s\"", g_ptx_token_decode[type_spec].c_str());
g_scalar_type.push_back( type_spec );
if ( g_scalar_type.size() > 1 ) {
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 4640d65..0a5e11f 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -3025,19 +3025,20 @@ int register_bank(int regnum, int wid, unsigned num_banks, unsigned bank_warp_sh
return bank % num_banks;
}
-bool opndcoll_rfu_t::writeback( const warp_inst_t &inst )
+bool opndcoll_rfu_t::writeback( warp_inst_t &inst )
{
assert( !inst.empty() );
std::list<unsigned> regs = m_shader->get_regs_written(inst);
- std::list<unsigned>::iterator r;
- unsigned n=0;
- for( r=regs.begin(); r!=regs.end();r++,n++ ) {
- unsigned reg = *r;
- unsigned bank = register_bank(reg,inst.warp_id(),m_num_banks,m_bank_warp_shift);
- if( m_arbiter.bank_idle(bank) ) {
- m_arbiter.allocate_bank_for_write(bank,op_t(&inst,reg,m_num_banks,m_bank_warp_shift));
- } else {
- return false;
+ for( unsigned op=0; op < MAX_REG_OPERANDS; op++ ) {
+ int reg_num = inst.arch_reg.dst[op]; // this math needs to match that used in function_info::ptx_decode_inst
+ if( reg_num >= 0 ){ // valid register
+ unsigned bank = register_bank(reg_num,inst.warp_id(),m_num_banks,m_bank_warp_shift);
+ if( m_arbiter.bank_idle(bank) ) {
+ m_arbiter.allocate_bank_for_write(bank,op_t(&inst,reg_num,m_num_banks,m_bank_warp_shift));
+ inst.arch_reg.dst[op] = -1;
+ } else {
+ return false;
+ }
}
}
for(unsigned i=0;i<(unsigned)regs.size();i++){
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 6201840..958abc4 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -525,7 +525,7 @@ public:
void init( unsigned num_banks, shader_core_ctx *shader );
// modifiers
- bool writeback( const warp_inst_t &warp ); // might cause stall
+ bool writeback( warp_inst_t &warp );
void step()
{