gem5:在 BaseCPU 中使用 xbar stat
gem5: Use xbar stat in BaseCPU
我在 xbar.cc/hh 文件中创建了一个公式类型的新统计数据。我在那里汇总了所有不同的 transDist 类型。我想使用这个新创建的统计数据来计算 BaseCPU 对象中的另一个统计数据。从 BaseCPU 访问它(即 allTransactions stat)的最佳方式是什么?有什么办法让它可以在全球范围内访问吗?
我最终在 xbar 和 CPU 对象之间建立了直接通信。
我在 Xbar 对象中实现了一个函数,该函数 returns 我想要的统计数据,称为 getAllTrans()。从 CPU 对象,我调用该函数并获取统计值。使用以下代码实现通信。
// Research (Memory Boundedness)
void
BaseCPU::getAllTrans() {
allTrans = 0;
Cache *dCache = dynamic_cast<Cache*>
(this->getPort("dcache_port", 0).getPeer().getOwner());
if (dCache) {
Cache *l2Cache = dynamic_cast<Cache*>
(dCache->getPort("mem_side", 0).getPeer().getOwner()->
getPort("mem_side_ports", 0).getPeer().getOwner());
if (l2Cache) {
CoherentXBar *membus = dynamic_cast<CoherentXBar*>
(l2Cache->getPort("mem_side", 0).getPeer().getOwner());
if (membus) {
allTrans = membus->getAllTrans();
}
}
else {
CoherentXBar *membus = dynamic_cast<CoherentXBar*>
(l2Cache->getPort("mem_side", 0).getPeer().getOwner());
if (membus) {
allTrans = membus->getAllTrans();
}
}
}
}
以上代码假定 dcache 存在。
Cache *dCache = dynamic_cast<Cache*>
(this->getPort("dcache_port", 0).getPeer().getOwner());
上面的代码指向cpu中的dcache对象。啤酒花是这样的:
CPU -> CPU 端口到 dCache -> 该端口的 Peer(即,dCache 端口到 CPU) -> 该端口的所有者(即,dCache本身)。
我在将 CPU 连接到 Xbar 的每个对象之上构建,直到我到达 XBar。这不是最优雅的解决方案,但我还没有找到更好的解决方案来将信息从一个 gem5 对象获取到另一个对象。
我在 xbar.cc/hh 文件中创建了一个公式类型的新统计数据。我在那里汇总了所有不同的 transDist 类型。我想使用这个新创建的统计数据来计算 BaseCPU 对象中的另一个统计数据。从 BaseCPU 访问它(即 allTransactions stat)的最佳方式是什么?有什么办法让它可以在全球范围内访问吗?
我最终在 xbar 和 CPU 对象之间建立了直接通信。
我在 Xbar 对象中实现了一个函数,该函数 returns 我想要的统计数据,称为 getAllTrans()。从 CPU 对象,我调用该函数并获取统计值。使用以下代码实现通信。
// Research (Memory Boundedness)
void
BaseCPU::getAllTrans() {
allTrans = 0;
Cache *dCache = dynamic_cast<Cache*>
(this->getPort("dcache_port", 0).getPeer().getOwner());
if (dCache) {
Cache *l2Cache = dynamic_cast<Cache*>
(dCache->getPort("mem_side", 0).getPeer().getOwner()->
getPort("mem_side_ports", 0).getPeer().getOwner());
if (l2Cache) {
CoherentXBar *membus = dynamic_cast<CoherentXBar*>
(l2Cache->getPort("mem_side", 0).getPeer().getOwner());
if (membus) {
allTrans = membus->getAllTrans();
}
}
else {
CoherentXBar *membus = dynamic_cast<CoherentXBar*>
(l2Cache->getPort("mem_side", 0).getPeer().getOwner());
if (membus) {
allTrans = membus->getAllTrans();
}
}
}
}
以上代码假定 dcache 存在。
Cache *dCache = dynamic_cast<Cache*>
(this->getPort("dcache_port", 0).getPeer().getOwner());
上面的代码指向cpu中的dcache对象。啤酒花是这样的:
CPU -> CPU 端口到 dCache -> 该端口的 Peer(即,dCache 端口到 CPU) -> 该端口的所有者(即,dCache本身)。
我在将 CPU 连接到 Xbar 的每个对象之上构建,直到我到达 XBar。这不是最优雅的解决方案,但我还没有找到更好的解决方案来将信息从一个 gem5 对象获取到另一个对象。