一 预取
为了隐藏latency,预取机制需要:1)准确的预测memory访问地址 2) 预测何时预取 3)选择在哪里放置预取的数据
1.1 预取地址
如果程序执行的是顺序的访问数组,那么预取的地址有规律,比较方便做。但是如果是间隔的访问变量,多重数据结构或者是控制流相关的访问,比如访问二叉树,那么地址就不好预测。
上面说的是数据预取,那么对指令的预取的效果就主要依赖于程序是顺序执行,还是正在执行分支。顺序预取比较简单,但是指令控制流的行为以及该行为是否可预测,就决定了指令预取的效果。
预取地址也依赖于cache的层级。最高级的cache,直接与CPU连接,此时它可以获得准确且完整的CPU访问行为,但是将数据预取到最高级的cache中,如果cache本来就会命中,那么在最高级cache中实现的prefetcher就会浪费资源。相反,在最低级的cache中,它接触到的访问次序都已经被上层cache过滤掉了,因此只会接触到上层cache miss的部分。此外,cache也可能会被cache替换策略所干扰。
现在的研究中,一般将对prefetch的效果分为两部分:coverage和accuracy。
coverage就是prefetch减少了多少cache miss。 Accuracy则是prefetch发出的数据中的有用部分的占比。很多简单的prefetcher是通过牺牲准确率来提高覆盖率,然而理想的prefetcher能够同时兼顾高准确率和覆盖率。
1.2 提前预取
准确的预测何时发出预取也是一个挑战。如果预取的过早,cache可能无法长时间hold所有预取来的数据。被预取来的数据可能被victim出去,也有可能反而把有用的数据victim出去。如果预取的过晚,那么就起不到prefetch的效果。
1.3 存放预取数据的位置
如果是软件的策略,可能会想要将prefetch来的数据存放到寄存器。硬件预取一般会将数据直接存到cache或者是buffer中,因为它们也受cache一致性的保护。
【缓存预取】Primer on Hardware Prefetching(一)
最新推荐文章于 2023-01-08 02:42:13 发布
欢迎关注我的公众号《处理器与AI芯片》