summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim
diff options
context:
space:
mode:
authorMahmoud Khairy A. Abdallah <[email protected]>2017-07-18 13:04:19 -0400
committerGitHub Enterprise <[email protected]>2017-07-18 13:04:19 -0400
commite7faf0c76c98ccfc6d5ffde90d16a201411d0e2f (patch)
tree907696c48520b45045ee4baa070ba6e50697bcf9 /src/gpgpu-sim
parent36d1f3f1ef1bc53fc053ec7ae381422bd0e98385 (diff)
parentbc69b31897d6e11dc98d4d75bd7b902a42b146bc (diff)
Merge pull request #2 from abdallm/dev-purdue-integration
Improving GPU core model.
Diffstat (limited to 'src/gpgpu-sim')
-rw-r--r--src/gpgpu-sim/gpu-cache.cc3
-rw-r--r--src/gpgpu-sim/gpu-sim.cc20
-rw-r--r--src/gpgpu-sim/mem_fetch.h1
-rw-r--r--src/gpgpu-sim/shader.cc74
-rw-r--r--src/gpgpu-sim/shader.h36
5 files changed, 119 insertions, 15 deletions
diff --git a/src/gpgpu-sim/gpu-cache.cc b/src/gpgpu-sim/gpu-cache.cc
index 5ea4190..7af7db0 100644
--- a/src/gpgpu-sim/gpu-cache.cc
+++ b/src/gpgpu-sim/gpu-cache.cc
@@ -867,7 +867,8 @@ data_cache::wr_miss_wa( new_addr_type addr,
mf->get_data_size(),
false, // Now performing a read
mf->get_access_warp_mask(),
- mf->get_access_byte_mask() );
+ mf->get_access_byte_mask(),
+ mf->get_access_sector_mask());
mem_fetch *n_mf = new mem_fetch( *ma,
NULL,
diff --git a/src/gpgpu-sim/gpu-sim.cc b/src/gpgpu-sim/gpu-sim.cc
index 58a5d16..483a7b6 100644
--- a/src/gpgpu-sim/gpu-sim.cc
+++ b/src/gpgpu-sim/gpu-sim.cc
@@ -285,6 +285,15 @@ void shader_core_config::reg_options(class OptionParser * opp)
option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32, &mem_warp_parts,
"Number of portions a warp is divided into for shared memory bank conflict check ",
"2");
+ option_parser_register(opp, "-gpgpu_L1_warp_parts_cached", OPT_INT32, &L1_warp_parts_cached,
+ "Number of portions a warp is divided into when the request is cached",
+ "2");
+ option_parser_register(opp, "-gpgpu_L1_warp_parts_cached", OPT_INT32, &L1_warp_parts_non_cached,
+ "Number of portions a warp is divided into when the request is not cached",
+ "4");
+ option_parser_register(opp, "-gpgpu_shmem_warp_parts", OPT_INT32, &mem_warp_parts,
+ "Number of portions a warp is divided into for shared memory bank conflict check ",
+ "2");
option_parser_register(opp, "-gpgpu_warpdistro_shader", OPT_INT32, &gpgpu_warpdistro_shader,
"Specify which shader core to collect the warp size distribution from",
"-1");
@@ -293,7 +302,7 @@ void shader_core_config::reg_options(class OptionParser * opp)
"0");
option_parser_register(opp, "-gpgpu_local_mem_map", OPT_BOOL, &gpgpu_local_mem_map,
"Mapping from local memory space address to simulated GPU physical address space (default = enabled)",
- "1");
+ "1");
option_parser_register(opp, "-gpgpu_num_reg_banks", OPT_INT32, &gpgpu_num_reg_banks,
"Number of register banks (default = 8)",
"8");
@@ -337,14 +346,17 @@ void shader_core_config::reg_options(class OptionParser * opp)
"number of collector unit in ports (default = 0)",
"0");
option_parser_register(opp, "-gpgpu_coalesce_arch", OPT_INT32, &gpgpu_coalesce_arch,
- "Coalescing arch (default = 13, anything else is off for now)",
+ "Coalescing arch (GT200 = 13, Fermi = 20)",
"13");
option_parser_register(opp, "-gpgpu_num_sched_per_core", OPT_INT32, &gpgpu_num_sched_per_core,
"Number of warp schedulers per core",
"1");
option_parser_register(opp, "-gpgpu_max_insn_issue_per_warp", OPT_INT32, &gpgpu_max_insn_issue_per_warp,
- "Max number of instructions that can be issued per warp in one cycle by scheduler",
- "2");
+ "Max number of instructions that can be issued per warp in one cycle by scheduler (either 1 or 2)",
+ "2");
+ option_parser_register(opp, "-gpgpu_dual_issue_diff_exec_units", OPT_BOOL, &gpgpu_dual_issue_diff_exec_units,
+ "should dual issue use two different execution unit resources",
+ "1");
option_parser_register(opp, "-gpgpu_simt_core_sim_order", OPT_INT32, &simt_core_sim_order,
"Select the simulation order of cores in a cluster (0=Fix, 1=Round-Robin)",
"1");
diff --git a/src/gpgpu-sim/mem_fetch.h b/src/gpgpu-sim/mem_fetch.h
index c89edbb..db4a8e9 100644
--- a/src/gpgpu-sim/mem_fetch.h
+++ b/src/gpgpu-sim/mem_fetch.h
@@ -104,6 +104,7 @@ public:
enum mem_access_type get_access_type() const { return m_access.get_type(); }
const active_mask_t& get_access_warp_mask() const { return m_access.get_warp_mask(); }
mem_access_byte_mask_t get_access_byte_mask() const { return m_access.get_byte_mask(); }
+ mem_access_sector_mask_t get_access_sector_mask() const { return m_access.get_sector_mask(); }
address_type get_pc() const { return m_inst.empty()?-1:m_inst.pc; }
const warp_inst_t &get_inst() { return m_inst; }
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index d17e51d..bb2cf0e 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -81,6 +81,7 @@ shader_core_ctx::shader_core_ctx( class gpgpu_sim *gpu,
m_memory_config = mem_config;
m_stats = stats;
unsigned warp_size=config->warp_size;
+ Issue_Prio = 0;
m_sid = shader_id;
m_tpc = tpc_id;
@@ -131,6 +132,8 @@ shader_core_ctx::shader_core_ctx( class gpgpu_sim *gpu,
CONCRETE_SCHEDULER_TWO_LEVEL_ACTIVE :
sched_config.find("gto") != std::string::npos ?
CONCRETE_SCHEDULER_GTO :
+ sched_config.find("old") != std::string::npos ?
+ CONCRETE_SCHEDULER_OLDEST_FIRST :
sched_config.find("warp_limiting") != std::string::npos ?
CONCRETE_SCHEDULER_WARP_LIMITING:
NUM_CONCRETE_SCHEDULERS;
@@ -182,6 +185,20 @@ shader_core_ctx::shader_core_ctx( class gpgpu_sim *gpu,
)
);
break;
+ case CONCRETE_SCHEDULER_OLDEST_FIRST:
+ schedulers.push_back(
+ new oldest_scheduler( m_stats,
+ this,
+ m_scoreboard,
+ m_simt_stack,
+ &m_warp,
+ &m_pipeline_reg[ID_OC_SP],
+ &m_pipeline_reg[ID_OC_SFU],
+ &m_pipeline_reg[ID_OC_MEM],
+ i
+ )
+ );
+ break;
case CONCRETE_SCHEDULER_WARP_LIMITING:
schedulers.push_back(
new swl_scheduler( m_stats,
@@ -465,6 +482,14 @@ void shader_core_stats::print( FILE* fout ) const
for (unsigned i = 3; i < m_config->warp_size + 3; i++)
fprintf(fout, "\tW%d:%d", i-2, shader_cycle_distro[i]);
fprintf(fout, "\n");
+ fprintf(fout, "single_issue_nums: ");
+ for (unsigned i = 0; i < m_config->gpgpu_num_sched_per_core; i++)
+ fprintf(fout, "WS%d:%d\t", i, single_issue_nums[i]);
+ fprintf(fout, "\n");
+ fprintf(fout, "dual_issue_nums: ");
+ for (unsigned i = 0; i < m_config->gpgpu_num_sched_per_core; i++)
+ fprintf(fout, "WS%d:%d\t", i, dual_issue_nums[i]);
+ fprintf(fout, "\n");
m_outgoing_traffic_stats->print(fout);
m_incoming_traffic_stats->print(fout);
@@ -724,10 +749,19 @@ void shader_core_ctx::issue_warp( register_set& pipe_reg_set, const warp_inst_t*
}
void shader_core_ctx::issue(){
+
+ //Ensure fair round robin issu between schedulers
+ unsigned j;
+ for (unsigned i = 0; i < schedulers.size(); i++) {
+ j = (Issue_Prio + i) % schedulers.size();
+ schedulers[j]->cycle();
+ }
+ Issue_Prio = (Issue_Prio+1)% schedulers.size();
+
//really is issue;
- for (unsigned i = 0; i < schedulers.size(); i++) {
- schedulers[i]->cycle();
- }
+ //for (unsigned i = 0; i < schedulers.size(); i++) {
+ // schedulers[i]->cycle();
+ //}
}
shd_warp_t& scheduler_unit::warp(int i){
@@ -842,7 +876,9 @@ void scheduler_unit::cycle()
unsigned warp_id = (*iter)->get_warp_id();
unsigned checked=0;
unsigned issued=0;
- unsigned max_issue = m_shader->m_config->gpgpu_max_insn_issue_per_warp;
+ exec_unit_type_t previous_issued_inst_exec_type = exec_unit_type_t::NONE;
+ unsigned max_issue = m_shader->m_config->gpgpu_max_insn_issue_per_warp;
+ bool diff_exec_units = m_shader->m_config->gpgpu_dual_issue_diff_exec_units;
while( !warp(warp_id).waiting() && !warp(warp_id).ibuffer_empty() && (checked < max_issue) && (checked <= issued) && (issued < max_issue) ) {
const warp_inst_t *pI = warp(warp_id).ibuffer_next_inst();
//Jin: handle cdp latency;
@@ -876,16 +912,17 @@ void scheduler_unit::cycle()
const active_mask_t &active_mask = m_simt_stack[warp_id]->get_active_mask();
assert( warp(warp_id).inst_in_pipeline() );
if ( (pI->op == LOAD_OP) || (pI->op == STORE_OP) || (pI->op == MEMORY_BARRIER_OP) ) {
- if( m_mem_out->has_free() ) {
+ if( m_mem_out->has_free() && (!diff_exec_units || previous_issued_inst_exec_type != exec_unit_type_t::MEM)) {
m_shader->issue_warp(*m_mem_out,pI,active_mask,warp_id);
issued++;
issued_inst=true;
warp_inst_issued = true;
+ previous_issued_inst_exec_type = exec_unit_type_t::MEM;
}
} else {
bool sp_pipe_avail = m_sp_out->has_free();
bool sfu_pipe_avail = m_sfu_out->has_free();
- if( sp_pipe_avail && (pI->op != SFU_OP) ) {
+ if( sp_pipe_avail && (pI->op != SFU_OP) && (!diff_exec_units || previous_issued_inst_exec_type != exec_unit_type_t::SP)) {
//Jin: special for CDP api
if(pI->m_is_cdp && !warp(warp_id).m_cdp_dummy) {
@@ -910,14 +947,17 @@ void scheduler_unit::cycle()
issued++;
issued_inst=true;
warp_inst_issued = true;
- } else if ( (pI->op == SFU_OP) || (pI->op == ALU_SFU_OP) ) {
+ previous_issued_inst_exec_type = exec_unit_type_t::SP;
+ } else if ( (pI->op == SFU_OP) || (pI->op == ALU_SFU_OP) && (!diff_exec_units || previous_issued_inst_exec_type != exec_unit_type_t::SFU)) {
if( sfu_pipe_avail ) {
m_shader->issue_warp(*m_sfu_out,pI,active_mask,warp_id);
issued++;
issued_inst=true;
warp_inst_issued = true;
+ previous_issued_inst_exec_type = exec_unit_type_t::SFU;
}
- } }
+ }
+ }
} else {
SCHED_DPRINTF( "Warp (warp_id %u, dynamic_warp_id %u) fails scoreboard\n",
(*iter)->get_warp_id(), (*iter)->get_dynamic_warp_id() );
@@ -952,6 +992,14 @@ void scheduler_unit::cycle()
m_last_supervised_issued = supervised_iter;
}
}
+
+ if(issued == 1)
+ m_stats->single_issue_nums[m_id]++;
+ else if(issued > 1)
+ m_stats->dual_issue_nums[m_id]++;
+ else
+ abort(); //issued should be > 0
+
break;
}
}
@@ -1009,6 +1057,16 @@ void gto_scheduler::order_warps()
scheduler_unit::sort_warps_by_oldest_dynamic_id );
}
+void oldest_scheduler::order_warps()
+{
+ order_by_priority( m_next_cycle_prioritized_warps,
+ m_supervised_warps,
+ m_last_supervised_issued,
+ m_supervised_warps.size(),
+ ORDERED_PRIORITY_FUNC_ONLY,
+ scheduler_unit::sort_warps_by_oldest_dynamic_id );
+}
+
void
two_level_active_scheduler::do_on_warp_issued( unsigned warp_id,
unsigned num_issued,
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index bdd8dbe..2fed420 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -70,6 +70,14 @@
#define WRITE_MASK_SIZE 8
+enum exec_unit_type_t
+{
+ NONE = 0,
+ SP = 1,
+ SFU = 2,
+ MEM = 3,
+ DP = 4
+};
class thread_ctx_t {
public:
@@ -308,6 +316,7 @@ enum concrete_scheduler
CONCRETE_SCHEDULER_GTO,
CONCRETE_SCHEDULER_TWO_LEVEL_ACTIVE,
CONCRETE_SCHEDULER_WARP_LIMITING,
+ CONCRETE_SCHEDULER_OLDEST_FIRST,
NUM_CONCRETE_SCHEDULERS
};
@@ -435,6 +444,23 @@ public:
};
+class oldest_scheduler : public scheduler_unit {
+public:
+ oldest_scheduler ( shader_core_stats* stats, shader_core_ctx* shader,
+ Scoreboard* scoreboard, simt_stack** simt,
+ std::vector<shd_warp_t>* warp,
+ register_set* sp_out,
+ register_set* sfu_out,
+ register_set* mem_out,
+ int id )
+ : scheduler_unit ( stats, shader, scoreboard, simt, warp, sp_out, sfu_out, mem_out, id ){}
+ virtual ~oldest_scheduler () {}
+ virtual void order_warps ();
+ virtual void done_adding_supervised_warps() {
+ m_last_supervised_issued = m_supervised_warps.begin();
+ }
+
+};
class two_level_active_scheduler : public scheduler_unit {
public:
@@ -1294,12 +1320,11 @@ struct shader_core_config : public core_config
mutable cache_config m_L1C_config;
mutable l1d_cache_config m_L1D_config;
- bool gmem_skip_L1D; // on = global memory access always skip the L1 cache
-
bool gpgpu_dwf_reg_bankconflict;
int gpgpu_num_sched_per_core;
int gpgpu_max_insn_issue_per_warp;
+ bool gpgpu_dual_issue_diff_exec_units;
//op collector
int gpgpu_operand_collector_num_units_sp;
@@ -1401,6 +1426,8 @@ struct shader_core_stats_pod {
unsigned *last_shader_cycle_distro;
unsigned *num_warps_issuable;
unsigned gpgpu_n_stall_shd_mem;
+ unsigned* single_issue_nums;
+ unsigned* dual_issue_nums;
//memory access classification
int gpgpu_n_mem_read_local;
@@ -1469,6 +1496,8 @@ public:
m_n_diverge = (unsigned*) calloc(config->num_shader(),sizeof(unsigned));
shader_cycle_distro = (unsigned*) calloc(config->warp_size+3, sizeof(unsigned));
last_shader_cycle_distro = (unsigned*) calloc(m_config->warp_size+3, sizeof(unsigned));
+ single_issue_nums = (unsigned*) calloc(config->gpgpu_num_sched_per_core,sizeof(unsigned));
+ dual_issue_nums = (unsigned*) calloc(config->gpgpu_num_sched_per_core, sizeof(unsigned));
n_simt_to_mem = (long *)calloc(config->num_shader(), sizeof(long));
n_mem_to_simt = (long *)calloc(config->num_shader(), sizeof(long));
@@ -1830,6 +1859,9 @@ public:
//schedule
std::vector<scheduler_unit*> schedulers;
+ //issue
+ unsigned int Issue_Prio;
+
// execute
unsigned m_num_function_units;
std::vector<pipeline_stage_name_t> m_dispatch_port;