summaryrefslogtreecommitdiff
path: root/src/cuda-sim/cuda-sim.cc
diff options
context:
space:
mode:
authorTayler Hetherington <[email protected]>2012-11-30 21:29:42 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:49:22 -0700
commit36ce0f2243fd0723a746b3c2f5f0651577312400 (patch)
treee79475e75f800ad34b4851ea710c4ee409f5bd72 /src/cuda-sim/cuda-sim.cc
parent08ec3343d0bca75e63e130266f75f8242f22050b (diff)
Merging Power model into Fermi
//depot/gpgpu_sim_research/fermi_power/distribution/... to //depot/gpgpu_sim_research/fermi/distribution/... [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 14723]
Diffstat (limited to 'src/cuda-sim/cuda-sim.cc')
-rw-r--r--src/cuda-sim/cuda-sim.cc89
1 files changed, 88 insertions, 1 deletions
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index 8e01fe7..368ac4a 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -451,7 +451,81 @@ void ptx_print_insn( address_type pc, FILE *fp )
assert( finfo );
size = finfo->print_insn(pc,fp);
}
+void ptx_instruction::set_fp_or_int_archop(){
+ op2=UN_OP;
+ if((m_opcode == SSY_OP )||(m_opcode == BRA_OP) || (m_opcode == BAR_OP) || (m_opcode == RET_OP) || (m_opcode == RETP_OP) || (m_opcode == NOP_OP) || (m_opcode == EXIT_OP) || (m_opcode == CALLP_OP) || (m_opcode == CALL_OP)){
+ // do nothing
+ }else if((m_opcode == CVT_OP || m_opcode == SET_OP || m_opcode == SLCT_OP)){
+ if(get_type2()==F16_TYPE || get_type2()==F32_TYPE || get_type2() == F64_TYPE || get_type2() == FF64_TYPE){
+ op2= FP_OP;
+ }else op2=INT_OP;
+ }else{
+ if(get_type()==F16_TYPE || get_type()==F32_TYPE || get_type() == F64_TYPE || get_type() == FF64_TYPE){
+ op2= FP_OP;
+ }else op2=INT_OP;
+ }
+}
+void ptx_instruction::set_mul_div_or_other_archop(){
+ op3=OTHER_OP;
+ if((m_opcode != SSY_OP) && (m_opcode != BRA_OP) && (m_opcode != BAR_OP) && (m_opcode != EXIT_OP) && (m_opcode != NOP_OP) && (m_opcode != RETP_OP) && (m_opcode != RET_OP) && (m_opcode != CALLP_OP) && (m_opcode != CALL_OP)){
+ if(get_type()==F32_TYPE || get_type() == F64_TYPE || get_type() == FF64_TYPE){
+ switch(get_opcode()){
+ case MUL_OP:
+ case MAD_OP:
+ op3=FP_MUL_OP;
+ break;
+ case DIV_OP:
+ op3=FP_DIV_OP;
+ break;
+ case LG2_OP:
+ op3=FP_LG_OP;
+ break;
+ case RSQRT_OP:
+ case SQRT_OP:
+ op3=FP_SQRT_OP;
+ break;
+ case RCP_OP:
+ op3=FP_DIV_OP;
+ break;
+ case SIN_OP:
+ case COS_OP:
+ op3=FP_SIN_OP;
+ break;
+ case EX2_OP:
+ op3=FP_EXP_OP;
+ break;
+ default:
+ if(op==ALU_OP)
+ op3=FP__OP;
+ break;
+
+ }
+ }else {
+ switch(get_opcode()){
+ case MUL24_OP:
+ case MAD24_OP:
+ op3=INT_MUL24_OP;
+ break;
+ case MUL_OP:
+ case MAD_OP:
+ if(get_type()==U32_TYPE || get_type()==S32_TYPE || get_type()==B32_TYPE)
+ op3=INT_MUL32_OP;
+ else
+ op3=INT_MUL_OP;
+ break;
+ case DIV_OP:
+ op3=INT_DIV_OP;
+ break;
+ default:
+ if(op==ALU_OP)
+ op3=INT__OP;
+ break;
+ }
+ }
+ }
+
+}
void ptx_instruction::set_opcode_and_latency()
{
unsigned int_latency[5];
@@ -486,7 +560,17 @@ void ptx_instruction::set_opcode_and_latency()
&dp_init[0],&dp_init[1],&dp_init[2],
&dp_init[3],&dp_init[4]);
+ if(!m_operands.empty()){
+ std::vector<operand_info>::iterator it;
+ for(it=++m_operands.begin();it!=m_operands.end();it++){
+ num_operands++;
+ if((it->is_reg() || it->is_vector())){
+ num_regs++;
+ }
+ }
+ }
op = ALU_OP;
+ op5= NOT_TEX;
initiation_interval = latency = 1;
switch( m_opcode ) {
case MOV_OP:
@@ -499,7 +583,7 @@ void ptx_instruction::set_opcode_and_latency()
case ST_OP: op = STORE_OP; break;
case BRA_OP: op = BRANCH_OP; break;
case BREAKADDR_OP: op = BRANCH_OP; break;
- case TEX_OP: op = LOAD_OP; break;
+ case TEX_OP: op = LOAD_OP; op5=TEX; break;
case ATOM_OP: op = LOAD_OP; break;
case BAR_OP: op = BARRIER_OP; break;
case MEMBAR_OP: op = MEMORY_BARRIER_OP; break;
@@ -639,6 +723,9 @@ void ptx_instruction::set_opcode_and_latency()
default:
break;
}
+ set_fp_or_int_archop();
+ set_mul_div_or_other_archop();
+
}
void ptx_thread_info::ptx_fetch_inst( inst_t &inst ) const