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_voltage,*cpu_config)

或者,通俗地说,提供 None 作为 L2 的 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 集群之间存在某种内聚性?

再次感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)