GEM5 Garnet DVFS / NoC DVFS教程:ruby.clk_domain ruby.voltage_domain

简介

gem5中的 NoC部分是Garnet实现的,但是Garnet并没有单独的时钟域,而是保持ruby一致,要做noc的DVFS,便是要改ruby的

改电压

#这里只是生成一个随便变量名,存一下值。改是和频率一起的
userssaved_voltage_domain = VoltageDomain(voltage = options.sys_voltage)
userssaved_voltage_domain = VoltageDomain(voltage =
['1V','0.9V','0.8V','0.7V'])

改频率

Create a seperate clock domain for Ruby

#改频率的同时顺便改一下电压值
system.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock,voltage_domain=userssaved_voltage_domain,domain_id = 0)
system.ruby.clk_domain.clock = ['1GHz','700MHz','400MHz','230MHz']

system.dvfs_handler.domains = system.ruby.clk_domain
system.dvfs_handler.enableHandler = 1

system.ruby 对应GEM5 源代码解读

system.ruby 中的system

这里的system和 fs.py中的test_sys是一个东西,来自于

test_sys = makeLinuxX86System(
            test_mem_mode, np, bm[0], args.ruby, cmdline=cmdline
        )

而makeLinuxX86System 来在configs/common/FSConfig.py。
test_sys代表仿真的硬件系统
同时test_sys它也是gem5最终运行时的输入

Simulation.run(args, root, test_sys, FutureClass)

system.ruby 中的ruby

system.ruby 的文件路径

gem5/src/sim/System.py System.cc System.hh
然而 System.py System.cc System.hh 中都搜不到ruby,也就是他们并不自带ruby的定义。
而是在fs.py中,调用了 configs/ruby/Ruby.py
Ruby.create_system(
args, True, test_sys, test_sys.iobus, test_sys._dma_ports, bootmem
)

system.ruby 是什么

configs/ruby/Ruby.py 中,调用的create_system给test_sys添加了system.ruby 这个组件。
如果用户在fs.py这个层面的文件中不调用这个函数的,system 中是不会有system.ruby的。

def create_system(
    options,
    full_system,
    system,
    piobus=None,
    dma_ports=[],
    bootmem=None,
    cpus=None,
):
    system.ruby = RubySystem()

RubySystem() 是什么

路径在 gem5/src/mem/ruby/system/ RubySystem.py RubySystem.cc RubySystem.hh
在这里插入图片描述
RubySystem() 在 gem5/src/mem/ruby/system/ RubySystem.py中如下

class RubySystem(ClockedObject):
    type = "RubySystem"
    cxx_header = "mem/ruby/system/RubySystem.hh"
    cxx_class = "gem5::ruby::RubySystem"

    randomization = Param.Bool(
        False,
        "insert random delays on message enqueue times (if True, all message \
         buffers are enforced to have randomization; otherwise, a message \
         buffer set its own flag to enable/disable randomization)",
    )
    block_size_bytes = Param.UInt32(
        64, "default cache block size; must be a power of two"
    )
    memory_size_bits = Param.UInt32(
        64, "number of bits that a memory address requires"
    )

    phys_mem = Param.SimpleMemory(NULL, "")
    system = Param.System(Parent.any, "system object")

    access_backing_store = Param.Bool(
        False,
        "Use phys_mem as the functional \
        store and only use ruby for timing.",
    )

    # Profiler related configuration variables
    hot_lines = Param.Bool(False, "")
    all_instructions = Param.Bool(False, "")
    num_of_sequencers = Param.Int("")
    number_of_virtual_networks = Param.Unsigned("")

总结

我们现在知道了system. ruby 中,system是启动需要的硬件描述,ruby则是额外的加进去system的硬件模块的描述,这个增加的模块类名是RubySystem。 我们在下面两章节讲述ruby的voltage domain 和 clock domain.

ruby.clk_domain 对应GEM5 RUBY 源代码解读

在这里插入图片描述
system.ruby 是 RubySystem类的实例, RubySystem继承自ClockedObject
在这里插入图片描述
clockedObject是继承至Clocked 类。
clocked 类里有clockdomain
在这里插入图片描述
我们看gem5/src/sim/ClockedObject.py 可以看到clk_domain.

class ClockedObject(SimObject):
    type = "ClockedObject"
    abstract = True
    cxx_header = "sim/clocked_object.hh"
    cxx_class = "gem5::ClockedObject"

    # The clock domain this clocked object belongs to, inheriting the
    # parent's clock domain by default
    clk_domain = Param.ClockDomain(Parent.clk_domain, "Clock domain")

ruby.clk_domain 总结

system.ruby.clk_domain是
1 system 从fs.py中调用了FSConfig.py中的函数(名字叫makeLinuxX86System)调用,生成了system。
2. system.ruby 从fs.py 中调用了Ruby.py中的函数(名字叫Ruby.create_system),生成了system.ruby =RubySystem()
3. RubySystem继承了clockedobject,clockedobject自带了clk_domain.

ruby.voltage_domain 对应GEM5 RUBY 源代码解读

ClockedObject 中没有voltage_domain,那么继承自ClockedObject 的RubySystem 哪里来的voltage_domain ?

所以我们看看

# Create a seperate clock domain for Ruby
        test_sys.ruby.clk_domain = SrcClockDomain(
            clock=args.ruby_clock, voltage_domain=test_sys.voltage_domain
        )

也就是说,voltage domain在ruby里其实只是clokdomain的附加。

SrcClockDomain 文件路径

gem5/src/sim/ClockDomain.py 中定义了 SrcClockDomain。
也就是和ClockDomain是同一个文件。

在这里插入图片描述

SrcClockDomain 是什么

