Hi Vincent,

I think the simplest way to add additional latency is to change the
frontend/backend latency parameters of the memory controller (for
reference: src/mem/MemCtrl.py). Though you can also try to change the DRAM
timing parameters, but that can be much more complicated due to the
relation between different timing parameters.

-Ayaz

On Sat, Jun 10, 2023 at 11:36 AM Vincent Abraham via gem5-users <
gem5-users@gem5.org> wrote:

> I'm extremely sorry if I worded my question incorrectly. I'm actually
> trying to introduce a delay whenever a read/write request happens in the
> main memory. For example, in a memory write, the data would only be flagged
> as dirty after a 10ns delay.
>
> Regardless, thanks a lot for the response!
>
> On Sat, Jun 10, 2023 at 12:28 PM Eliot Moss <m...@cs.umass.edu> wrote:
>
>> On 6/10/2023 11:12 AM, Vincent Abraham via gem5-users wrote:
>> > Hi everyone,
>> > I'm trying to model additional latencies in the main memory while
>> performing write/read operations.
>> > Could anyone tell me how I could go about doing it?
>>
>> Of course the dram module has a gazillion timing and energy parameters
>> that
>> you can simply look up in your config.ini file, if that's what you mean.
>>
>> But I suspect you want to know something like the distribution of access
>> times.  You can see comm_monitor for statistics examples (and the memory
>> controller already has a lot as well), but it might go roughly like this.
>>
>> First, set up a map in the controller module along these lines:
>>
>> hash_map<PacketPtr, Tick> arrivalTime;
>>
>> When a packet arrives at the controller, put it into the map like this:
>>
>> arrivalTime.emplace(pkt, curTick());
>>
>> Later, when the packet has finished processing, you can find out how long
>> it
>> took by code like this:
>>
>> auto it = arrivalTime.find(pkt);
>> assert(it != arrivalTime.end);  // it really should be there
>> Tick arrival = it->second;
>> Tick latency = curTick() - arrival;
>> arrivalTime.erase(it);
>>
>> The other part is recording statistics.  To get a histogram over all
>> packets,
>> declare a stat like this as a member of the memory controller's class:
>>
>> Stats::Histogram pktLatencies;
>>
>> In the controller module's regStats function, add this:
>>
>> pktLatencies
>>      .init(20) // or whatever number of buckets you want
>>      .name(name() + ".pkt_latencies")
>>      .desc("Histogram of packet latencies")
>>      .flags(cdf | dist | nozero);  // I like cdf, but pdf can be good too
>>
>> Of course you don't have to use a histogram, and you don't have to use
>> just
>> one.  For example, you could have one for reads and one for writes, and
>> enter
>> packets conditionalized on isRead() and isWrite().
>>
>> The one piece I did not mention yet is adding a sample to the histogram.
>> When
>> a packet finishes and you know its latency, just do:
>>
>> arrivalTimes.sample(latency);
>>
>> The magic of stats will do the rest.
>>
>> Cheers - Eliot Moss
>>
> _______________________________________________
> gem5-users mailing list -- gem5-users@gem5.org
> To unsubscribe send an email to gem5-users-le...@gem5.org
>
_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org

Reply via email to