首页 > 解决方案 > gem5:在 BaseCPU 中使用 xbar stat

问题描述

我在 xbar.cc/hh 文件中创建了一个公式类型的新统计信息。在那里我汇总了所有不同的 transDist 类型。我想使用这个新创建的统计数据来计算 BaseCPU 对象中的另一个统计数据。从 BaseCPU 访问它(即 allTransactions stat)的最佳方式是什么?有没有办法让它在全球范围内可访问?

标签: c++gem5

解决方案


我最终在 xbar 和 CPU 对象之间建立了直接的通信线路。

我在 Xbar 对象中实现了一个函数,它返回我想要的统计信息,称为 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 -> 到 dCache 的 CPU 端口 -> 该端口的对等点(即,到 CPU 的 dCache 端口)-> 该端口的所有者(即,dCache 本身)。

我建立在将 CPU 连接到 Xbar 的每个对象之上,直到到达 XBar。这不是最优雅的解决方案,但我还没有找到更好的解决方案来从一个 gem5 对象获取信息到另一个对象。


推荐阅读