diff options
| -rw-r--r-- | src/gpgpu-sim/gpu-cache.cc | 36 | ||||
| -rw-r--r-- | src/gpgpu-sim/gpu-cache.h | 24 |
2 files changed, 30 insertions, 30 deletions
diff --git a/src/gpgpu-sim/gpu-cache.cc b/src/gpgpu-sim/gpu-cache.cc index 690657f..bc86b83 100644 --- a/src/gpgpu-sim/gpu-cache.cc +++ b/src/gpgpu-sim/gpu-cache.cc @@ -387,7 +387,7 @@ void data_cache::send_write_request(mem_fetch *mf, cache_event request, unsigned /****** Write-hit functions (Set by config file) ******/ /// Write-back hit: Mark block as modified -cache_request_status data_cache::wr_hit_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +cache_request_status data_cache::wr_hit_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ new_addr_type block_addr = m_config.block_addr(addr); m_tag_array.access(block_addr,time,cache_index); // update LRU state cache_block_t &block = m_tag_array.get_block(cache_index); @@ -397,7 +397,7 @@ cache_request_status data_cache::wr_hit_wb(new_addr_type addr, unsigned cache_in } /// Write-through hit: Directly send request to lower level memory -cache_request_status data_cache::wr_hit_wt(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +cache_request_status data_cache::wr_hit_wt(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ if(miss_queue_full(0)) return RESERVATION_FAIL; // cannot handle request this cycle @@ -413,7 +413,7 @@ cache_request_status data_cache::wr_hit_wt(new_addr_type addr, unsigned cache_in } /// Write-evict hit: Send request to lower level memory and invalidate corresponding block -cache_request_status data_cache::wr_hit_we(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +cache_request_status data_cache::wr_hit_we(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ if(miss_queue_full(0)) return RESERVATION_FAIL; // cannot handle request this cycle @@ -427,18 +427,18 @@ cache_request_status data_cache::wr_hit_we(new_addr_type addr, unsigned cache_in } /// Global write-evict, local write-back: Useful for private caches -enum cache_request_status data_cache::wr_hit_global_we_local_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +enum cache_request_status data_cache::wr_hit_global_we_local_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ bool evict = (mf->get_access_type() == GLOBAL_ACC_W); // evict a line that hits on global memory write if(evict) - return wr_hit_we(addr, cache_index, mf, time, events); // Write-evict + return wr_hit_we(addr, cache_index, mf, time, events, status); // Write-evict else - return wr_hit_wb(addr, cache_index, mf, time, events); // Write-back + return wr_hit_wb(addr, cache_index, mf, time, events, status); // Write-back } /****** Write-miss functions (Set by config file) ******/ /// Write-allocate miss: Send write request to lower level memory and send a read request for the same block -enum cache_request_status data_cache::wr_miss_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events) { +enum cache_request_status data_cache::wr_miss_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status) { new_addr_type block_addr = m_config.block_addr(addr); @@ -488,7 +488,7 @@ enum cache_request_status data_cache::wr_miss_wa(new_addr_type addr, unsigned ca } /// No write-allocate miss: Simply send write request to lower level memory -enum cache_request_status data_cache::wr_miss_no_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +enum cache_request_status data_cache::wr_miss_no_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ if(miss_queue_full(0)) return RESERVATION_FAIL; // cannot handle request this cycle @@ -500,7 +500,7 @@ enum cache_request_status data_cache::wr_miss_no_wa(new_addr_type addr, unsigned /****** Read hit functions (Set by config file) ******/ /// Baseline read hit: Update LRU status of block. Special case for atomic instructions -> Mark block as modified -enum cache_request_status data_cache::rd_hit_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +enum cache_request_status data_cache::rd_hit_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ new_addr_type block_addr = m_config.block_addr(addr); m_tag_array.access(block_addr,time,cache_index); if(mf->isatomic()){ // Atomics treated as global read/write requests - Perform read, mark line as MODIFIED @@ -514,7 +514,7 @@ enum cache_request_status data_cache::rd_hit_base(new_addr_type addr, unsigned c /****** Read miss functions (Set by config file) ******/ /// Baseline read miss: Send read request to lower level memory, perform write-back as necessary -enum cache_request_status data_cache::rd_miss_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events ){ +enum cache_request_status data_cache::rd_miss_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status ){ if(miss_queue_full(1)) return RESERVATION_FAIL; // cannot handle request this cycle (might need to generate two requests) @@ -570,15 +570,15 @@ enum cache_request_status l1_cache::access( new_addr_type addr, mem_fetch *mf, u // Function pointers were used to avoid many long conditional branches resulting from many cache configuration options. if(wr){ // Write if(status == HIT){ - return (this->*m_wr_hit)(addr, cache_index, mf, time, events); + return (this->*m_wr_hit)(addr, cache_index, mf, time, events, status); }else if ( status != RESERVATION_FAIL ) { - return (this->*m_wr_miss)(addr, cache_index, mf, time, events); + return (this->*m_wr_miss)(addr, cache_index, mf, time, events, status); } }else{ // Read if(status == HIT){ - return (this->*m_rd_hit)(addr, cache_index, mf, time, events); + return (this->*m_rd_hit)(addr, cache_index, mf, time, events, status); }else if ( status != RESERVATION_FAIL ) { - return (this->*m_rd_miss)(addr, cache_index, mf, time, events); + return (this->*m_rd_miss)(addr, cache_index, mf, time, events, status); } } return RESERVATION_FAIL; @@ -597,15 +597,15 @@ enum cache_request_status l2_cache::access( new_addr_type addr, mem_fetch *mf, u // Function pointers were used to avoid many long conditional branches resulting from many cache configuration options. if(wr){ // Write if(status == HIT){ - return (this->*m_wr_hit)(addr, cache_index, mf, time, events); + return (this->*m_wr_hit)(addr, cache_index, mf, time, events, status); }else if ( status != RESERVATION_FAIL ) { - return (this->*m_wr_miss)(addr, cache_index, mf, time, events); + return (this->*m_wr_miss)(addr, cache_index, mf, time, events, status); } }else{ // Read if(status == HIT){ - return (this->*m_rd_hit)(addr, cache_index, mf, time, events); + return (this->*m_rd_hit)(addr, cache_index, mf, time, events, status); }else if ( status != RESERVATION_FAIL ) { - return (this->*m_rd_miss)(addr, cache_index, mf, time, events); + return (this->*m_rd_miss)(addr, cache_index, mf, time, events, status); } } return RESERVATION_FAIL; diff --git a/src/gpgpu-sim/gpu-cache.h b/src/gpgpu-sim/gpu-cache.h index 86183d3..bbf62b6 100644 --- a/src/gpgpu-sim/gpu-cache.h +++ b/src/gpgpu-sim/gpu-cache.h @@ -478,29 +478,29 @@ protected: // Member Function pointers - Set by configuration options to the functions below each grouping /******* Write-hit configs *******/ - enum cache_request_status (data_cache::*m_wr_hit)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); + enum cache_request_status (data_cache::*m_wr_hit)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); /// Marks block as MODIFIED and updates block LRU - enum cache_request_status wr_hit_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // write-back - enum cache_request_status wr_hit_wt(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // write-through + enum cache_request_status wr_hit_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // write-back + enum cache_request_status wr_hit_wt(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // write-through /// Marks block as INVALID and sends write request to lower level memory - enum cache_request_status wr_hit_we(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // write-evict - enum cache_request_status wr_hit_global_we_local_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // global write-evict, local write-back + enum cache_request_status wr_hit_we(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // write-evict + enum cache_request_status wr_hit_global_we_local_wb(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // global write-evict, local write-back /******* Write-miss configs *******/ - enum cache_request_status (data_cache::*m_wr_miss)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); + enum cache_request_status (data_cache::*m_wr_miss)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); /// Sends read request, and possible write-back request, to lower level memory for a write miss with write-allocate - enum cache_request_status wr_miss_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // write-allocate - enum cache_request_status wr_miss_no_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); // no write-allocate + enum cache_request_status wr_miss_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // write-allocate + enum cache_request_status wr_miss_no_wa(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); // no write-allocate // Currently no separate functions for reads /******* Read-hit configs *******/ - enum cache_request_status (data_cache::*m_rd_hit)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); - enum cache_request_status rd_hit_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); + enum cache_request_status (data_cache::*m_rd_hit)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); + enum cache_request_status rd_hit_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); /******* Read-miss configs *******/ - enum cache_request_status (data_cache::*m_rd_miss)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); - enum cache_request_status rd_miss_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events); + enum cache_request_status (data_cache::*m_rd_miss)(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); + enum cache_request_status rd_miss_base(new_addr_type addr, unsigned cache_index, mem_fetch *mf, unsigned time, std::list<cache_event> &events, enum cache_request_status status); }; |
