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

Reply via email to