支持simd体系结构的分布式堆栈数据存储方法

文档序号:6545054阅读:186来源:国知局
支持simd体系结构的分布式堆栈数据存储方法
【专利摘要】本发明公开一种支持SIMD体系结构的分布式堆栈数据存储方法,在内存中分布式分配堆栈空间,在标量存储器中分配存储标量信息的标量栈,在向量存储器中分配存储向量信息的向量栈;当程序编译时,将标量单元需要访问的局部变量分配在标量栈中,将向量单元需要访问的局部变量分配在标量栈中;当程序运行时,将程序切换现场需要保存的标量信息保存在标量栈中、需要保存的向量信息保存在向量栈中,程序现场返回时,直接从标量栈中读取标量信息到标量单元、从向量栈中读取向量数据到向量单元。本发明具有堆栈数据存储和访问速度快、带宽需求小、系统性能高且功耗低的优点。
【专利说明】支持SIMD体系结构的分布式堆栈数据存储方法
【技术领域】
[0001]本发明涉及SMD处理器领域,尤其涉及一种支持SMD体系结构的分布式堆栈数据存储方法。
【背景技术】
[0002]随着问题规模的增大和对实时性要求的提高,只有标量单元的微处理器的处理能力已难以满足应用需求,SIMD (Single Instruction Data,单指令多数据流)向量处理器尤其是带有向量单元的微处理器在业界得到了广泛应用。
[0003]程序的运行状态一般由编译器通过堆栈进行管理,即运行时在内存中分配一块内存作为堆栈,对函数运行过程的上下文、局部变量以及动态分配的数据区等进行管理从而可以支持函数调用、中断处理以及动态数据区的分配等。目前,已有编译器中堆栈的构建一般是在内存中分配一块物理上连续的空间,堆栈存储的内容包括局部变量、临时变量、上层函数栈底、通用寄存器、条件寄存器、函数返回地址、上层函数栈顶以及动态分配区等内容。
[0004]在SMD微处理器的应用程序中,局部变量包括标量局部变量和向量局部变量,保存现场需要保存的寄存器包括标量寄存器和向量寄存器,调用参数包括标量参数和向量参数,同时分配动态内存区所存储的数据也包括标量数据和向量数据。而在SMD微处理器体系结构中,一方面通常由标量单元负责执行程序的流控,另一方面向量存储器对所要存储的数据长度以及存储边界要求更为严格,因此一般的堆栈结构直接存储于向量存储器效率较低,故目前业界一般SMD微处理器体系结构的堆栈都分配在标量存储器中。将堆栈放置于标量存储器中在功能上虽然能够达到程序的正确性要求,然而对SMD微处理器体系结构性能支持方面存在以下缺陷:
(1)由于SMD微处理器的向量处理单元通常比较多,因此向量参数和向量寄存器的位也比较宽。假设SMD微处理器含有P个向量单元,则一个32位整数类型的向量参数,其长度为32*P位,因此从放置于标量存储器的堆栈中读取向量数据要花费较长的访问时间并占用较大带宽;
(2)由于向量数据位宽很大,因此在存储、访问堆栈时需要较长时间占用标量存储器的访问端口,从而阻塞了标量单元的存储器访问;
(3)由于标量存储器并不直接连接向量单元,因此需要通过向量存储器进行中转。如从堆栈中读取向量数据时需要将堆栈数据通过DMA (Direct Memory Access,直接存储访问)从标量存储器传输到向量存储器,然后再通过向量的访存操作将数据从向量存储器读取到向量寄存器中,因此访问向量数据需要进行两步操作,更进一步降低了系统性能。

【发明内容】

