曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5661|回复: 0
打印 上一主题 下一主题

CPU|一级缓存,二级缓存与指令预取

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-12-18 16:41:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当执行单元需要指令和数据时,古老的 IA-32 系列处理器直接从系统内存内获取它们。但是,处理这些指令的时间要远小于从内存中获取数据的时间,这就发生了待办工作积压的情况,因此处理器经常等待从内存获取指令和数据。为了解决这个问题,就建立了预取 (prefetch) 的概念。

预取,就是预先取得,其意是“试图在执行单元实际需要指令和/或数据之前获取它们”。为了实现预取,处理器本身需要一个专门的存储区域。这块区域,处理器很容易访问这一区域,而且访问的速度要比内存要快得多。这是使用管线操作(pipeline)实现的。

管线操作涉及到在处理器芯片中创建内存缓存,在处理指令和数据之前,可以从缓存中获取和存储它们。当执行单元为下一条指令做好准备时,这条指令已经在缓存中,并且可以被快速的处理。

IA-32 平台通过使用两级 (或者更多级) 的缓存实现管线操作。

第一个缓存称为一级缓存(L1),在它认为处理器将需要指令和数据时,会试图从内存预取它们。随着指令指针在内存中移动,预取算法确定应该读取哪些指令码并且把它们放到缓存中。按照类似的方式,如果要处理内存中的数据,预取算法就会试图确定接下来要访问什么数据元素,也从内存中读取它们并且把它们放在缓存中。

但是,对指令和数据进行缓存的一个缺陷是不能保证程序将按照连续的顺序执行指令。如果指令采用某一逻辑分支,使指令指针转移到内存中完全不同的位置,那么整个缓存就没有用了!这时候,就必须清空整个缓存并且使用来自新位置的指令重新填充缓存。

为了解决这个矛盾,于是创建了二级缓存(L2)这个概念。二级缓存也是用来保存指令码和数据元素的,它独立于一级缓存。当程序逻辑跳转到内存中完全不同的区域去执行指令时,二级缓存仍然保存着来自前面指令位置的指令。如果程序逻辑跳转回这个区域那么这些指令仍然被缓存着,并且处理这些指令的速度几乎和一级缓存里的指令一样的迅速。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 16:43 , Processed in 0.064612 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表