Что касается модели кеша classi c, и если предположить, что ваша локальная копия gem5 не сильно отличается от gem5-v19.0.0.0, вам придется создавать событие, которое происходит каждые X-тики и вызывает функцию, которая печатает то, что вам нужно, в файл.
Скорее всего, вы будете использовать BaseSetAsso c в качестве тегов, но чтобы сделать его обобщенным c в следующем пошаговом руководстве, я предполагаю, что вы реализовали ExampleTags, a класс специальных тегов, который наследуется от BaseTags.
Вы должны добавить оболочку событий в src / mem / cache / tags / example_tags.hh и функцию, которую вызовет эта оболочка:
class ExampleTags : public BaseTags
{
protected:
EventFunctionWrapper snapshotEvent;
void takeSnapshot();
/** Whatever else is needed for this class. */
}
Теперь перейдем к src / mem / cache / tags / example_tags. cc. Ваш конструктор тегов должен инициализировать событие с помощью функции, которую он должен вызывать:
ExampleTags::ExampleTags(const Params *p)
: BaseTags(p),
/** ... Initialization of other members ... */
snapshotInterval(p->snapshot_interval),
snapshotEvent([this]{ takeSnapshot(); }, name())
{
// Constructor contents
}
Из-за того, как gem5 инициализирует вещи, первое событие НЕ должно планироваться в конструкторе, но при запуске ( ), которая должна быть переопределена из класса SimObject. Это очень важно, так как, если вы используете контрольные точки, то вещи сломаются в противном случае (curTick () имеет неверное значение в конструкторе):
void
ExampleTags::startup()
{
BaseTags::startup();
// We can only store relevant block information after the blocks have
// been initialized
schedule(snapshotEvent, curTick() + snapshotInterval);
}
Наконец, функция снимка содержит все, что вы хотите сделать в этом интервале :
void
ExampleTags::takeSnapshot()
{
// You can even use the tags' forEachBlk()
for (const auto& blk : blks) {
// Print what you need to the file. The blk.print() function
// can satisfy your needs
}
// Schedule next snapshot
schedule(snapshotEvent, curTick() + snapshotInterval);
}
Где snapshot_interval будет объявлен в эквивалентном объявлении python тегов, в src / mem / cache / tags / Tags.py :
class ExampleTags(BaseTags):
# ... Other parameters of these tags ...
snapshot_interval = Param.Unsigned(10000,
"Number of ticks between snapshots")