首页 > 解决方案 > gem5 ARM bigLITTLE 模拟器的非对称缓存配置

问题描述

我正在写作是因为我目前正在使用 gem5 模拟器来模拟 ARM bigLITTLE 配置的项目,其中大型 CPU 集群具有 L2,但小型 CPU 集群没有。也就是说,我想模拟一个系统,其中小核心甚至比它们的默认配置更简单。我正在使用完整的系统 bigLITTLE 文件(即 gem5/configs/example/fs_bigLITTLE.py)运行该项目。是否可以以这种方式配置系统?

我最初的想法是修改python文件,使小集群配置由以下内容组成:

class LittleCluster(devices.CpuCluster):
    def __init__(self, system num_cpus, cpu_clock, cpu_voltage="1.0V"):
        cpu_config = [ ObjectList.cpu_list.get("MinorCPU"), devices.L1I, devices.L1D, devices.WalkCache, None]
        super(LittleCluster, self).__init__(system, num_cpus, cpu_clock, cpu_voltage, *cpu_config)

或者,通俗地说,提供NoneL2 的 SimObject 类名。不幸的是,正如人们所预料的那样,这会导致系统崩溃,因为 gem5 需要一个对象来连接端口。

我的下一个想法是编写一个名为 EmptyCache 的新 SimObject,它从 gem5 继承 Cache 类,但什么也不做。也就是说,在每次调用访问缓存时,此对象都将返回 false,并且将其配置为没有标记、数据或响应延迟。但是,这会导致小集群中 L1 缓存的一致性问题,因此我对其进行了更改,以便在返回 false 之前驱逐它“命中”的任何缓存块(以下内容基于 gem5-users 邮件的先前帖子列表:https ://www.mail-archive.com/gem5-users@gem5.org/msg16882.html )

EmptyCache::access(PacketPtr pkt, CacheBlk *&blk, Cycles &lat, PacketList &writebacks)
{
    if (Cache::access(pkt, blk, lat, writebacks) {
        Cache::evictBlock(blk);
    }

    return false;
}

这似乎解决了上述 L1 缓存的一致性问题,但这似乎会导致内存总线(实现 SystemXBar 类(实现 CoherentXBar 类))中的一致性问题。

在这一点上,我感到非常困惑,并希望您能提供任何建议!谢谢!

编辑:尽管通过修改 gem5/configs/example/arm/devices.py 文件在这个方向上遇到了挫折,但我继续尝试在这个项目上取得进展。我注意到解决这个问题的一种方法是添加一个 MinorCPU 私有成员缓存,然后将 MinorCPU 集群直接设置到内存总线,同时将主 CPU 集群连接到缓存系统,但这个方向的问题是到次要集群和主要集群的数据包之间的不一致性。

也就是说,缓存中有几个断言和 panic_if 语句,它们预期特定的 MemCmd 枚举和/或数据包“hasSharers”。自然地,我认为这个问题与这个模拟设置有关,因为模拟器实际上没有它就可以运行,但这是一种在这个方向上配置模拟器的方法,以便在主要和次要 CPU 集群之间有一些相似的凝聚力?

再次感谢您的帮助!

标签: armgem5

解决方案


推荐阅读