首页 理论教育数据预读机制及其执行效率提升

数据预读机制及其执行效率提升

【摘要】:Steven P.Vanderwiel与David J.Lilja总结了最近出现的各类数据预读机制,下面将以图3-11为例进一步探讨这些数据预读机制。处理器在第17~22时钟周期从存储器读取数据,并在第22个时钟周期继续执行第三阶段任务的8个时钟周期,之后访问存储器,此时也将发生Cache Miss。合理使用这些数据预读,完成同样的任务CPU仅需要28个时钟周期,从而极大提高了程序的执行效率,其执行过程如下。

数据预读是指在处理器进行运算时,提前通知存储器系统将运算过程中需要的数据准备好,而当处理器需要这些数据时,可以直接从这些预读缓冲(通常指Cache)中获得这些数据。Steven P.Vanderwiel与David J.Lilja总结了最近出现的各类数据预读机制,下面将以图3-11为例进一步探讨这些数据预读机制。

978-7-111-29822-9-Part01-49.jpg

图3-11 数据预读机制示意图

图3-11列举了三个实例说明数据预读的作用。其中实例a没有使用预读机制;实例b是一个采用预读机制的理想情况;而实例c是一个采用预读机制的次理想情况。我们假设处理器执行某个任务需要经历四个阶段,每个阶段都由处理器执行运算指令和存储指令组成。而处理器一次存储器访问需要5个时钟周期。其中每一个阶段的定义如下所示。

(1)处理器执行4个时钟周期后需要访问存储器。

(2)处理器执行6个时钟周期后需要访问存储器。

(3)处理器执行8个时钟周期后需要访问存储器。

(4)处理器执行4个时钟周期后完成。

实例a由于没有使用预读机制,因此在运算过程中需要使用存储器中的数据时,不可避免地出现Cache Miss。实例a执行上述任务的过程如下。

(1)执行第一阶段任务的4个时钟周期,之后访问存储器,此时将发生Cache Miss。

(2)Cache Miss需要使用一个时钟周期[44],然后在第5个时钟周期启动存储器读操作。

(3)在第10个周期,处理器从存储器获得数据,继续执行第二阶段任务的6个时钟周期,之后访问存储器,此时也将发生Cache Miss。

(4)处理器在第17~22时钟周期从存储器读取数据,并在第22个时钟周期继续执行第三阶段任务的8个时钟周期,之后访问存储器,此时也将发生Cache Miss。(www.chuimin.cn)

(5)处理器在第31~36时钟周期从存储器读取数据,并在第36个时钟周期继续执行第四阶段任务的4个时钟周期,完成整个任务的执行。

采用这种机制执行上述任务共需40个时钟周期。而使用预读机制,可以有效缩短整个执行过程,如图3-11中的实例b所示。在实例b中在执行过程中,都会提前进行预读操作,虽然这些预读操作也会占用一个时钟周期,但是这些预读操作是值得的。合理使用这些数据预读,完成同样的任务CPU仅需要28个时钟周期,从而极大提高了程序的执行效率,其执行过程如下。

(1)首先使用预读指令对即将使用的存储器进行预读[45],然后执行第一阶段任务的4个时钟周期。当处理器进行存储器读时,数据已经准备好,处理器将在Cache中获得这个数据然后继续执行[46]

(2)处理器在执行第二阶段的任务时,先执行2个时钟周期之后进行预读操作,最后执行剩余的4个时钟周期。当处理器进行存储器读时,数据已经准备好,处理器将在Cache中获得这个数据然后继续执行。

(3)处理器执行第三阶段的任务时,先执行4个时钟周期之后进行预读操作,最后执行剩余的4个时钟周期。当处理器进行存储器读时,数据已经准备好,处理器将在Cache中获得这个数据然后继续执行。

(4)处理器执行第四阶段的任务,执行完4个时钟周期后,完成整个任务的执行。

当然这种情况是非常理想的,处理器在执行整个任务时,从始至终是连贯的,处理器执行和存储器访存完全并行,然而这种理想情况并不多见。

首先在一个任务的执行过程中,并不易确定最佳的预读时机;其次采用预读所获得数据并不一定能够被及时利用,因为在程序执行过程中可能会出现各种各样的分支选择,有时预读的数据并没有被及时使用。

在图3-11所示的实例c中,预读机制没有完全发挥作用,所以处理器在执行任务时,Cache Miss时有发生,从而降低了整个任务的执行效率。即便这样,实例c也比完全没有使用预读的实例a的任务执行效率高一些。在实例c中,执行完毕图3-11中所示的任务共需要34个时钟周期。

但是在某些特殊情况下,采用预读机制有可能会降低效率。首先在一个较为复杂的应用中,很有可能预读的数据没有被充分利用,一个程序可能会按照不同的分支执行,而执行每一个分支所使用的数据并不相同。其次预读的数据即使是有效的,这些预读的数据也会污染整个Cache资源,在大规模并行任务的执行过程中,有可能引发Cache颠簸,从而极大地降低系统效率。

什么时候采用预读机制,关系到处理器系统结构的每一个环节,需要结合软硬件资源统筹考虑,并不能一概而论。处理器提供了必备的软件和硬件资源用以实现预读,而如何“合理”使用预读机制是系统程序员考虑的一个细节问题。数据预读可以使用软件预读或者硬件预读两种方式实现,下文将详细介绍这两种实现方式。