没错,其实就是ClockDomain 的一个扩展版而已。而且扩展的这个电压也用的不多,可以认为只是文字上在clkdomain后上加了个后缀,以便power相关的读取。
更详细的说,X ghz才影响结果,X ghz顺便捎上了电压值 Y,这个Y不影响运行,最后结果跑完了生成一串Y值,用于类似于读excel得出power相关的结果。
总计就是电压值是附加的,附属于clk。

# Source clock domain with an actual clock, and a list of voltage and frequency
# op points
class SrcClockDomain(ClockDomain):
    type = "SrcClockDomain"
    cxx_header = "sim/clock_domain.hh"
    cxx_class = "gem5::SrcClockDomain"

总结

RubySystem继承了clockedobject,clockedobject自带了clk_domain.
同时, 将 RubySystem自带的clk_domain,丰富了一下,制定为带电压的clk_domain的扩展类,也就是SrcClockDomain这个类。

# Create a seperate clock domain for Ruby
        test_sys.ruby.clk_domain = SrcClockDomain(
            clock=args.ruby_clock, voltage_domain=test_sys.voltage_domain
        )

对应GEM5 源代码解读:dvfs_handler

文件路径

gem5/src/sim/ dvfs_handler.cc dvfs_handler.hh
在 dvfs_handler.hh 中:

include

55 #include "debug/DVFS.hh"

56 #include “params/DVFSHandler.hh”
57 #include “sim/clock_domain.hh”
58 #include “sim/eventq.hh”
59 #include “sim/sim_object.hh”

定义domain

180 private:
181 typedef std::map<DomainID, SrcClockDomain*> Domains;
182 Domains domains;

定义 enableHandler

bool enableHandler;

bool isEnabled() const { return enableHandler; }

<think>好的,我现在要解决的问题是用户在使用Homebrew安装p7zip时遇到自动更新的问题,想知道如何调整更新频率或禁用自动更新。首先,我需要回忆Homebrew的相关配置选项。记得Homebrew有几个环境变量可以控制自动更新,比如HOMEBREW_NO_AUTO_UPDATE和HOMEBREW_AUTO_UPDATE_SECS。用户提到的这两个变量,可能需要详细说明如何设置它们。 首先,用户可能是在安装软件时被自动更新卡住,导致安装过程缓慢或中断。根据引用[1],临时禁用Homebrew更新可以通过设置HOMEBREW_NO_AUTO_UPDATE环境变量。这应该在运行安装命令时加上这个变量,或者在shell配置文件中永久设置。例如,在终端中输入HOMEBREW_NO_AUTO_UPDATE=1 brew install p7zip,这样可以在单次命令中禁用自动更新。 另外,引用[2]提到在M1芯片的Mac上,Homebrew的路径可能不同,需要配置环境变量。虽然这可能与自动更新无直接关系,但用户的环境变量设置是否正确可能会影响Homebrew的运行。所以需要确保PATH变量正确,尤其是安装路径是否包含在PATH中,避免其他问题。 关于调整更新频率的HOMEBREW_AUTO_UPDATE_SECS,这个变量控制自动更新的间隔时间。默认情况下,Homebrew每隔一定时间(比如300秒)才会尝试自动更新。如果用户希望延长这个时间,可以将其设置为更大的数值,例如86400秒(一天),这样在24小时内Homebrew不会再次自动更新。设置方式同样可以在命令前临时设置,或者在配置文件中永久设置。 用户可能还需要知道如何永久禁用自动更新,这可以通过在.bash_profile或.zshrc中添加export HOMEBREW_NO_AUTO_UPDATE=1来实现,这样每次启动终端时都会自动禁用更新。但需要提醒用户这样做可能会错过重要的软件更新,需谨慎。 此外,需要确认用户是否已经正确安装了Homebrew,尤其是在M1芯片的Mac上,路径是否正确。引用[2]中的路径/opt/homebrew/bin是否正确配置到环境变量中,否则可能导致命令无法找到,进而引发其他问题。 最后,总结步骤:临时禁用更新、调整更新间隔、永久禁用更新以及路径配置。同时,要提醒用户权衡禁用更新的利弊,确保他们了解潜在的影响。</think>### 如何调整Homebrew自动更新设置以安装p7zip #### 1. **临时禁用Homebrew自动更新** 在安装命令前添加环境变量 `HOMEBREW_NO_AUTO_UPDATE=1`,可单次禁用自动更新: ```bash HOMEBREW_NO_AUTO_UPDATE=1 brew install p7zip ``` #### 2. **调整自动更新间隔** 通过设置 `HOMEBREW_AUTO_UPDATE_SECS` 调整更新频率(单位为秒)。例如,设置为1天(86400秒): ```bash HOMEBREW_AUTO_UPDATE_SECS=86400 brew install p7zip ``` #### 3. **永久禁用自动更新** 在shell配置文件(如 `.zshrc` 或 `.bash_profile`)中添加以下行以永久禁用: ```bash export HOMEBREW_NO_AUTO_UPDATE=1 ``` 保存后执行 `source ~/.zshrc`(或对应配置文件)使其生效[^1]。 #### 4. **验证环境变量(针对M1芯片)** 确保Homebrew路径已正确配置。M1芯片的路径可能为 `/opt/homebrew/bin`,需添加到环境变量: ```bash export PATH=$PATH:/opt/homebrew/bin ``` 保存后同样执行 `source` 命令更新配置[^2]。 --- ### 注意事项 - **临时禁用 vs 永久禁用**:长期禁用可能错过安全更新,建议仅在必要时临时禁用。 - **路径问题**:若安装后提示命令未找到,需检查路径配置是否包含 `/opt/homebrew/bin`[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值