在 gem5 的文件中打印所有 cache_blocks

Printing all cache_blocks in a file in gem5

我需要在每个预定的 Tick(例如每 10000 Tick)时在我定义的文本文件中打印所有 cache_blocks 及其关联集。 有人知道我该怎么做吗?

关于 classic 缓存模型,并假设您的本地 gem5 副本与 gem5-v19.0.0.0 没有太大区别,您将必须创建一个事件,该事件每隔 X 滴答发生一次,并且调用一个函数,将您需要的内容打印到文件中。

您可能会使用 BaseSetAssoc 作为您的标签,但为了在接下来的演练中使其通用,我假设您已经实现了 ExampleTags,这是一个继承自 BaseTags 的特殊标签 class。

您必须将事件包装器添加到 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 的初始化方式,第一个事件不应在构造函数中安排,而应在 startup() 函数中安排,该函数必须从 SimObject class 中覆盖。这非常重要,因为如果你正在检查点,否则事情将会中断(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")