mem: added distance parameter to stride prefetcher

The Stride Prefetcher will skip this number of strides ahead of the
first identified prefetch, then generate `degree` prefetches at
`stride` intervals. A value of zero indicates no skip (i.e. start
prefetching from the next identified prefetch address).

This parameter can be used to increase the timeliness of prefetches by
starting to prefetch far enough ahead of the demand stream to cover
the memory system latency.

[Richard Cooper <richard.cooper@arm.com>:
- Added detail to commit comment and `distance` Param documentation.
- Changed `distance` Param from `Param.Int` to `Param.Unsigned`.
]

Change-Id: I4ce79c72d74445b12acf68e0a54e13966e30041c
Co-authored-by: Richard Cooper <richard.cooper@arm.com>
Signed-off-by: Richard Cooper <richard.cooper@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
Nikolaos Kyparissas
2022-08-30 17:04:21 +01:00
committed by Richard Cooper
parent 1ccdf407cb
commit a5fece3b91
3 changed files with 21 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
# Copyright (c) 2012, 2014, 2019, 2023-2024 Arm Limited
# Copyright (c) 2012, 2014, 2019, 2022-2024 Arm Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
@@ -191,6 +191,13 @@ class StridePrefetcher(QueuedPrefetcher):
use_requestor_id = Param.Bool(True, "Use requestor id based history")
degree = Param.Int(4, "Number of prefetches to generate")
distance = Param.Unsigned(
0,
"How far ahead of the demand stream to start prefetching. "
"Skip this number of strides ahead of the first identified prefetch, "
"then generate `degree` prefetches at `stride` intervals. "
"A value of zero indicates no skip.",
)
table_assoc = Param.Int(4, "Associativity of the PC table")
table_entries = Param.MemorySize("64", "Number of entries of the PC table")

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018 Inria
* Copyright (c) 2012-2013, 2015 ARM Limited
* Copyright (c) 2012-2013, 2015, 2022 Arm Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -84,6 +84,7 @@ Stride::Stride(const StridePrefetcherParams &p)
threshConf(p.confidence_threshold/100.0),
useRequestorId(p.use_requestor_id),
degree(p.degree),
distance(p.distance),
pcTableInfo(p.table_assoc, p.table_entries, p.table_indexing_policy,
p.table_replacement_policy)
{
@@ -176,7 +177,8 @@ Stride::calculatePrefetch(const PrefetchInfo &pfi,
prefetch_stride = (new_stride < 0) ? -blkSize : blkSize;
}
Addr new_addr = pf_addr + d * prefetch_stride;
Addr new_addr = pf_addr + distance * prefetch_stride
+ d * prefetch_stride;
addresses.push_back(AddrPriority(new_addr, 0));
}
} else {

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018 Inria
* Copyright (c) 2012-2013, 2015 ARM Limited
* Copyright (c) 2012-2013, 2015, 2022 Arm Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -105,6 +105,14 @@ class Stride : public Queued
const int degree;
/** How far ahead of the demand stream to start prefetching.
*
* Skip this number of strides ahead of the first identified
* prefetch, then generate `degree` prefetches at `stride`
* intervals. A value of zero indicates no skip.
*/
const int distance;
/**
* Information used to create a new PC table. All of them behave equally.
*/