一种基于函数调用栈的数据预取方法和装置与流程

文档序号:16087467发布日期:2018-11-27 22:36阅读:292来源:国知局

本发明涉及微处理器数据预取技术,具体涉及一种基于函数调用栈的数据预取方法和装置。



背景技术:

现代处理器核心的快速发展,并且单个芯片上集成的处理器核数据日益增多,但是存储系统发展速度较慢,处理器核心和存储系统之间由于速度差异造成的“存储墙”问题日益严重。为了缓解存储问题,当前主流的方法是在处理器核和存储器之间设置多级Cache,并通过数据预取将数据提前放到离处理核心较近的Cache中。

数据预取操作通常分为两类,一类是软件预取,一类是硬件预取。软件预取通过在程序中插入预取指令,显式地通知处理器核将未来需要用到的数据先取回来放到某一级Cache中。软件预取具有较高的准确度,但是需要编程人员对数据访问进行分析,在合适的位置插入预取指令,加重了程序编写的负担。硬件预取通过分析历史访存的规律,自动生成预取请求,通常的预取算法包括预取下一行、跨步预取方法等,这些算法基于历史访问的地址进行,对有规律的访问具有较好的效果。一般来说,进一步提高数据预测准确率、增加能够预测的访问需要更复杂的算法,实现时也需要更多资源,运行时需要消耗更多功耗。

对于一些通过物理地址难以捕获的访存规律,可以很容易地通过分析程序执行特性提取。在程序的执行过程中,通过Call指令进行函数调用,在函数调用进入新的函数后,需要先保存调用该函数时的寄存器信息,以免破坏函数调用者的数据。保存寄存器信息的方法通常是将这些寄存器存放到存储器中。在被调用函数执行完后,首先将存放的寄存器信息恢复到寄存器中,即读取存储器的内容,然后再通过Ret指令返回到调用该函数的代码中。函数调用可以多层嵌套,故在存储其中会存储嵌套的多个函数的寄存器值。如图1所示,函数1在执行时,会先保存一些寄存器的值到存储空间中,然后执行函数的功能代码,在执行中会调用函数2;函数2在执行时又要保存一些寄存器的值到存储空间中,然后执行函数的功能代码,在执行的过程中又可能调用函数3;以此类推,调用到函数n时,保存相应的寄存器值,执行功能代码,然后返回。在返回前,需要从存储中恢复寄存器值,然后返回到函数n-1,直至返回到函数1。

可以看出,保存寄存器值和恢复寄存器值时,访问的存储空间是一致的。但是在函数执行的过程中,保存的寄存器值可能被替换出了Cache。通过捕捉寄存器保存和恢复的特性,可以构造准确的预取策略。



技术实现要素:

本发明要解决的技术问题:针对现有技术的上述问题,提供一种基于函数调用栈规律实现的基于函数调用栈的数据预取方法和装置,本发明具有准确率高、实现代价小、不影响现有预取器、集成方便、使用灵活的优点。

为了解决上述技术问题,本发明采用的技术方案为:

一种基于函数调用栈的数据预取方法,实施步骤包括:

1)跟踪指令执行部件当前执行的指令信息,如果指令跟踪结果为函数调用指令Call则跳转执行步骤2);如果指令跟踪结果为函数返回指令Ret则跳转执行步骤3);

2)将指令跟踪结果发送给堆栈地址缓存单元,所述堆栈地址缓存单元主要包含了一个先进后出的堆栈地址队列,堆栈地址队列的每项存储一个堆栈地址,将当前堆栈寄存器的值放入堆栈地址队列的头部,跳转执行步骤1);

3)将指令跟踪结果发送给堆栈地址缓存单元,将堆栈地址队列头部的存储项删除,并将新的队列头部地址读出,跳转执行步骤4);

4)根据读出的新的队列头部地址生成相应的预取请求,并将生成的预取请求发送给处理器中的存储部件,预取请求包含预取地址、预取粒度、预取目标。

本发明还提供一种基于函数调用栈的数据预取装置,所述数据预取装置被编程以执行本发明基于函数调用栈的数据预取方法的步骤。

本发明还提供一种基于函数调用栈的数据预取装置,包括:

Call/Ret指令跟踪单元,用于跟踪指令执行部件当前执行的指令信息,且在指令跟踪结果为函数调用指令Call或函数返回指令Ret时输出指令跟踪结果;

堆栈地址缓存单元,包含了一个先进后出的堆栈地址队列,堆栈地址队列的每项存储一个堆栈地址,且在指令跟踪结果为函数调用指令Call时将当前堆栈寄存器的值放入堆栈地址队列的头部;在指令跟踪结果为函数返回指令Ret时将指令跟踪结果发送给堆栈地址缓存单元,将堆栈地址队列头部的存储项删除,并将新的队列头部地址读出;

预取请求生成单元,用于根据读出的新的队列头部地址生成相应的预取请求,并将生成的预取请求发送给处理器中的存储部件,预取请求包含预取地址、预取粒度、预取目标。

