Cache in action

cache这个东西在游戏开发中绝对是扮演超级巨星的角色。

在处理器(cpu,gpu)发展如此神速的今天,几乎ALU计算很难成为瓶颈,而数据访问则常常成为问题所在。

 

cache是一个硬件上的结构(virtual memory则是由操作系统来控制),是对processor访问memory的一种优化。

概率问题在软硬件设计中起了很大作用像cache这个依照space和时间上的重用高概率,像swizzle格式的texture遵守texture访问在块状(而不是线性的)上的高概率。

cache就是对物理内存最近常用的部分做备份,以cache line为单位(类似virtual memory以page为单位),cacheline是硬件决定的。

其中有n-way associative和write through/back等需要注意的地方。

所有这些性质决定了写程序时候会产生非常大的效率差别。

 

先来个powerpc的例子吧(见到什么说什么,也不局限于cache了)

 

InstructionUnit

  • L1 cache----32k, 2way associative, 128B cache line(cache line大小和page没关系的,一个是硬件的事情,一个是操作系统的事情)
  • 64 entry, 2way associative, TLB-----page table的cache
  • 4k*2 branch hitory table-----有根据历史记录预测branch的能力呃
  • out of order completion of load cache miss instructions----会导致processor级别的读乱序,必要时候注意多线程同步呃,参见前面lockless programming处理情况。sync系列函数搞定。
  • 12 stage issue queue for separate handling of VXU/FPU instructions----(应该是instruction pipeline)

FixedPoint and Load/store execution Unit

  • 32k, 4way, 128B cache line, write through
  • 64 entry, 2way, TLB
  • 8 load miss queue, 16 store queue,

Vector/Scaler Unit(VSU)

  • no L1 cache

 

 提升cache性能的一些方法,只总结开发者可控部分吧,类似增加cache size,增加cache level这种是硬件开发者的事情,就飘过。

  • 数据的alignment----这个可以保证数据会占用尽可能少的cache line,cache performance也会变小
  • 压缩数据----bitfield替换bool,尽可能小的数据格式,编译时候选择最小size而不是最优化(优化instruction cache)都是不错的选择
  • 常访问的数据集中化
  • prefetch,在知道后面要用这个数据了,就先把数据读进来

最后要说的就是现在硬件过于复杂,在某个平台上开发经验有限的情况下,general的知识最好只做指导方向用,真正优化还是要跟着硬件手册和profile结果来,而不是主观推测。

假设经常出错呃。


原文链接: http://blog.csdn.net/ccanan/article/details/5096455

你可能感兴趣的:(Cache in action)