计算机体系结构基础中的问题回答(胡伟武)
文章目录
- 计算机体系结构基础中的问题回答(胡伟武)
- 从按下键盘到PPT翻页的过程?
- 卡顿的原因?
- CPU微结构中影响性能的因素?
- 独显的数据传输问题?
- 什么是南桥、北桥,他们的功能是什么?
- 如何优化芯片功耗?x
- CMOS工艺面临的问题?x
- 摩尔定律对体系结构研究的主要问题?
- Amdahl定律?
- 平衡性?
- 向量化中断:什么是中断向量?
- 中断传递机制有哪些?特点是?
- TLB有哪些异常?
- 什么是ABI?
- 冯诺依曼结构是?
- 说说计算机结构?
- 你了解过SoC吗?
- 讲讲开机过程?
- 如何区分IO地址空间和内存地址空间?
- 什么是驱动程序?
- 既然cache能够大大提升程序运行效率,为什么不先对cache进行初始化呢?
- 谈谈乱序执行?
- 简述精确异常和非精确异常?
- 乱序下的精确异常?
- 什么是ROB?
- 动态调度后的流水线阶段调整?
从按下键盘到PPT翻页的过程?
- 按下键盘产生信号到南桥芯片
- 南桥芯片将信号编码保存(寄存器),并向CPU发一个外部中断
- CPU中Cause控制寄存器置为1,再根据status控制寄存器(中的屏蔽位)决定是否处理这个信号
- 屏蔽处理后的中断信号被附在一条译码后的指令上,送到ROB(re-order-buffer,重排序缓冲)
- ROB向所有模块发去小信号,取消该指令后面的所有指令,修改控制寄存器,转为核心态,保存异常原因、PC等,然后PC改为异常处理入口地址
- 进入中断处理,OS保存现场,再向控存读异常原因,发现是外部中断,询问南桥(读+清除中断位),得知有人敲了空格键
- OS检查空格所属=>PPT,于是唤醒PPT
- PPT运行,发现传来空格信号,于是准备好下一页,调用系统中的显示驱动程序,数据送显存,由GPU刷新屏幕
卡顿的原因?
-
有可能是系统当前任务过多导致的
-
也有可能是下一页包括很多图,GPU画不过来了
-
也有可能是内存的带宽不足,同时显示的数据量过大导致
-
除了CPU性能不够,内存带宽、硬盘或者网络带宽、GPU性能、CPU和GPU之间数据传输不顺等等
CPU微结构中影响性能的因素?
- 其中比较重要的是:Cache的命中率和转移猜测的命中率的改善。
- 但是通用CPU微结构中影响性能的因素非常复杂,重排序缓冲项数、发射队列项数、重命名寄存器项数、访存队列项数、失效队列项数、转移指令队列项数与一二三级Cache的失效延迟的平衡设计,有关队列大小应该保证一二级cache失效不会引起流水线堵塞。
独显的数据传输问题?
- 一般有两种机制:
- CPU读内存再写到显存,这个一般需要CPU有专门的IO加速功能
- 不通过CPU,直接内存访问(传输到显存)
什么是南桥、北桥,他们的功能是什么?
- 北桥负责CPU和内存、显卡之间的数据交换
- 南桥负责CPU和PCI总线以及外部设备的数据交换
- 上面的是早期的情况,现在基本上会采用弱北桥,或者把北桥功能集成到芯片和南桥中,也就没有北桥这个芯片了,实际中修电脑主板的时候会开玩笑地说维修三板斧的第一板——换南桥
如何优化芯片功耗?x
- 一般从两个角度入手——动态功耗优化和静态功耗优化
- 动态功耗优化:升级工艺可以降低电容电压,从而降低动态功耗。
- 静态功耗优化:选择低功耗工艺降低静态电压,虽然慢一些但是漏电功耗成数量级降低。
CMOS工艺面临的问题?x
- 问题如下:
- 蚀刻问题越来越难处理,可制造性问题突出
- 片内漂移问题突出,同一个硅片内不同位置的晶体管都不一样
- 栅氧厚度持续降低,导致漏电急剧增加,再薄下去就短路了
- 缓解方案
- 90/65:应力硅,绝缘硅,铜互连,低K介电材料
- 45/32:高K介电材料(提升栅极有效厚度)
- 22~现在:FinFET工艺,但是在三星5nm中出现漏电发热现象
摩尔定律对体系结构研究的主要问题?
- 存储墙问题
- (频率做不上去),晶体管的驱动能力变小,连线电容相对变大,所以连线延迟变大,当前连线延迟成为主导,这要求结构设计更加讲究互连的局部性
- 漏电功耗突出
Amdahl定律?
- 通使用某种较快的执行方式获得的性能的提高,受限于不可以使用这种方式提高新能的执行时间所占总执行时间的百分比。
平衡性?
- 结构设计的第一个原则就是要考虑平衡性。一个木桶所盛的水量的多少由最短的木板决定,一个结构最终体现出的性能受限于其瓶颈部分。
向量化中断:什么是中断向量?
- 「中断向量」(interrupt vector)是放在「中断向量表」(interrupt vector table)里的。我觉得这里的「表」才是「数组」的意思,而每个「中断向量」是数组中的元素,是指向中断服务程序的指针。之所以把这个「指针」叫作「向量」,是因为「向量」可以看成是「有方向的量」,所以具有「指向」的功能。
中断传递机制有哪些?特点是?
- 主要有两种形式:中断线和消息中断
- 中断线:
- 简便直接,比较适合SoC(System On Chip)
- 扩展性不强,在复杂的板级系统时会有过多的共享,从而导致中断的效率下降
- 中断处理过程中需要查询中断控制器以及设备上的状态控制器来确认中段原因,有较长的延迟
- 消息中断:
- 以数据的方式在总线上传递中断。发中断就是往指定地址写一个指定的数。
- 增加中断的时候不需要改动消息传递的数据通路,因而有较高的扩展性和灵活性
- 中断处理程序无需查询设备状态,只需根据中断号就可以进行下一步的处理
TLB有哪些异常?
- TLB重填:TLB中没有相应表项(最为频繁,故有专门的异常处理入口)
- TLB无效:相应的物理页不在内存中(需要调页)
- TLB修改:试图修改只读页(OS判断是否开放权限还是杀死进程)
什么是ABI?
- ABI=Application Binary Interface,应用程序二进制接口:描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
- 它通常包括:寄存器的使用、函数调用、数据表示格式等约定。
冯诺依曼结构是?
- 运算+控制+存储+输入+输出
- 以存储程序和指令驱动执行为主要特点
- 近些年,这个结构有了改进
- 以存储器为中心
- 由单一的集中控制转为分散控制
- 适应并行算法
- 出现为适应特殊需要的专用计算机(GPU)
- 它还有个变种——哈佛结构,把程序和数据分开存储
说说计算机结构?
- 早期的结构一般是:CPU-GPU-北桥-南桥
- 其中北桥离CPU最近,控制GPU(独立显卡)、内存、PCI总线等
- 南桥则控制BOOT ROOM,IDE USB等IO接口
- 后来把GPU集成到北桥中,形成了CPU-北桥-南桥
- PCI从北桥放到了南桥,北桥则控制PCIE、网卡等接口
- 由于冯诺依曼瓶颈,系统对内存接口等带宽需求一度超过处理器与北桥之间的处理器总线接口,于是就有了内存墙问题,后来将内存控制器集成到CPU中,就有了CPU-弱北桥-南桥结构
- CPU-南桥结构,是在GPU被集成到GPU中之后,北桥存在性降低,于是和南桥合并
- 但是这个结构有个缺陷——CPU和GPU都需要频繁访问内存,于是这在一定程度上会影响CPU的性能
你了解过SoC吗?
- SoC=System on Chip,即片上系统,是一种单片计算机系统解决方案,在单个芯片上集成了处理器、内存控制器、GPU以及硬盘、USB、网络等IO接口
- 这种工艺一般用在移动领域上,因为其集成度更高,更好做功耗控制(虽然迭代开销比较大)。
讲讲开机过程?
- 1、处理器复位,它控制处理器的第一条取指
- 2、调试接口初始化,也就是串口控制器的初始化,这样可以获得简单的调试手段
- 3、TLB初始化,包括TLB逐行清空,将BIOS中希望使用的地址映射填入TLB表——得到了更大的地址空间
- 4、cache初始化,包括Tag和ecc初始化——得到了更快的发射速度
- 5、内存初始化,初始化内存控制器
- 6、IO总线初始化,包括设置IO地址访问空间;设置DMA空间;对HyperTransport升频;以及一些与桥片特性相关的配置寄存器的初始化
- 7、设备探测驱动加载,基于PCI协议,枚举设备号进行扫描,再根据设备识别号+厂商识别号加载驱动
- 8、多核唤醒,主核利用信箱寄存器串行唤醒从核,至此硬件加载完成,启动操作系统。
如何区分IO地址空间和内存地址空间?
- MIPS处理器上运行地址用等是虚拟地址,而虚拟地址分为cache和Uncache两种
- 对于内存操作,高性能处理器一般使用cache方式进行访问,以提升访存性能
- 对于IO,一般不用cache(这可能导致处理器无法得到状态的更新),而使用Uncache
什么是驱动程序?
- 驱动程序就是一组函数,包含了用于初始化设备、关闭设备、或使用设备的各种相关操作。
既然cache能够大大提升程序运行效率,为什么不先对cache进行初始化呢?
- cache能够大大提升程序运行效率,但随之而来的是处理器内各种复杂猜测机制的使用,如取数操作的猜测执行可能落在TLB映射空间的访存操作,如果此时TLB未完成初始化,就可能导致TLB异常发生的时候没有TLB异常处理机制,然后导致系统崩溃。
谈谈乱序执行?
- 与顺序执行相对,乱序执行指指令不按顺序执行
- 在指令流中,存在不相关的指令,那么理论上他们可以不按原先的顺序执行,这就是乱序执行
- 其实现就是:
- 利用保留站把有序的指令变为无序,在译码后执行前检查操作数是否准备好,若操作数OK,则进入执行状态;反之等待操作数准备好
- 执行好的指令进入ROB(重排序缓存),将指令执行结果按照原先的顺序输出
- 在执行过程中,可以用重命名寄存器存储临时数据
简述精确异常和非精确异常?
- 非精确异常:在多发射乱序执行的流水线 CPU 上,从指令进入流水线到异常事件的发生,期间要经过若干流水级,此时 PC 的值已指向其后的某条指令,在实现非精确异常的 CPU 上就把此时的 PC 值作为引起异常指令的所在(为了表达的方便,记为 eptr)。
- 精确异常:eptr 的指向就是真正引起异常的指令之所在,而实现精确异常的 CPU,则在最后指令提交时 (commit) 按指令流的顺序提交,异常的抛出也在该指令提交时,这样就能精确计算出引起异常的指令相对于当前 PC 的偏移,从而保证精确异常。
- 另外一本书上的说法是,在执行过程中记录发生的异常,等到写回的时候再处理,当同时发生了多条例外,则按顺序处理。
- 这其中包括外部中断,也作为IF(取指)当异常等到WB阶段再处理。
- 另外一本书上的说法是,在执行过程中记录发生的异常,等到写回的时候再处理,当同时发生了多条例外,则按顺序处理。
乱序下的精确异常?
Q1:在顺序执行的时候,发生异常的指令及其后面的指令都没有执行,但是在乱序中,原先的顺序已经打破,那么如何获得“前面”、“后面”的关系呢?
Q2:在乱序执行中,发生异常的指令后面的指令都不能修改机器的状态,但是这些指令说不定已经越过异常的指令先去执行了,这个怎么办?
- A:在流水线中添加一个重排序缓存(ROB)来维护指令的有序结束,同时在流水线中增加一个提交阶段,指令对机器状态的修改只能在提交阶段生效(软件可见)。
- 处于写回阶段的指令不能真正地修改机器状态,但是可以更新维护一个临时的软件不可见的机器状态。
什么是ROB?
- ROB=重排序缓冲,结构类似一个先进先出的队列,所有指令在译码之后按程序顺序进入队列尾部,所有执行完毕的指令从队头按序提交,提交时一旦发生异常,出现在ROB首部,则该指令及其后面的指令全部被清空,于是异常指令及其后面的指令就不会修改机器状态,且可以精确定位到异常指令位置,满足精确异常的要求。
动态调度后的流水线阶段调整?
- 取指-译码-发射-执行-写回-提交