Печать всех cache_blocks в файле в gem5 - PullRequest
1 голос
/ 23 февраля 2020

Мне нужно напечатать все cache_blocks с их связанными наборами в текстовом файле, который я определил, на каждом заданном тике (например, на каждом 10000 тике). Кто-нибудь знает, как я могу это сделать?

1 Ответ

1 голос
/ 24 февраля 2020

Что касается модели кеша 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")
...