summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.h
diff options
context:
space:
mode:
authorAndrew M. B. Boktor <[email protected]>2012-07-02 22:11:33 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:47:33 -0700
commitdadb44ad16727623476a1e6947453da81ed682c7 (patch)
tree095da91d5386468dbf28e3512ba8e02b2f5d110d /src/gpgpu-sim/shader.h
parentbb96888d31d37760c86fa1aed3bbf203792185e7 (diff)
Adding a two level scheduler as described in the ISCA 2012 tutorial
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 13261]
Diffstat (limited to 'src/gpgpu-sim/shader.h')
-rw-r--r--src/gpgpu-sim/shader.h57
1 files changed, 51 insertions, 6 deletions
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 341915e..5612150 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -258,12 +258,14 @@ public:
register_set* mem_out)
: supervised_warps(), m_last_sup_id_issued(0), m_stats(stats), m_shader(shader),
m_scoreboard(scoreboard), m_simt_stack(simt), /*m_pipeline_reg(pipe_regs),*/ m_warp(warp),
- m_sp_out(sp_out),m_sfu_out(sfu_out),m_mem_out(mem_out){}
- void add_supervised_warp_id(int i) {
+ m_sp_out(sp_out),m_sfu_out(sfu_out),m_mem_out(mem_out){}
+ virtual ~scheduler_unit(){}
+ virtual void add_supervised_warp_id(int i) {
supervised_warps.push_back(i);
}
- void cycle();
-private:
+
+ virtual void cycle()=0;
+protected:
shd_warp_t& warp(int i);
std::vector<int> supervised_warps;
@@ -280,8 +282,45 @@ private:
register_set* m_mem_out;
};
+class LooseRoundRobbinScheduler : public scheduler_unit {
+public:
+ LooseRoundRobbinScheduler (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)
+ : scheduler_unit (stats, shader, scoreboard, simt, warp, sp_out, sfu_out, mem_out){}
+ virtual ~LooseRoundRobbinScheduler () {}
+ virtual void cycle ();
+};
+class TwoLevelScheduler : public scheduler_unit {
+public:
+ TwoLevelScheduler (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,
+ unsigned maw)
+ : scheduler_unit (stats, shader, scoreboard, simt, warp, sp_out, sfu_out, mem_out),
+ activeWarps(),
+ pendingWarps(){
+ maxActiveWarps = maw;
+ }
+ virtual ~TwoLevelScheduler () {}
+ virtual void cycle ();
+ virtual void add_supervised_warp_id(int i) {
+ pendingWarps.push_back(i);
+ }
+private:
+ unsigned maxActiveWarps;
+ std::list<int> activeWarps;
+ std::list<int> pendingWarps;
+};
+
class opndcoll_rfu_t { // operand collector based register file unit
@@ -985,6 +1024,8 @@ struct shader_core_config : public core_config
unsigned max_warps_per_shader;
unsigned max_cta_per_core; //Limit on number of concurrent CTAs in shader core
+ char * gpgpu_scheduler_string;
+
char* pipeline_widths_string;
int pipe_widths[N_PIPELINE_STAGES];
@@ -1016,7 +1057,7 @@ struct shader_core_config : public core_config
int gpgpu_num_sp_units;
int gpgpu_num_sfu_units;
- int gpgpu_num_mem_units;
+ int gpgpu_num_mem_units;
//Shader core resources
unsigned gpgpu_shader_registers;
@@ -1101,6 +1142,8 @@ private:
friend class ldst_unit;
friend class simt_core_cluster;
friend class scheduler_unit;
+ friend class TwoLevelScheduler;
+ friend class LooseRoundRobbinScheduler;
};
class shader_core_mem_fetch_allocator : public mem_fetch_allocator {
@@ -1218,6 +1261,8 @@ private:
void issue();
friend class scheduler_unit; //this is needed to use private issue warp.
+ friend class TwoLevelScheduler;
+ friend class LooseRoundRobbinScheduler;
void issue_warp( register_set& warp, const warp_inst_t *pI, const active_mask_t &active_mask, unsigned warp_id );
void func_exec_inst( warp_inst_t &inst );
@@ -1272,7 +1317,7 @@ private:
opndcoll_rfu_t m_operand_collector;
//schedule
- std::vector<scheduler_unit> schedulers;
+ std::vector<scheduler_unit*> schedulers;
// execute
unsigned m_num_function_units;