summaryrefslogtreecommitdiff
path: root/src/gpgpu-sim/dram.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpgpu-sim/dram.cc')
-rw-r--r--src/gpgpu-sim/dram.cc29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/gpgpu-sim/dram.cc b/src/gpgpu-sim/dram.cc
index 104ec66..c073f0d 100644
--- a/src/gpgpu-sim/dram.cc
+++ b/src/gpgpu-sim/dram.cc
@@ -56,13 +56,24 @@ dram_t::dram_t( unsigned int partition_id, const struct memory_config *config, m
rw = READ; //read mode is default
+ bkgrp = (bankgrp_t**) calloc(sizeof(bankgrp_t*), m_config->nbkgrp);
+ bkgrp[0] = (bankgrp_t*) calloc(sizeof(bank_t), m_config->nbkgrp);
+ for (unsigned i=1; i<m_config->nbkgrp; i++) {
+ bkgrp[i] = bkgrp[0] + i;
+ }
+ for (unsigned i=0; i<m_config->nbkgrp; i++) {
+ bkgrp[i]->CCDLc = 0;
+ bkgrp[i]->RTPLc = 0;
+ }
+
bk = (bank_t**) calloc(sizeof(bank_t*),m_config->nbk);
bk[0] = (bank_t*) calloc(sizeof(bank_t),m_config->nbk);
for (unsigned i=1;i<m_config->nbk;i++)
bk[i] = bk[0] + i;
- for (unsigned i=0;i<m_config->nbk;i++)
+ for (unsigned i=0;i<m_config->nbk;i++) {
bk[i]->state = BANK_IDLE;
-
+ bk[i]->bkgrpindex = i/(m_config->nbk/m_config->nbkgrp);
+ }
prio = 0;
rwq = new fifo_pipeline<dram_req_t>("rwq",m_config->CL,m_config->CL+1);
mrqq = new fifo_pipeline<dram_req_t>("mrqq",0,2);
@@ -248,10 +259,12 @@ void dram_t::cycle()
// check if any bank is ready to issue a new read
for (unsigned i=0;i<m_config->nbk;i++) {
unsigned j = (i + prio) % m_config->nbk;
+ unsigned grp = j>>m_config->bk_tag_length;
if (bk[j]->mrq) { //if currently servicing a memory request
bk[j]->mrq->data->set_status(IN_PARTITION_DRAM,gpu_sim_cycle+gpu_tot_sim_cycle);
// correct row activated for a READ
if ( !issued && !CCDc && !bk[j]->RCDc &&
+ !(bkgrp[grp]->CCDLc) &&
(bk[j]->curr_row == bk[j]->mrq->row) &&
(bk[j]->mrq->rw == READ) && (WTRc == 0 ) &&
(bk[j]->state == BANK_ACTIVE) &&
@@ -263,8 +276,10 @@ void dram_t::cycle()
rwq->push(bk[j]->mrq);
bk[j]->mrq->txbytes += m_config->BL * m_config->busW * m_config->gpu_n_mem_per_ctrlr; //16 bytes
CCDc = m_config->tCCD;
+ bkgrp[grp]->CCDLc = m_config->tCCDL;
RTWc = m_config->tRTW;
bk[j]->RTPc = m_config->BL/2;
+ bkgrp[grp]->RTPLc = m_config->tRTPL;
issued = true;
n_rd++;
bwutil+= m_config->BL/2;
@@ -283,6 +298,7 @@ void dram_t::cycle()
} else
// correct row activated for a WRITE
if ( !issued && !CCDc && !bk[j]->RCDWRc &&
+ !(bkgrp[grp]->CCDLc) &&
(bk[j]->curr_row == bk[j]->mrq->row) &&
(bk[j]->mrq->rw == WRITE) && (RTWc == 0 ) &&
(bk[j]->state == BANK_ACTIVE) &&
@@ -295,6 +311,7 @@ void dram_t::cycle()
bk[j]->mrq->txbytes += m_config->BL * m_config->busW * m_config->gpu_n_mem_per_ctrlr; /*16 bytes*/
CCDc = m_config->tCCD;
+ bkgrp[grp]->CCDLc = m_config->tCCDL;
WTRc = m_config->tWTR;
bk[j]->WTPc = m_config->tWTP;
issued = true;
@@ -342,7 +359,9 @@ void dram_t::cycle()
if ( (!issued) &&
(bk[j]->curr_row != bk[j]->mrq->row) &&
(bk[j]->state == BANK_ACTIVE) &&
- (!bk[j]->RASc && !bk[j]->WTPc && !bk[j]->RTPc) ) {
+ (!bk[j]->RASc && !bk[j]->WTPc &&
+ !bk[j]->RTPc &&
+ !bkgrp[grp]->RTPLc) ) {
// make the bank idle again
bk[j]->state = BANK_IDLE;
bk[j]->RPc = m_config->tRP;
@@ -389,6 +408,10 @@ void dram_t::cycle()
DEC2ZERO(bk[j]->WTPc);
DEC2ZERO(bk[j]->RTPc);
}
+ for (unsigned j=0; j<m_config->nbkgrp; j++) {
+ DEC2ZERO(bkgrp[j]->CCDLc);
+ DEC2ZERO(bkgrp[j]->RTPLc);
+ }
#ifdef DRAM_VISUALIZE
visualize();