[0005]本发明要解决的技术问题就在于:针对现有技术存在的问题,本发明提供一种实现方法简单、堆栈数据存储和访问速度快、带宽需求小、系统性能高且功耗低的支持SMD体系结构的分布式堆栈数据存储方法。[0006]为解决上述技术问题,本发明提出的技术方案为:
一种支持SIMD体系结构的分布式堆栈数据存储方法,在内存中分布式分配堆栈空间,分别在标量存储器中分配用于存储标量信息的标量栈,在向量存储器中分配用于存储向量信息的向量栈;程序编译时,将标量单元需要访问的局部变量分配于标量栈中,向量单元需要访问的局部变量分配于向量栈中;程序运行时,将程序现场切换时需要保存的标量信息保存在标量栈中、需要保存的向量信息保存在向量栈中,程序现场返回时,直接从标量栈中读取标量信息到标量单元、从向量栈中读取向量信息到向量单元。
[0007]作为本发明的进一步改进,所述标量栈中存储的标量信息包括:标量局部变量、标量临时变量、上层标量帧指针、上层向量帧指针、标量通用寄存器、标量条件寄存器、标量参数、函数返回地址、上层标量栈指针、上层向量栈指针和标量动态数据。
[0008]作为本发明的进一步改进,所述向量栈中存储的向量信息包括:向量局部变量、向量临时变量、向量通用寄存器、向量参数和向量动态数据。
[0009]作为本发明的进一步改进,所述程序编译后还包括链接程序时,在链接脚本文件中配置标量栈和向量栈的大小、起始地址。
[0010]作为本发明的进一步改进,所述程序运行时的具体步骤为:
(3.1)判断程序执行的状态;
(3.2)当步骤(3.1)判断为调用函数时,将标量单元的标量局部变量、标量临时变量、上层标量函数的栈底指针、函数返回地址、标量调用参数、需要保存的标量寄存器信息保存到标量栈中,将向量单元的向量局部变量、向量调用参数、需要保存的向量寄存器信息保存到向量栈中;调用完函数返回时,将标量栈中信息读取到标量单元的相应寄存器中,将向量栈中信息读取到向量单元的相应寄存器中;
(3.3)当步骤(3.1)判断为执行中断服务程序时,在中断服务程序执行之前将标量寄存器保存在标量栈中,向量寄存器保存在向量栈中;中断服务程序返回时,将标量栈中标量寄存器读取到标量单元中的相应寄存器中,将向量栈中向量寄存器读取到向量单元的相应寄存器中;
(3.4)当步骤(3.1)判断为进行数据动态分配时,根据数据类型及动态分配函数参数的类型,将标量动态数据分配至标量栈、向量动态数据分配至向量栈中。
[0011]与现有技术相比,本发明的优点在于:
(I)本发明将用户程序的堆栈数据分布式存储于标量存储器和向量存储器中,无论是标量单元或是向量单元对于局部变量的访问性能都能够得到提高。
[0012](2)本发明根据数据特性将标量信息存储于标量存储器中、向量信息存储于向量存储器中,充分利用了两种存储器存储数据的优势,同时由于向量单元在访问堆栈中的向量数据时,无需在标量存储器和向量存储器之间传输数据,能够高效的实现堆栈数据访问同时降低存储器传输带宽需求,提高系统性能,从而降低系统功耗。
[0013](3)本发明在函数调用和中断现场保存时,所有现场寄存器存储于本地存储器中,能够有效提高中断处理性能;在动态分配向量数据空间时,编译器将该空间直接分配到向量存储器中,能够实现高效访问动态空间中向量数据。
【专利附图】

