性能优化(14)特别篇——性能优化之道

  1. 1. 性能优化问题的本质
  2. 2. 性能优化的流程
  3. 3. 影响性能的四大类问题
  4. 4. 隐藏的几类小问题
  5. 5. 性能问题可能的情况(选择性采纳)
  6. 6. 经常用的优化思路

性能优化问题的本质

  • 慢与快的问题
  • 前提:
    • 稳定性:不能因优化造成稳定性变差
    • 兼容性:不能因优化导致兼容性变差
    • 性价比:优化要有度,考虑成本与复杂度

性能优化的流程

影响性能的四大类问题

  • CPU
  • GPU
  • 带宽
  • 内存

  • 可以把GPU、CPU分别理解为生产相关产品的两个工厂;内存和其他存储视为仓库;带宽视为运输路线
  • 性能的瓶颈可能会发生在两个工厂的生产能力、仓库的存储能力、工厂与工厂以及工厂与仓库之间的道路是否畅通、运输工具和运输能力是否跟得上
  • 工厂内(CPU、GPU)也像整个工厂系统,它们内部也分为车间,也就是芯片内的逻辑处理单元(ALU)与工厂内的仓库比如L1、L2、L3级的缓存,以及它们之间的通讯总线。它们像车间与车间之间、车间与厂内仓库之间的道路等工厂系统。所以一旦定位到CPU与GPU上的问题时,我们还要再去看这个工厂内的系统优化。整个过程像套娃,优化也需要迭代进行
    CPU
    GPU

隐藏的几类小问题

  • 功耗比
  • 填充率
  • 发热量

  • 功耗比:可以理解为工厂生产相同数量的产品所需要耗费的能源。对比设备上,就是达到相同计算能力的耗电量。这对一些用电池的设备也是个性能指标。同样,功耗比越高,发热量也就会越大
  • 填充率:可以理解为工厂运输道路使用50t/车的运输载具,载具每小时出发,但是你的工厂每小时只能生产30t的产品;或者说运输载具只有20t,你一车装不完,两车又浪费的情况。换到实际渲染中,纹理或资源很大,带宽一次传不过去,两次又浪费的情况。这时需要修改资源大小来匹配设备的带宽,避免填充率不足或带宽阻塞问题
  • 发热量:比如你的芯片主频很高,但功耗比很差,那么发热量也一定会升高。另外还有一些移动设备不仅芯片发热,显示屏幕的功耗高也会造成发热。这些问题都会带来整体硬件环境温度高,一些操作系统会防止硬件温度过高而自动采取硬件降频的方式,这同样会带来一些性能问题

性能问题可能的情况(选择性采纳)

  • 瓶颈可能性按由高到低的顺序排列(个人经验总结):
    • CPU利用率
    • 带宽利用率
    • CPU/GPU强制同步导致的阻塞问题
    • 片元着色器复杂
    • 顶点Buffer可读写造成的CPU到GPU之间的传输问题
    • 可读写的纹理CPU到GPU之间的传输问题
    • 顶点着色器复杂
    • 由于三角形数过多导致的几何复杂度过高
  • 瓶颈检查优先检查CPU所带来的情况。而GPU端的瓶颈往往大概率是片元着色器的问题,这点瓶颈也很好确认,我们只需要改变显示分辨率即可快速确认是不是由于片元着色器所带来的问题

经常用的优化思路

  • 升维与降维
    • 一般来说,升维是用来优化性能,但从算法方面来说可能不太容易理解;而降维是为了方便理解算法,但性能往往会比较差。比如多线程并行程序往往会比单线程串行的更高效,当然前提是并行的优化要大于创建多线程资源的开销。
    • 高维度也可以降低低维度上无法解决的问题,比如变换矩阵的齐次坐标、四元数解决万向节锁的问题等
  • 维度转换,空间与时间,量纲转换
    • 做优化要有维度转换的概念,如空间维度与时间维度的转化,面向对象设计的ASO到面向数据设计的SOA的转化,量纲的转化,积分变换等。这些都可以理解为维度的转换。
    • 其中,以空间换时间是大多数算法优化最直接的方式,如通过缓存池避免每次分配带来的开销,TAA和DLSS都是通过时间维度上的卷积来实现优化的
    • 你将一张2K大小的图弄成四帧1K大小的图哪里有省?处理的像素不是一样多吗?——有时间维度参与计算的话,上一帧处理的像素在下一帧可能没有发生变化,这样就不用重新计算,不就节省了吗