summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/shader.h')
-rw-r--r--src/gpgpu-sim/shader.h95
1 files changed, 73 insertions, 22 deletions
diff --git a/src/gpgpu-sim/shader.h b/src/gpgpu-sim/shader.h
index 85d5ac1..786913a 100644
--- a/src/gpgpu-sim/shader.h
+++ b/src/gpgpu-sim/shader.h
@@ -662,7 +662,7 @@ private:
warp_inst_t **port,
unsigned num_banks,
unsigned log2_warp_size,
- const shader_core_config *config,
+ const core_config *config,
opndcoll_rfu_t *rfu );
void allocate( warp_inst_t *&pipeline_reg );
@@ -867,11 +867,7 @@ struct ifetch_buffer_t {
class simd_function_unit {
public:
- simd_function_unit( const shader_core_config *config )
- {
- m_config=config;
- m_dispatch_reg = new warp_inst_t(config);
- }
+ simd_function_unit( const shader_core_config *config );
~simd_function_unit() { delete m_dispatch_reg; }
// modifiers
@@ -894,15 +890,7 @@ protected:
class pipelined_simd_unit : public simd_function_unit {
public:
- pipelined_simd_unit( warp_inst_t **result_port, const shader_core_config *config, unsigned max_latency )
- : simd_function_unit(config)
- {
- m_result_port = result_port;
- m_pipeline_depth = max_latency;
- m_pipeline_reg = new warp_inst_t*[m_pipeline_depth];
- for( unsigned i=0; i < m_pipeline_depth; i++ )
- m_pipeline_reg[i] = new warp_inst_t( config );
- }
+ pipelined_simd_unit( warp_inst_t **result_port, const shader_core_config *config, unsigned max_latency );
//modifiers
virtual void cycle()
@@ -948,8 +936,7 @@ protected:
class sfu : public pipelined_simd_unit
{
public:
- sfu( warp_inst_t **result_port, const shader_core_config *config )
- : pipelined_simd_unit(result_port,config,config->max_sfu_latency) { m_name = "SFU"; }
+ sfu( warp_inst_t **result_port, const shader_core_config *config );
virtual bool can_issue( const warp_inst_t &inst ) const
{
switch(inst.op) {
@@ -964,8 +951,7 @@ public:
class sp_unit : public pipelined_simd_unit
{
public:
- sp_unit( warp_inst_t **result_port, const shader_core_config *config )
- : pipelined_simd_unit(result_port,config,config->max_sp_latency) { m_name = "SP "; }
+ sp_unit( warp_inst_t **result_port, const shader_core_config *config );
virtual bool can_issue( const warp_inst_t &inst ) const
{
switch(inst.op) {
@@ -987,7 +973,7 @@ public:
shader_core_ctx *core,
opndcoll_rfu_t *operand_collector,
Scoreboard *scoreboard,
- shader_core_config *config,
+ const shader_core_config *config,
const memory_config *mem_config,
shader_core_stats *stats,
unsigned sid, unsigned tpc );
@@ -1066,6 +1052,71 @@ enum pipeline_stage_name_t {
N_PIPELINE_STAGES
};
+struct shader_core_config : public core_config
+{
+ void init()
+ {
+ max_warps_per_shader = n_thread_per_shader/warp_size;
+ assert( !(n_thread_per_shader % warp_size) );
+
+ max_sfu_latency = 32;
+ max_sp_latency = 32;
+
+ m_L1I_config.init();
+ m_L1T_config.init();
+ m_L1C_config.init();
+ m_L1D_config.init();
+ gpgpu_cache_dl1_linesize = m_L1D_config.get_line_sz();
+ gpgpu_cache_texl1_linesize = m_L1T_config.get_line_sz();
+ gpgpu_cache_constl1_linesize = m_L1C_config.get_line_sz();
+
+ m_valid = true;
+ }
+
+ bool gpgpu_perfect_mem;
+ enum divergence_support_t model;
+ unsigned n_thread_per_shader;
+ unsigned max_warps_per_shader;
+ unsigned max_cta_per_core; //Limit on number of concurrent CTAs in shader core
+ unsigned pdom_sched_type;
+
+ cache_config m_L1I_config;
+ cache_config m_L1T_config;
+ cache_config m_L1C_config;
+ cache_config m_L1D_config;
+
+ unsigned n_mshr_per_shader;
+ bool gpgpu_dwf_reg_bankconflict;
+ int gpgpu_operand_collector_num_units_sp;
+ int gpgpu_operand_collector_num_units_sfu;
+ int gpgpu_operand_collector_num_units_mem;
+ bool gpgpu_stall_on_use;
+ //Shader core resources
+ unsigned gpgpu_shmem_size;
+ unsigned gpgpu_shader_registers;
+ int gpgpu_warpdistro_shader;
+ int gpgpu_interwarp_mshr_merge;
+ int gpgpu_shmem_port_per_bank;
+ int gpgpu_cache_port_per_bank;
+ int gpgpu_const_port_per_bank;
+ unsigned gpgpu_num_reg_banks;
+ unsigned gpu_max_cta_per_shader; // TODO: modify this for fermi... computed based upon kernel
+ // resource usage; used in shader_core_ctx::translate_local_memaddr
+ bool gpgpu_reg_bank_use_warp_id;
+ bool gpgpu_local_mem_map;
+ int gpu_padded_cta_size;
+
+ unsigned max_sp_latency;
+ unsigned max_sfu_latency;
+
+ unsigned n_simt_cores_per_cluster;
+ unsigned n_simt_clusters;
+ unsigned n_simt_ejection_buffer_size;
+ unsigned ldst_unit_response_queue_size;
+
+ unsigned mem2device(unsigned memid) const { return memid + n_simt_clusters; }
+};
+
class shader_core_ctx : public core_t
{
public:
@@ -1073,7 +1124,7 @@ public:
class simt_core_cluster *cluster,
unsigned shader_id,
unsigned tpc_id,
- struct shader_core_config *config,
+ const struct shader_core_config *config,
const struct memory_config *mem_config,
struct shader_core_stats *stats );
@@ -1190,7 +1241,7 @@ class simt_core_cluster {
public:
simt_core_cluster( class gpgpu_sim *gpu,
unsigned cluster_id,
- struct shader_core_config *config,
+ const struct shader_core_config *config,
const struct memory_config *mem_config,
struct shader_core_stats *stats );