【附图说明】[0014]图1是本实施例中SMD微处理器体系结构示意图。
[0015]图2是本实施例中向量单元(SIMDU)结构示意图。
[0016]图3是传统编译器的堆栈内存分配结构示意图。
[0017]图4是本实施例中支持SIMD体系结构的分布式堆栈存储方法实现流程示意图。
[0018]图5是本实施例中支持SIMD体系结构的分布式堆栈内存分配结构示意图。
[0019]图6是本实施例中在函数调用时堆栈内存分配结构示意图。
[0020]图7是本实施例中在执行中断程序时堆栈内存分配结构示意图。
[0021]图8是本实施例中在动态数据分配时堆栈内存分配结构示意图。
【具体实施方式】
[0022]以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
[0023]如图1所不,本实施例中SIMD微处理器体系结构,包括一个标量单兀(SU)和一个SMD单元(SMDU),其中SU主要负责程序流控处理、标量运算以及SMDU的异常处理,SMDU主要负责向量运算并支持基于向量的数据混洗操作等,SIMDU即为向量单元且包含有P个VPE向量处理单元。SU和SMDU共用取指和派发部件,SU指令和SMDU指令在取指、派发和执行过程中并行执行。SMD微处理器中还包括一个标量存储单元和一个向量存储单元,其中标量存储单元负责给SU供数,向量存储单元则负责给SIMDU单元供数。向量存储单元支持向量数据按行访问,从而能够提高SIMDU单元的数据访问效率,标量存储单元和向量存储单元之间通过DMA传输机制实现数据共享。
[0024]如图2所示,本实施例中向量单元(SIMDU)结构,包含P个向量处理单元VPE (VPE,Vector Process Element),其中每个向量处理单元VPE中包含多个独立的功能部件,分别为:乘法部件MUL、加法部件ALU、移位部件BP等,且每个向量处理单元VPE包含一组局部寄存器RcTRr。向量单元中所有同一编号向量处理单元VPE的局部寄存器在逻辑上又组成一个向量寄存器,例如向量处理单元VPEtl — VPElri的Rtl寄存器在逻辑上组成了向量寄存器VR0,每个向量处理单兀VPE所对应的Rtl寄存器称为向量寄存器的一个兀素。向量处理器在同一条向量指令的控制下,P个向量处理单元VPE同时对各自的局部寄存器进行相同操作,用以实现应用程序的数据级并行性。
[0025]现有编译技术中程序运行过程中的动态信息是存储在内存中一片连续的空间内。如图3所示,传统编译器的堆栈内存分配结构,堆栈一般存储的内容包括局部变量、临时变量、上层帧指针、通用寄存器、条件寄存器、参数存储区、函数返回地址、上层栈指针以及动态分配区等,按地址增长方向依次进行存储,即竖直箭头所指向的方向,当前帧指针指向程序当前堆栈的栈顶,当前栈指针指向程序当前堆栈的栈底。而当硬件体系结构为SIMD微处理器时,局部变量、临时变量、通用寄存器、参数存储区和动态分配区的内容还包含向量数据。
[0026]基于上述SIMD微处理器体系结构及传统编译器的堆栈内存分配结构,本实施例在内存空间分配时采用分布式分配堆栈的方式,首先在标量存储单元中分配一片连续的存储空间作为标量栈,用于存储标量单元需要访问的标量信息;同时在向量存储单元中分配一片连续的存储空间作为向量栈,用于存储向量单元需要访问的向量信息。[0027]如图4所示,本实施例中支持SIMD体系结构的分布式堆栈数据存储方法,步骤为:
O在内存中分布式分配堆栈空间,分别在SIMD微处理器的标量存储单兀中分配用于存储标量单元需要访问的标量信息的标量栈,在向量存储单元中分配用于存储向量单元需要访问的向量信息的向量栈;
2)程序编译时,将标量单元需要访问的局部变量分配于标量栈中,向量单元需要访问的局部变量分配于向量栈中;
3)程序运行时,将程序现场切换时需要保存的标量信息保存在标量栈中、需要保存的向量信息保存在向量栈中,程序现场返回时,直接从标量栈中读取标量信息到标量单元、从向量栈中读取向量信息到向量单元。
[0028]本实施例中,在链接程序时,用户需要在链接脚本文件中配置程序需要的标量栈和向量栈的大小、起始地址,其中将标量栈分配于标量存储器中,将向量栈分配于向量存储器中。
[0029]本实施例将应用程序的堆栈数据分别保存到标量存储单元和向量存储单元中,根据数据类型由标量单元和向量单元分别进行存储和访问,能够有效提高标量单元、向量单元的数据及局部变量的访问性能。向量数据存储在向量存储单元中,相比于存储在标量存储器中能够有效减少存储和访问的时间,同时由于不占用标量存储单元的访问端口,避免了对标量单元存储器访问造成阻塞;且向量单元在访问堆栈中的向量数据时,无需在标量存储单元和向量存储单元之间传输数据,降低了存储器传输带宽需求,提高系统性能,从而降低系统功耗。
[0030]如图5所示,本实施例中支持SIMD体系结构的分布式堆栈内存分配结构,在传统编译器堆栈内存分配结构的基础上,在标量存储单元中分配一块连续的空间作为标量栈,同时在向量存储单元中单独分配一块连续的空间作为向量栈,其中标量栈存储标量单元需要访问的标量信息,标量栈的内存分配结构为:分配标量局部变量、标量临时变量、上层标量帧指针、上层向量帧指针、标量通用寄存器、标量条件寄存器、标量参数存储区、函数返回地址、上层标量栈指针、上层向量栈指针存储空间和标量动态分配区,当前标量巾贞指针指向当前标量栈栈顶和栈底;向量栈存储向量单元单元需要访问的向量信息,向量栈的内存分配结构为:分配向量局部变量、向量临时变量、向量通用寄存器的存储空间、向量参数存储区和向量动态分配区,当前向量帧指针指向当前向量栈栈顶和栈底。
[0031]本实施例中,程序运行时的具体步骤为:
(3.1)判断程序执行的状态;
(3.2)当步骤(3.1)判断为调用函数时,将标量单元的标量局部变量、标量临时变量、上层标量函数的栈底指针、函数返回地址、标量调用参数、需要保存的标量寄存器信息保存到标量栈中,将向量单元的向量局部变量、向量调用参数、需要保存的向量寄存器信息保存到向量栈中;调用完函数返回时,将标量栈中信息读取标量单元的相应寄存器中,将向量栈中信息读取到向量单元的相应寄存器中;
(3.3)当步骤(3.1)判断为执行中断服务程序时,在中断服务程序执行之前将标量寄存器保存在标量栈中,向量寄存器保存在向量栈中;中断服务程序返回时,将标量栈中标量寄存器读取到标量单元单元中的相应寄存器中,将向量栈中向量寄存器读取到向量单元的相应寄存器中;
(3.4)当步骤(3.1)判断为进行数据动态分配时,根据数据类型及动态分配函数参数的类型,将标量动态数据分配至标量栈、向量动态数据分配至向量栈中。
[0032]如图6所示,本实施例中在函数调用时堆栈分配存储空间结构,从当前标量栈指针指向的标量栈栈顶开始分配相应的空间用于存储标量局部变量、标量临时变量、当前标量帧指针、当前向量帧指针、标量通用寄存器、条件寄存器、标量参数、函数返回地址、当前向量栈指针和当前标量栈指针,并更新标量栈指针;从当前向量栈指针指向的向量栈栈顶开始分配相应的空间用于存储向量局部变量、向量临时变量、向量通用寄存器和向量参数,并更新向量栈指针。
[0033]如图7所示,本实施例中在执行中断时堆栈分配存储空间结构,从当前标量栈指针指向的标量栈栈顶开始分配相应的空间存储当前标量巾贞指针、当前向量巾贞指针、标量通用寄存器、条件寄存器、当前向量栈指针和当前标量栈指针,并更新标量栈顶指针;从当前向量栈指针指向的向量栈栈顶开始分配相应的空间存储向量通用寄存器,并更新向量栈指针。
[0034]如图8所示,本实施例中在动态数据空间分配时堆栈分配结构,根据编译器根据需要分配的数据类型进行判断,若为标量数据,则从标量栈栈顶开始分配相应的空间存储标量动态数据,并更新标量栈顶指针;若为向量数据,则从向量栈栈顶开始分配相应的空间存储向量动态数据,并更新向量栈顶指针。
[0035]本实施例在函数调用和中断现场保存时,所有现场寄存器存储于本地存储器中,能够有效提高中断处理性能;在动态分配向量数据空间时,编译器将该空间直接分配到向量存储单元中,具有较高的动态空间中向量数据访问性能。同时由于向量单元在访问堆栈中的向量数据时,无需在标量存储单元和向量存储单元之间传输数据,能够降低存储器传输带宽需求,提高系统性能,从而降低系统功耗。
[0036]以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本【技术领域】的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
【权利要求】
1.一种支持SIMD体系结构的分布式堆栈数据存储方法,其特征在于:在内存中分布式分配堆栈空间,分别在标量存储器中分配用于存储标量信息的标量栈,在向量存储器中分配用于存储向量信息的向量栈;当程序编译时,将标量单元需要访问的局部变量分配于标量栈中,向量单元需要访问的局部变量分配于向量栈中;当程序运行时,将程序现场切换时需要保存的标量信息保存在标量栈中、需要保存的向量信息保存在向量栈中,程序现场返回时,直接从标量栈中读取标量信息到标量单元、从向量栈中读取向量信息到向量单元。
2.根据权利要求1所述的支持SIMD体系结构的分布式堆栈数据存储方法,其特征在于,所述标量栈中存储的标量信息包括:标量局部变量、标量临时变量、上层标量巾贞指针、上层向量帧指针、标量通用寄存器、标量条件寄存器、标量参数、函数返回地址、上层标量栈指针、上层向量栈指针和标量动态数据。
3.根据权利要求1所述的支持SIMD体系结构的分布式堆栈数据存储方法,其特征在于,所述向量栈中存储的向量信息包括:向量局部变量、向量临时变量、向量通用寄存器、向量参数和向量动态数据。
4.根据权利要求1或2或3所述的支持SIMD体系结构的分布式堆栈数据存储方法,其特征在于,所述程序编译后还包括链接程序时,在链接脚本文件中配置所述标量栈和所述向量栈的大小、起始地址。
5.根据权利要求1或2或3所述的支持SIMD体系结构的分布式堆栈数据存储方法,其特征在于,所述程序运行时的具体步骤为: (3.1)判断程序执行的状态; (3.2)当步骤(3.1)判断为调用函数时,将标量单元的标量局部变量、标量临时变量、上层标量函数的栈底指针、函数返回地址、标量调用参数、需要保存的标量寄存器信息保存到标量栈中,将向量单元的向量局部变量、向量调用参数、需要保存的向量寄存器信息保存到向量栈中;调用完函数返回时,直接将标量栈中信息读取到标量单元的相应寄存器中,将向量栈中信息读取到向量单元的相应寄存器中; (3.3)当步骤(3.1)判断为执行中断服务程序时,在中断服务程序执行之前将标量寄存器保存在标量栈中,向量寄存器保存在向量栈中;中断服务程序返回时,直接将标量栈中标量寄存器读取到标量单元中的相应寄存器中,将向量栈中向量寄存器读取到向量单元的相应寄存器中; (3.4)当步骤(3.1)判断为进行数据动态分配时,根据数据类型及动态分配函数参数的类型,将标量动态数据分配至标量栈、向量动态数据分配至向量栈中。
【文档编号】G06F12/02GK103942152SQ201410173672
【公开日】2014年7月23日 申请日期:2014年4月28日 优先权日:2014年4月28日
【发明者】孙海燕, 阳柳, 王霁, 张雪萌, 陈书明, 郭阳, 陈跃跃, 龚国辉, 刘衡竹, 彭元喜, 李 灿, 陈伟业 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1