Hardware Power Management
Power
- 下一条command的大致执行时间:1/Hzcycle,Hz = cycle/s, 1/Hz = s/cycle. s = cycle 1/Hz,一条命令耗200个cycle,一个cycle就是一次震荡周期。例如执行一次power command mmio,需要200个cycle,时钟频率位200k,最终需要1000ns。
- NOC power gating:再global config时初始化,VMM disable power时VPMU下电。VSUS PMU写在frameware中,控制memory miu等组件。
- PMU PMU有两级甚至三级。通常一级在cpu一级在VMM。VSUS放在cpu,V-engine的PMU放在VMM,都是管理videocrd的组件。VSUS在soc上时完整的,在VMM上只是实现部分功能。
- CSP原来和C3D在一块,整个3Dpipline都由CSP来控制,现在解耦之后,CSP管理ringbuffer,解析完3Dcommand之后再下发。所以存在CSPpoweron 但是3D submodule power down的情况。这就存在两个组件的异步。
- 如果driver中写了某个寄存器,没有做reset或者touch这个寄存器的前提下,寄存器的值再rmmod和insmod的时候不会改变,除了init中写的寄存器。
DVFS
dvfs 动态电压频率控制 cadence
静态功耗: 漏电压
动态功耗:寄生效应
时钟周期如何影响功耗?工作速率增加。信号处理加快,同一个时间段内上升沿下降沿增加,意味着状态改变加快,受控门/输出门电路变化快。门电路状态变化存在损耗,综上需要更大的功耗/功率,提升功耗在电阻相对的情况下,必须先加压。
CSP
Arch: BIU CSP MXU GPC 内部:MMIO CSparser IA 3Dparser 3DPreParse dmaL2 PreFetch
Sync: CSP外部握手BIU
internal external fence
Context:<就是模板 template=""> 可以分为2D 3D Group三种类型,每种类型可能对应不同的寄存器组。pipline的寄存器都是那些,每个类型的task对应的hardware的context register组合不一样,默认在memory中query一个上电init状态,然后保存各自不同的需求状态,作为各自的init context buffer/ shadow buffer,通过restore和save能快速保存恢复状态。做一次dma task,从restore save结束。 dirty sync,例如某一个任务在2d 3d切换,进行2d操作后直接更改了寄存器,memory保存的copy并未更新,需要flush操作将更改的寄存器值save sync一下,方便之后的操作。就是模板>
IA: Input assembler. 图元装配,根据数据buffer生成顶点。例如现在有一堆2维的点,这些点如何切分生成点线面呢?就是在IA。分成一个个点线面之后 Vertex顶点着色器就可以做三维投影变换的计算了。
CommandPreParse:一个DMA buf可能嵌套了好几层,预解析提前把下一级的dma buffer从mxu取出来,这个过程就是prefetch。preparse就是prefetch的前提,先将memory操作取出来,但是并没有执行,在MAC里排队(guess)。
Batch splitter:划分不同的顶点batch到不同的gpc,有划分规则才能组合到一起。
Execute Indirect:对于实例化数量多的场景,不用通过cpu重复下一样的command,GPU通过直接读取ringbuffer数据。实现原理是CSP提前下很多命令,cpu就不用干预了。只有dma command可以用,ring用不了。
DMA
CNU
CMMU is a multi-level cache to store PTE for address translation
物理内存
local:在uefi阶段就分好的 pcie:都是cpu visiable的 cpu visiable: 在bar上可见的 local cpu unvisiable:在bar上没有 物理空间不可见的local snoop: pcie unsnoop : pcie 通过share memory达到local的snoop
GPU VA内存
shared memory private memory