summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim')
-rw-r--r--src/gpgpu-sim/gpu-cache.cc36
-rw-r--r--src/gpgpu-sim/gpu-cache.h24
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);
};