Hi Shuchang, If we assume the memory space in both host machine and simulator is continuous, then we can calculate the row address as follows.
unsigned myRowSize = pkt->getSize() * linesPerRow; uint8_t* myRowAddr = pmemAddr + (pkt->getAddr() - range.start) / myRowSize * myRowSize; or uint8_t* myRowAddr = pmemAddr + (pkt->getAddr() - pkt->getAddr() % myRowSize) - range.start; -Tao On 01/28/2013 03:18 AM, 单书畅 wrote: > Hi Tao, thanks for your quickly reply. > > I have read the codes of function access(PacketPtr pkt) in > abstract_mem.cc. The main difference is that, in the given function > access(), the operation is the granularity of a cache line (64-Byte, > actually it is a specified column of a whole row; while for my codes, > I want to copy the whole row in to data structure row_data (That's why > I need to multiply another 64. Here the 64 equals the parameter > linesPerRowBuffer). > > In other words, in the function access(), memory access is to only one > column of a row, while I want to access the entire row. > > My concern is that, whether myHostAddr can point to the start address > of the row (given pkt->getAddr)? > > > /=======================================================================/ > /uint8_t *myHostAddr = pmemAddr + (pkt->getAddr() - pkt->getAddr() % > linesPerRow) - range.start;/ > /=======================================================================/ > / > / > Regards, > Shuchang > > 2013/1/28 Tao Zhang <[email protected] > <mailto:[email protected]>> > > Hi Shuchang, > > In my opinion, your code are almost correct expect that the > pkt->getSize() does return the cacheline size (64 in byte). You > don’t need to multiply another 64 again. > > In fact, AbstractMemory has the function “access(PacketPtr pkt)” > in which the data is also copied. You can read the code between > line 352 and 372 in abstract_mem.cc to see how the data is copied. > It does almost the same thing as you do. As a result, you can > simply extend the AbstractMemory and use the access() to make sure > the data is in pkt->getPtr<uint8_t>(); What you only need to do is > to copy this data to your raw data pointer. > > -Tao > > *From:*[email protected] > <mailto:[email protected]> > [mailto:[email protected] > <mailto:[email protected]>] *On Behalf Of *单书畅 > *Sent:* Sunday, January 27, 2013 6:31 AM > *To:* [email protected] <mailto:[email protected]> > *Subject:* [gem5-users] question about reading out a whole DRAM > row data > > Hi all, > > I am trying to modify the SimpleDRAM module to profile the data > contents in phymem. > > In simple_dram.cc, the /docodeAddr()/ function shows how to get > the rank and the bank addresses for given request /pkt/. > > I wonder, given/pkt->getAddr()/, how to calculate the row address? > > It seems that, a dram row contains 64 (linesPerRow = 64) 64-Byte > data blocks, and I want to read out the whole row data into a > self-defined data structure ( namely row_data). > > The detailed codes are like this: > > /uint8_t *myHostAddr = pmemAddr + (pkt->getAddr() - pkt->getAddr() > % linesPerRow) - range.start;/ > > /int row_size = pkt->getSize()*64;/ > > /uint8_t row_data[row_size];/ > > /memcpy(row_data, myHostAddr , row_size ); // read the whole MEM > row data out into the array structure: row_data/ > > I am not sure whether the calculation of the row address is right. > Any advice will be appreciated. > > Regards, > > shuchang > > > _______________________________________________ > gem5-users mailing list > [email protected] <mailto:[email protected]> > http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users > > > > _______________________________________________ > gem5-users mailing list > [email protected] > http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
_______________________________________________ gem5-users mailing list [email protected] http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
