软件预读机制由来已久,首先实现预读指令的处理器是Motorola的88110处理器,这颗处理器首先实现了Touch Load指令,这条指令是PowerPC处理器dcbt指令[4]的前身。后来绝大多数处理器都采用这类指令进行软件预读,Intel在i486处理器中使用Dummy Read指令,这条指令也是后来x86处理器中PREFETCHh[5]指令的雏形。
使用软件预读指令可以在处理器真正需要数据之前,向存储器预先发出读请求,这个预读请求不需要等待数据真正到达存储器之后,就可以执行完毕,以实现存储器访问与处理器运算同步进行,从而提高了任务的整体执行效率。
除了专有指令外,普通的读指令也可以用作预读,如Non-Blocking的Load指令。这个读指令与Prefetch指令最大的区别是,这些指令不仅将数据引入Cache层次结构,而且会将结果写入某个寄存器,这类指令也被称为Binding Prefetch。与此对应,在微架构中专门设置的Prefetch指令被称为Non-Binding Prefetch指令。
Prefetch指令需要采用Non-Blocking,Non-Exception-Generating方式实现。Non-Blocking较易理解,因为在一个使用Blocking Cache的微架构中,没有使用Prefetch指令的任何必要。在微架构中,一个简单实现<