summaryrefslogtreecommitdiff
path: root/src/trace-driven/gpgpusim_trace_driven_main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace-driven/gpgpusim_trace_driven_main.cc')
-rw-r--r--src/trace-driven/gpgpusim_trace_driven_main.cc191
1 files changed, 175 insertions, 16 deletions
diff --git a/src/trace-driven/gpgpusim_trace_driven_main.cc b/src/trace-driven/gpgpusim_trace_driven_main.cc
index 4f973cd..c61810f 100644
--- a/src/trace-driven/gpgpusim_trace_driven_main.cc
+++ b/src/trace-driven/gpgpusim_trace_driven_main.cc
@@ -1,7 +1,6 @@
//developed by Mahmoud Khairy, Purdue Univ
-//#include "../abstract_hardware_model.h"
#include <time.h>
#include <stdio.h>
#include <vector>
@@ -12,7 +11,7 @@
#include <stdio.h>
#include <math.h>
-
+//#include "../abstract_hardware_model.h"
//#include "../option_parser.h"
//#include "../cuda-sim/cuda-sim.h"
//#include "../cuda-sim/ptx_ir.h"
@@ -22,6 +21,7 @@
//#include "../gpgpu-sim/icnt_wrapper.h"
#include "../../libcuda/gpgpu_context.h"
#include "trace_driven.h"
+#include "trace_opcode.h"
//#include "../stream_manager.h"
@@ -198,7 +198,7 @@ trace_kernel_info_t* trace_parser::parse_kernel_info(const std::string& kerneltr
dim3 blockDim(tb_dim_x, tb_dim_y, tb_dim_z);
trace_function_info* function_info = new trace_function_info(info, m_gpgpu_context);
function_info->set_name(kernel_name.c_str());
- trace_kernel_info_t* kernel_info = new trace_kernel_info_t(gridDim, blockDim, function_info, &ifs, m_gpgpu_sim);
+ trace_kernel_info_t* kernel_info = new trace_kernel_info_t(gridDim, blockDim, function_info, &ifs, m_gpgpu_sim, m_gpgpu_context);
return kernel_info;
}
@@ -261,7 +261,7 @@ bool trace_kernel_info_t::get_next_threadblock_traces(std::vector<std::vector<tr
}
else {
assert(start_of_tb_stream_found);
- trace_warp_inst_t inst(m_gpgpu_sim->getShaderCoreConfig());
+ trace_warp_inst_t inst(m_gpgpu_sim->getShaderCoreConfig(), m_gpgpu_context);
inst.parse_from_string(line);
threadblock_traces[warp_id].push_back(inst);
}
@@ -317,14 +317,15 @@ bool trace_warp_inst_t::parse_from_string(std::string trace){
}
//After parsing, fill the inst_t and warp_inst_t params
+
+ //fill active mask
active_mask_t active_mask = mask_bits;
set_active( active_mask );
- for(unsigned i=0; i<warp_size(); ++i)
- set_addr(i, mem_addresses[i]);
-
+ //get the opcode
std::string opcode1 = opcode.substr(0, opcode.find("."));
+ //fill and initialize common params
m_decoded = true;
pc = m_pc;
isize = 16; //TO DO, change this
@@ -334,23 +335,181 @@ bool trace_warp_inst_t::parse_from_string(std::string trace){
for(unsigned i=0; i<MAX_INPUT_VALUES; i++) {
in[i] = 0;
}
- incount=0;
- outcount=0;
+
is_vectorin = 0;
is_vectorout = 0;
+ ar1 = 0;
+ ar2 = 0;
+ memory_op = no_memory_op;
+ data_size = 0;
- /*
- switch(opcode1){
- case "MOV":
- incount=1;
+ num_regs = reg_srcs_num+1;
+ num_operands = num_regs;
+ op = ALU_OP;
+ mem_op= NOT_TEX;
+
+
+ //fill regs information
+ outcount=1;
+ out[0]=reg_dest;
+ arch_reg.dst[0]=reg_dest;
+
+ incount=reg_srcs_num;
+ for(unsigned m=0; m<reg_srcs_num; ++m){
+ in[m]=reg_srcs[m];
+ arch_reg.src[m]=reg_srcs[m];
+ }
+ //handle: vector, store insts have no output, double inst and hmma, and 64 bit address
+
+
+ //get opcode and category
+ std::unordered_map<const char*,OpcodeChar>::const_iterator it= OpcodeMap.find(opcode1.c_str());
+ if (it != OpcodeMap.end()) {
+ m_opcode = it->second.opcode;
+ op = (op_type)(it->second.opcode_category);
+ }
+ else
+ assert(0 && "undefined instruction");
+
+
+ //fill latency and initl
+ set_latency(op);
+
+ //fill addresses
+ if(mem_width > 0) {
+ for(unsigned i=0; i<warp_size(); ++i)
+ set_addr(i, mem_addresses[i]);
+ }
+
+ //fill memory space
+ switch(m_opcode){
+ case OP_LD:
+ case OP_LDG:
+ case OP_LDL:
+ assert(mem_width>0);
+ data_size = mem_width;
+ memory_op = memory_load;
+ if(m_opcode == OP_LDL)
+ space.set_type(local_space);
+ else
+ space.set_type(global_space);
break;
- default:
- std::cout<<"unknown instruction: "<<opcode;
+ case OP_ST:
+ case OP_STG:
+ case OP_STL:
+ case OP_ATOM:
+ case OP_ATOMG:
+ case OP_RED:
+ assert(mem_width>0);
+ data_size = mem_width;
+ memory_op = memory_store;
+ if(m_opcode == OP_STL)
+ space.set_type(local_space);
+ else
+ space.set_type(global_space);
+
+ if(m_opcode == OP_ATOM || m_opcode == OP_ATOMG || m_opcode == OP_RED)
+ m_isatomic = true;
+ break;
+ case OP_LDS:
+ case OP_STS:
+ case OP_ATOMS:
+ assert(mem_width>0);
+ data_size = mem_width;
+ space.set_type(shared_space);
break;
+
+ default:
+ break;
}
- */
return true;
}
+void trace_warp_inst_t::set_latency(unsigned category)
+{
+ unsigned int_latency[5];
+ unsigned fp_latency[5];
+ unsigned dp_latency[5];
+ unsigned sfu_latency;
+ unsigned tensor_latency;
+ unsigned int_init[5];
+ unsigned fp_init[5];
+ unsigned dp_init[5];
+ unsigned sfu_init;
+ unsigned tensor_init;
+
+ /*
+ * [0] ADD,SUB
+ * [1] MAX,Min
+ * [2] MUL
+ * [3] MAD
+ * [4] DIV
+ */
+ sscanf(m_gpgpu_context->func_sim->opcode_latency_int, "%u,%u,%u,%u,%u",
+ &int_latency[0],&int_latency[1],&int_latency[2],
+ &int_latency[3],&int_latency[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_latency_fp, "%u,%u,%u,%u,%u",
+ &fp_latency[0],&fp_latency[1],&fp_latency[2],
+ &fp_latency[3],&fp_latency[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_latency_dp, "%u,%u,%u,%u,%u",
+ &dp_latency[0],&dp_latency[1],&dp_latency[2],
+ &dp_latency[3],&dp_latency[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_latency_sfu, "%u",
+ &sfu_latency);
+ sscanf(m_gpgpu_context->func_sim->opcode_latency_tensor, "%u",
+ &tensor_latency);
+ sscanf(m_gpgpu_context->func_sim->opcode_initiation_int, "%u,%u,%u,%u,%u",
+ &int_init[0],&int_init[1],&int_init[2],
+ &int_init[3],&int_init[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_initiation_fp, "%u,%u,%u,%u,%u",
+ &fp_init[0],&fp_init[1],&fp_init[2],
+ &fp_init[3],&fp_init[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_initiation_dp, "%u,%u,%u,%u,%u",
+ &dp_init[0],&dp_init[1],&dp_init[2],
+ &dp_init[3],&dp_init[4]);
+ sscanf(m_gpgpu_context->func_sim->opcode_initiation_sfu, "%u",
+ &sfu_init);
+ sscanf(m_gpgpu_context->func_sim->opcode_initiation_tensor, "%u",
+ &tensor_init);
+ sscanf(m_gpgpu_context->func_sim->cdp_latency_str, "%u,%u,%u,%u,%u",
+ &m_gpgpu_context->func_sim->cdp_latency[0],
+ &m_gpgpu_context->func_sim->cdp_latency[1],
+ &m_gpgpu_context->func_sim->cdp_latency[2],
+ &m_gpgpu_context->func_sim->cdp_latency[3],
+ &m_gpgpu_context->func_sim->cdp_latency[4]);
+
+ initiation_interval = latency = 1;
+
+ switch(category){
+ case ALU_OP:
+ case INTP_OP:
+ case BRANCH_OP:
+ case CALL_OPS:
+ case RET_OPS:
+ latency = int_latency[0];
+ initiation_interval = int_init[0];
+ break;
+ case SP_OP:
+ latency = fp_latency[0];
+ initiation_interval = fp_latency[0];
+ break;
+ case DP_OP:
+ latency = dp_latency[0];
+ initiation_interval = dp_latency[0];
+ break;
+ case SFU_OP:
+ latency = sfu_latency;
+ initiation_interval = sfu_init;
+ break;
+ case TENSOR_CORE_OP:
+ latency = tensor_latency;
+ initiation_interval = tensor_init;
+ break;
+ default:
+ break;
+ }
+
+}
+