diff --git a/src/mem/cache/prefetch/multi.cc b/src/mem/cache/prefetch/multi.cc index 230db505ea..ddf0e30d59 100644 --- a/src/mem/cache/prefetch/multi.cc +++ b/src/mem/cache/prefetch/multi.cc @@ -48,7 +48,8 @@ namespace prefetch Multi::Multi(const MultiPrefetcherParams &p) : Base(p), - prefetchers(p.prefetchers.begin(), p.prefetchers.end()) + prefetchers(p.prefetchers.begin(), p.prefetchers.end()), + lastChosenPf(0) { } @@ -73,14 +74,18 @@ Multi::nextPrefetchReadyTime() const PacketPtr Multi::getPacket() { - for (auto pf : prefetchers) { - if (pf->nextPrefetchReadyTime() <= curTick()) { - PacketPtr pkt = pf->getPacket(); + lastChosenPf = (lastChosenPf + 1) % prefetchers.size(); + uint8_t pf_turn = lastChosenPf; + + for (int pf = 0 ; pf < prefetchers.size(); pf++) { + if (prefetchers[pf_turn]->nextPrefetchReadyTime() <= curTick()) { + PacketPtr pkt = prefetchers[pf_turn]->getPacket(); panic_if(!pkt, "Prefetcher is ready but didn't return a packet."); prefetchStats.pfIssued++; issuedPrefetches++; return pkt; } + pf_turn = (pf_turn + 1) % prefetchers.size(); } return nullptr; diff --git a/src/mem/cache/prefetch/multi.hh b/src/mem/cache/prefetch/multi.hh index 037d23e58c..ff17918346 100644 --- a/src/mem/cache/prefetch/multi.hh +++ b/src/mem/cache/prefetch/multi.hh @@ -38,6 +38,8 @@ #ifndef __MEM_CACHE_PREFETCH_MULTI_HH__ #define __MEM_CACHE_PREFETCH_MULTI_HH__ +#include + #include "mem/cache/prefetch/base.hh" namespace gem5 @@ -70,7 +72,8 @@ class Multi : public Base protected: /** List of sub-prefetchers ordered by priority. */ - std::list prefetchers; + std::vector prefetchers; + uint8_t lastChosenPf; }; } // namespace prefetch