在 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")
我需要在每个预定的 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")