summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/dram_sched.cc
diff options
context:
space:
mode:
authorMahmoud <[email protected]>2017-10-25 13:15:44 -0400
committerMahmoud <[email protected]>2017-10-25 13:15:44 -0400
commit50b7ac49a78948f61fa685d717de90feaa277b9b (patch)
tree668375bfa2f2427a850fa7e691d5ceae347a6491 /src/gpgpu-sim/dram_sched.cc
parent07b375cc0c0da2b8a8ca7263f11ecca8ebaf8fe9 (diff)
The commits includes:
1- REEAD/WERITE buffer for DRAM 2- Fixing FETCH_ON_WRITE cahce policy bug
Diffstat (limited to 'src/gpgpu-sim/dram_sched.cc')
-rw-r--r--src/gpgpu-sim/dram_sched.cc95
1 files changed, 73 insertions, 22 deletions
diff --git a/src/gpgpu-sim/dram_sched.cc b/src/gpgpu-sim/dram_sched.cc
index 008b5bb..7a140c5 100644
--- a/src/gpgpu-sim/dram_sched.cc
+++ b/src/gpgpu-sim/dram_sched.cc
@@ -36,6 +36,7 @@ frfcfs_scheduler::frfcfs_scheduler( const memory_config *config, dram_t *dm, mem
m_config = config;
m_stats = stats;
m_num_pending = 0;
+ m_num_write_pending = 0;
m_dram = dm;
m_queue = new std::list<dram_req_t*>[m_config->nbk];
m_bins = new std::map<unsigned,std::list<std::list<dram_req_t*>::iterator> >[ m_config->nbk ];
@@ -49,15 +50,36 @@ frfcfs_scheduler::frfcfs_scheduler( const memory_config *config, dram_t *dm, mem
curr_row_service_time[i] = 0;
row_service_timestamp[i] = 0;
}
+ if(m_config->seperate_write_queue_enabled) {
+ m_write_queue = new std::list<dram_req_t*>[m_config->nbk];
+ m_write_bins = new std::map<unsigned,std::list<std::list<dram_req_t*>::iterator> >[ m_config->nbk ];
+ m_last_write_row = new std::list<std::list<dram_req_t*>::iterator>*[ m_config->nbk ];
+
+ for ( unsigned i=0; i < m_config->nbk; i++ ) {
+ m_write_queue[i].clear();
+ m_write_bins[i].clear();
+ m_last_write_row[i] = NULL;
+ }
+ }
+ m_mode = READ_MODE;
}
void frfcfs_scheduler::add_req( dram_req_t *req )
{
- m_num_pending++;
- m_queue[req->bk].push_front(req);
- std::list<dram_req_t*>::iterator ptr = m_queue[req->bk].begin();
- m_bins[req->bk][req->row].push_front( ptr ); //newest reqs to the front
+ if(m_config->seperate_write_queue_enabled && req->data->is_write()) {
+ assert(m_num_write_pending < m_config->gpgpu_frfcfs_dram_write_queue_size);
+ m_num_write_pending++;
+ m_write_queue[req->bk].push_front(req);
+ std::list<dram_req_t*>::iterator ptr = m_write_queue[req->bk].begin();
+ m_write_bins[req->bk][req->row].push_front( ptr ); //newest reqs to the front
+ } else {
+ assert(m_num_pending < m_config->gpgpu_frfcfs_dram_sched_queue_size);
+ m_num_pending++;
+ m_queue[req->bk].push_front(req);
+ std::list<dram_req_t*>::iterator ptr = m_queue[req->bk].begin();
+ m_bins[req->bk][req->row].push_front( ptr ); //newest reqs to the front
+ }
}
void frfcfs_scheduler::data_collection(unsigned int bank)
@@ -80,21 +102,43 @@ dram_req_t *frfcfs_scheduler::schedule( unsigned bank, unsigned curr_row )
{
//row
bool rowhit = true;
+ std::list<dram_req_t*> *m_current_queue = m_queue;
+ std::map<unsigned,std::list<std::list<dram_req_t*>::iterator> > *m_current_bins = m_bins ;
+ std::list<std::list<dram_req_t*>::iterator> **m_current_last_row = m_last_row;
- if ( m_last_row[bank] == NULL ) {
- if ( m_queue[bank].empty() )
+ if(m_config->seperate_write_queue_enabled) {
+ if(m_mode == READ_MODE &&
+ ((m_num_write_pending >= m_config->write_high_watermark )
+ || (m_queue[bank].empty() && !m_write_queue[bank].empty()))) {
+ m_mode = WRITE_MODE;
+ }
+ else if(m_mode == WRITE_MODE &&
+ (( m_num_write_pending < m_config->write_low_watermark )
+ || (!m_queue[bank].empty() && m_write_queue[bank].empty()))){
+ m_mode = READ_MODE;
+ }
+ }
+
+ if(m_mode == WRITE_MODE) {
+ m_current_queue = m_write_queue;
+ m_current_bins = m_write_bins ;
+ m_current_last_row = m_last_write_row;
+ }
+
+ if ( m_current_last_row[bank] == NULL ) {
+ if ( m_current_queue[bank].empty() )
return NULL;
- std::map<unsigned,std::list<std::list<dram_req_t*>::iterator> >::iterator bin_ptr = m_bins[bank].find( curr_row );
- if ( bin_ptr == m_bins[bank].end()) {
- dram_req_t *req = m_queue[bank].back();
- bin_ptr = m_bins[bank].find( req->row );
- assert( bin_ptr != m_bins[bank].end() ); // where did the request go???
- m_last_row[bank] = &(bin_ptr->second);
+ std::map<unsigned,std::list<std::list<dram_req_t*>::iterator> >::iterator bin_ptr = m_current_bins[bank].find( curr_row );
+ if ( bin_ptr == m_current_bins[bank].end()) {
+ dram_req_t *req = m_current_queue[bank].back();
+ bin_ptr = m_current_bins[bank].find( req->row );
+ assert( bin_ptr != m_current_bins[bank].end() ); // where did the request go???
+ m_current_last_row[bank] = &(bin_ptr->second);
data_collection(bank);
rowhit = false;
} else {
- m_last_row[bank] = &(bin_ptr->second);
+ m_current_last_row[bank] = &(bin_ptr->second);
rowhit = true;
}
}
@@ -103,25 +147,32 @@ dram_req_t *frfcfs_scheduler::schedule( unsigned bank, unsigned curr_row )
if(rowhit)
m_dram->hits_num++;
- std::list<dram_req_t*>::iterator next = m_last_row[bank]->back();
+ std::list<dram_req_t*>::iterator next = m_current_last_row[bank]->back();
dram_req_t *req = (*next);
m_stats->concurrent_row_access[m_dram->id][bank]++;
m_stats->row_access[m_dram->id][bank]++;
- m_last_row[bank]->pop_back();
+ m_current_last_row[bank]->pop_back();
- m_queue[bank].erase(next);
- if ( m_last_row[bank]->empty() ) {
- m_bins[bank].erase( req->row );
- m_last_row[bank] = NULL;
+ m_current_queue[bank].erase(next);
+ if ( m_current_last_row[bank]->empty() ) {
+ m_current_bins[bank].erase( req->row );
+ m_current_last_row[bank] = NULL;
}
#ifdef DEBUG_FAST_IDEAL_SCHED
if ( req )
printf("%08u : DRAM(%u) scheduling memory request to bank=%u, row=%u\n",
(unsigned)gpu_sim_cycle, m_dram->id, req->bk, req->row );
#endif
- assert( req != NULL && m_num_pending != 0 );
- m_num_pending--;
+
+ if(m_config->seperate_write_queue_enabled && req->data->is_write()) {
+ assert( req != NULL && m_num_write_pending != 0 );
+ m_num_write_pending--;
+ }
+ else {
+ assert( req != NULL && m_num_pending != 0 );
+ m_num_pending--;
+ }
return req;
}
@@ -138,7 +189,7 @@ void dram_t::scheduler_frfcfs()
{
unsigned mrq_latency;
frfcfs_scheduler *sched = m_frfcfs_scheduler;
- while ( !mrqq->empty() && (!m_config->gpgpu_frfcfs_dram_sched_queue_size || sched->num_pending() < m_config->gpgpu_frfcfs_dram_sched_queue_size)) {
+ while ( !mrqq->empty() ) {
dram_req_t *req = mrqq->pop();
// Power stats