level 9
专业程序开发
楼主
技术要点:以提高缓存命中为目标提高程序运行性能。
随着软件需求的日益复杂发展,远古时期的面向过程编程(POP)思想才渐渐萌生了面向对象编程思想。当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象(OOP),热衷于研究如何更加优雅地抽象出对象。然而现代开发中渐渐发现面向对象编程层层抽象造成臃肿,导致运行效率降低,而这是性能要求高的游戏编程领域不想看到的。
之后,面向数据编程(DOP)的思想越来越被接受,已经是现代游戏编程中不可或缺的一部分,ECS 架构也成了游戏工业界里架构的一个
典中典
。
这次的主题是从 CPU Cache 的角度出发来减少 memory-bound 和从指令级并行(SIMD 指令)的角度出发来减少 CPU-bound
利用 CPU Cache
一般的数据通路:CPU Register(CPU 寄存器) <————> Main Memory(内存)
CPU 的运行频率非常快,而 CPU 访问内存的速度很慢。在上述数据通路的情况下,在处理器时钟周期内,CPU 常常需要等待寄存器读取内存,浪费时间。
CPU Cache 是介于内存和 CPU 寄存器之间的一个存储区域。CPU 访问 CPU Cache 速度会比访问内存快很多,但同时 CPU Cache 的存储空间比内存小,比寄存器大 。
引入了Cache的数据通路:CPU Register(CPU 寄存器) <————> CPU Cache(CPU 缓存) <————> Main Memory(内存)
为了缓解 CPU 和内存之间速度的不匹配问题,则会让 CPU Cache 充当它们之间的一个缓冲中介。
CPU Cache 会预先读取好CPU可能会访问的内存数据到 Cache 上。
如果 Cache 命中成功,则 CPU 便可以很快从 Cache 上读取出想要的内存数据到寄存器(减少 memory-bound)
如果 Cache 命中失败,那么 CPU 便直接访问内存
下图是一个现代CPU(Intel Core i7 Cache Hierarchy)的简化架构样例,可以大概了解下 Cache 的分级和关系:CPU core 的 Register(寄存器)可以和 L1 d-cache 直接通信;一个 CPU core 拥有 L1 d-cache(数据缓存),L1 i-cache(指令缓存),L2 cache;多个 CPU core 共享 L3 cache
那么 CPU Cache 一般读取的数据是什么呢?它是基于两个局部性来决定的:
空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问。
CPU Cache 根据这两个特点,一般存储的是 最近被访问过的数据 和 被访问数据的相邻数据。
2023年09月05日 21点09分
1
随着软件需求的日益复杂发展,远古时期的面向过程编程(POP)思想才渐渐萌生了面向对象编程思想。当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象(OOP),热衷于研究如何更加优雅地抽象出对象。然而现代开发中渐渐发现面向对象编程层层抽象造成臃肿,导致运行效率降低,而这是性能要求高的游戏编程领域不想看到的。
之后,面向数据编程(DOP)的思想越来越被接受,已经是现代游戏编程中不可或缺的一部分,ECS 架构也成了游戏工业界里架构的一个
典中典
。
这次的主题是从 CPU Cache 的角度出发来减少 memory-bound 和从指令级并行(SIMD 指令)的角度出发来减少 CPU-bound
利用 CPU Cache
一般的数据通路:CPU Register(CPU 寄存器) <————> Main Memory(内存)
CPU 的运行频率非常快,而 CPU 访问内存的速度很慢。在上述数据通路的情况下,在处理器时钟周期内,CPU 常常需要等待寄存器读取内存,浪费时间。
CPU Cache 是介于内存和 CPU 寄存器之间的一个存储区域。CPU 访问 CPU Cache 速度会比访问内存快很多,但同时 CPU Cache 的存储空间比内存小,比寄存器大 。
引入了Cache的数据通路:CPU Register(CPU 寄存器) <————> CPU Cache(CPU 缓存) <————> Main Memory(内存)
为了缓解 CPU 和内存之间速度的不匹配问题,则会让 CPU Cache 充当它们之间的一个缓冲中介。
CPU Cache 会预先读取好CPU可能会访问的内存数据到 Cache 上。
如果 Cache 命中成功,则 CPU 便可以很快从 Cache 上读取出想要的内存数据到寄存器(减少 memory-bound)
如果 Cache 命中失败,那么 CPU 便直接访问内存
下图是一个现代CPU(Intel Core i7 Cache Hierarchy)的简化架构样例,可以大概了解下 Cache 的分级和关系:CPU core 的 Register(寄存器)可以和 L1 d-cache 直接通信;一个 CPU core 拥有 L1 d-cache(数据缓存),L1 i-cache(指令缓存),L2 cache;多个 CPU core 共享 L3 cache
那么 CPU Cache 一般读取的数据是什么呢?它是基于两个局部性来决定的:
空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问。
CPU Cache 根据这两个特点,一般存储的是 最近被访问过的数据 和 被访问数据的相邻数据。