优选地,所述Call/Ret指令跟踪单元输出指令跟踪结果时具体是指将指令跟踪结果通过2比特位的信息编码发送给堆栈地址缓存单元。

和现有技术相比,本发明具有下述有益优点:

1、准确率高。基于存储访问历史地址信息的预取方法是根据历史信息,预测未来访问地址,若要达到高精度必然引入复杂的算法。而本发明中基于程序调用栈的预取方法,保存寄存器信息时的地址,肯定是恢复寄存器信息所需的地址,所以需要预取的地址是确定的。只有在一些特殊情况下,预取的地址可能不正确,而普通的程序是不会出现这种情况的,故本发明中所提的预取方法的准确率极高,接近100%。

2、实现简单、实现代价小。本发明所提的方法主要开销在于堆栈地址的存储,而地址存储只需要10多个项,每个项只需存储几十bit的数据。Call/Ret命令的跟踪只需两个指令类型比较的比较器,预取地址的生成只需要简单组合逻辑就能完成,甚至可直接使用存储的地址。

3、不影响现有预取器,集成方便,使用灵活。本发明所提的预测算法预测的对象和访存模式与普通预测器是完全不同的,可以作为已有预测器的性能补充,方便集成添加到现有预取器中。

附图说明

图1为现有技术的函数嵌套调用时寄存器保存和恢复过程示意图。

图2为本发明实施例方法的基本实施流程示意图。

图3为本发明实施例支持基于函数调用栈的数据预取装置示意图。

图4为本发明实施例中预取请求结构示意图。

具体实施方式

如图2所示,本实施例基于函数调用栈的数据预取方法的实施步骤包括:

1)跟踪指令执行部件当前执行的指令信息,如果指令跟踪结果为函数调用指令Call则跳转执行步骤2);如果指令跟踪结果为函数返回指令Ret则跳转执行步骤3);

2)将指令跟踪结果发送给堆栈地址缓存单元,所述堆栈地址缓存单元主要包含了一个先进后出的堆栈地址队列,堆栈地址队列的每项存储一个堆栈地址,将当前堆栈寄存器的值放入堆栈地址队列的头部,跳转执行步骤1);

3)将指令跟踪结果发送给堆栈地址缓存单元,将堆栈地址队列头部的存储项删除,并将新的队列头部地址读出(也就是在图1中函数n返回时,读取函数n-1保存寄存器的存储位置地址。这样才能在数据使用之前,能够有足够的时间将数据取回),跳转执行步骤4);

4)根据读出的新的队列头部地址生成相应的预取请求,并将生成的预取请求发送给处理器中的存储部件,预取请求包含预取地址、预取粒度、预取目标。数据预取地址可以直接使用读出的地址,也可以根据程序特性决定预取请求的长度,例如,1个或者多个Cache行。也可以指定预取后数据存放的位置,例如L1 Cache, L2 Cache, L3 Cache等。预取粒度一般是1到多个Cache行,预取目标包括一级数据Cache、二级数据Cache等。生成的预取请求发送给处理器中的存储部件,就可以完成整个预取工作。

本实施例还提供一种基于函数调用栈的数据预取装置,该数据预取装置被编程以执行本实施例基于函数调用栈的数据预取方法的步骤。

如图3所示,本实施例还提供一种基于函数调用栈的数据预取装置,包括:

Call/Ret指令跟踪单元,用于跟踪指令执行部件当前执行的指令信息,且在指令跟踪结果为函数调用指令Call或函数返回指令Ret时输出指令跟踪结果;

堆栈地址缓存单元,包含了一个先进后出的堆栈地址队列,堆栈地址队列的每项存储一个堆栈地址,且在指令跟踪结果为函数调用指令Call时将当前堆栈寄存器的值放入堆栈地址队列的头部;在指令跟踪结果为函数返回指令Ret时将指令跟踪结果发送给堆栈地址缓存单元,将堆栈地址队列头部的存储项删除,并将新的队列头部地址读出;

预取请求生成单元,用于根据读出的新的队列头部地址生成相应的预取请求,并将生成的预取请求发送给处理器中的存储部件,如图4所示,预取请求包含预取地址、预取粒度、预取目标。数据预取地址可以直接使用读出的地址,也可以根据程序特性决定预取请求的长度,例如,1个或者多个Cache行。也可以指定预取后数据存放的位置,例如L1 Cache, L2 Cache, L3 Cache等。预取粒度一般是1到多个Cache行,预取目标包括一级数据Cache、二级数据Cache等。生成的预取请求发送给处理器中的存储部件,就可以完成整个预取工作。

本实施例中,Call/Ret指令跟踪单元输出指令跟踪结果时具体是指将指令跟踪结果通过2比特位的信息编码发送给堆栈地址缓存单元。Call/Ret指令跟踪单元跟踪函数调用的Call指令和函数返回的Ret指令,只需要简单的比较逻辑即可实现。由于指令执行部件在进行指令执行的时候,已经进行Call和Ret指令的解析,可以在指令执行部件中直接输出跟踪的结果。

以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1