具体实施方式
以下基于实施例对本申请进行描述,但是本申请并不仅仅限于这些实施例。在下文对本申请的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本申请。为了避免混淆本申请的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
计算设备
图1示出一个计算设备10的示意性框图。计算设备10可以基于各种型号的处理单元构建,并由WINDOWS操作系统、UNIX操作系统、Linux操作系统等任一操作系统驱动。此外,计算设备10可以在PC机、台式机、笔记本、服务器和移动通信装置等硬件和/或软件中实施。
如图1所示,计算设备10可以包括一个或多个处理单元12,以及存储器14。计算设备10中的存储器14可以作为主存储器(简称为主存或内存),用于存储由数据信号表示的指令信息和/或数据信息,例如,存储器14可以存放处理单元12提供的数据(例如为预算结果),也可以用于实现处理单元12与外部存储设备16(或成为辅助存储器或外部存储器)之间的数据交换。
在一些情形下,处理单元12需要通过总线11访问存储器14,以获取存储器14中的数据或对存储器14中的数据进行修改。由于存储器14的访问速度较慢,为了缓解处理单元12与存储器14之间的速度差距,计算设备10还包括与总线11通信连接的高速缓冲存储器18,高速缓冲存储器18用于对存储器14中的一些可能会被反复调用的程序数据或者报文数据进行缓存。高速缓冲存储器18可以由诸如静态随机存储器(Static Random AccessMemory,SRAM)等类型的存储装置实现。高速缓冲存储器18可以为多级结构,例如具有一级缓存(L1Cache)、二级缓存(L2Cache)和三级缓存(L3Cache)的三级缓存结构,高速缓冲存储器18也可以是三级以上的缓存结构或其他类型缓存结构。在一些实施例中,高速缓冲存储器18的一部分(例如一级缓存,或一级缓存和二级缓存两者)可以集成在处理单元12内部或与处理单元12集成在同一片上系统中。
基于此,处理单元12可以包括指令执行单元121、以及内存管理单元122等部分。指令执行单元121在执行一些需要修改内存的指令时发起写访问请求,该写访问请求指定了需要写入内存中的写入数据和相应的物理地址。内存管理单元122用于将这些指令指定的虚拟地址转译为该虚拟地址映射的物理地址,写访问请求指定的物理地址与相应指令指定的物理地址可以一直。
存储器14和高速缓冲存储器18之间的信息交互可以按照数据块来阻组织。在一些实施例中,高速缓冲存储器18和存储器14可以按照相同的空间尺寸被划分成数据块,数据块可以作为高速缓冲存储器18和存储器14之间的数据交换的最小单位(包括预设长度的一个或多个数据)。为了表述简洁清晰,下面将高速缓冲存储器18中的各数据块简称为缓存块(或者可以称为cacheline或高速缓存线),且不同的缓存块具有不同的缓存块地址。将存储器14中的各个数据块简称为内存块,且不同的内存块具有不同的内存块地址。缓存块地址和/或内存块地址可以包括用于定位数据块的物理地址标签。
由于受到空间和资源的限制,高速缓冲存储器18无法对存储器14中的全部内容进行缓存,即高速缓冲存储器18的存储容量通常小于存储器14,高速缓冲存储器18提供的各个缓存块地址无法对应存储器14提供的全部内存块地址。处理单元12在需要访问内存时,首先经总线11访问高速缓冲存储器18,以判断所要访问的内容是否已被存储于高速缓冲存储器18中。如果所要访问的内容已被存储于高速缓冲存储器18中,则高速缓冲存储器18命中,此时处理单元12直接从高速缓冲存储器18中调用所要访问的内容。如果所要访问的内容未被存储于高速缓冲存储器18中,则高速缓冲存储器18和处理单元12需要经总线11访问存储器14,以在存储器14中查找相应的信息。由于高速缓冲存储器18的存取速率非常快,因此在高速缓冲存储器18命中时,处理单元12的效率可以显著提高,进而也使得整个计算设备10的性能和效率得以提升。
此外,计算设备10还可以包括存储设备16、显示设备、音频设备、鼠标/键盘等输入/输出设备。存储设备16可以是通过相应接口与总线11耦合的硬盘、光盘以及闪存等用于信息存取的设备。显示设备可以经相应的显卡与总线11耦合,用于根据总线11提供的显示信号进行显示。
计算设备10还可以包括通信设备17,进而计算设备10可以通过各种方式与网络或其他设备进行通信。通信设备17可以包括一种或多种通信模块,通信设备17可以包括适用于特定的无线通信协议的无线通信模块。例如,通信设备17可以包括WLAN模块,用于实现符合电气和电子工程协会(IEEE)制定的802.11标准的WiFi通信。通信设备17可以包括WWAN模块,用于实现符合蜂窝或其他无线广域协议的无线广域通信。通信设备17还可以包括蓝牙模块等采用其他协议的通信模块,或其他自定义类型的通信模块。通信设备17还可以是用于串行传输数据的端口。
需要说明的是,不同的计算设备10根据主板、操作系统和指令集架构的不同,计算设备10的结构可能有所变化。例如,目前很多计算设备设置有连接在总线11和各个输入/输出设备之间的输入/输出控制中心,且该输入/输出控制中心可以集成于处理单元12之内或独立于处理单元12。
处理单元
图2是本申请一个实施例的处理单元12的示意性框图。如图2所示,每个处理单元12可以包括用于处理指令的一个或多个处理器核120,指令的处理和执行是可以被用户(例如通过应用程序)和/或系统平台控制的。每个处理器核120可以用于处理特定的指令集,指令集可以支持复杂指令集计算(Complex Instruction Set Computing,CISC)、精简指令集计算(Reduced Instruction Set Computing,RISC)或基于超长指令字(Very LongInstruction Word,VLIW)的计算,特别需要说明的是,处理器核120适用于处理RISC-V指令集。不同的处理器核120可以各自处理不同或相同的指令集。处理器核120还可以包括其他处理模块,比如数字信号处理器(Digital Signal Processor,DSP)等。作为一种示例,图2中示出了处理器核1至处理器核m,m是正整数。
图1示出的高速缓冲存储器18可以被全部或部分集成于处理单元12中。根据架构的不同,高速缓冲存储器18可以是位于各个处理器核120之内和/或之外的单个或多级的内部高速缓冲存储器(如图2示出的3级高速缓冲存储器L1至L3,图2中统一标识为18),也可以包括面向指令和指令高速缓存和面向数据的数据高速缓存。处理单元12中的各部件可以共享至少一部分的高速缓存存储器,例如,处理器核1至m可以共用第三级高速缓冲存储器L3。处理单元12还可以包括外部高速缓存(未示出),其他高速缓存结构也可以作为处理单元12的外部高速缓存。
如图2所示,处理单元12可以包括寄存器堆(Register File)126,寄存器堆126可以包括用于存储不同类型的数据和/或指令的多个寄存器,这些寄存器可以是不同类型,比如寄存器堆126可以包括整数寄存器、浮点寄存器、状态寄存器、指令寄存器和指针寄存器等。寄存器堆126中的寄存器可以选用通用寄存器来实现,也可以根据处理单元12的实际需求采用特定的设计。
处理单元12可以包括内存管理单元(Memory Management Unit,MMU)122,用于实现虚拟地址到物理地址的转译。内存管理单元122中缓存有页表中的一部分表项,内存管理单元122也可以从内存中获取未被缓存的表项。每个处理器核120中可以设置一个或多个内存管理单元122,不同处理器核120中的内存管理单元122可以与位于其他处理单元或处理器核中的内存管理单元122实现同步,使得每个处理单元或处理器核可以共享统一的虚拟存储系统。
处理单元12用于执行指令序列(即程序)。处理单元12执行每个指令的过程包括:从存放指令的存储器中取出指令,对取出的指令进行译码,执行译码后的指令,及保持指令执行结果等步骤,如此循环,直到执行完指令序列中的全部指令或遇到停机指令。
为了实现上述过程,处理单元12可以包括取指令单元124、指令译码单元125、指令发射单元(未示出)、指令执行单元121和指令引退单元(未示出)等。
取指令单元124作为处理单元12的启动引擎,用于将指令从存储器14中搬运到指令寄存器(可以是图2示出的寄存器堆126中的一个用于存放指令的寄存器)中,并接收下一个取指地址或根据取指算法计算获得下一个取指地址,取指算法可以是根据指令长度递增地址或递减地址。
取出指令后,处理单元12进入指令译码阶段,指令译码单元125按照预定的指令格式,对取回的指令进行解码,以获得取回的指令所需的操作数获取信息,从而为指令执行单元121的操作做准备。操作数获取信息可以包括指向立即数、寄存器或其他能够提供源操作数的软件/硬件。
指令发射单元通常存在于高性能的处理单元12中,位于指令译码单元125与指令执行单元121之间,用于指令的调度和控制,以将各个指令高效地分配至不同的指令执行单元121,使得多个指令的并行操作成为可能。指令经取指、译码并被调度到相应的指令执行单元121之后,相应的指令执行单元121开始执行该指令,即执行该指令所指示的操作,现相应的功能。
指令引退单元(或称为指令写回单元)主要用于将指令执行单元121产生的执行结果写回到相应的存储位置(例如为处理单元12内部的寄存器),以使后续指令能够从该存储位置快速获取相应的执行结果。
对于不同类别的指令,可以在处理单元12中相应地设置不同的指令执行单元121。指令执行单元121可以是运算单元(例如包含算术逻辑单元、整型处理单元、矢量运算单元等,用于根据操作数进行运算并输出运算结果)、内存执行单元(例如用于根据指令访问内存以读取内存中的数据或向内存写入指定的数据等)以及协处理器等。在处理单元12中,各个指令执行单元121可以并行运行并输出相应的执行结果。
指令执行单元121在执行某类指令(例如访存指令)时,需要访问存储器14,以获取存储器14中存储的信息或提供需要写入存储器14中的数据。需要说明的是,用于执行访存指令的指令执行单元121也可以简称为内存执行单元,该内存执行单元可以为加载存储单元(Load Store Unit,LSU)和/或其他用于内存访问的单元。
访存指令被取指令单元124获取之后,指令译码单元125可以对访存指令进行译码处理,使得访存指令的源操作数可被获取。译码处理后的访存指令被提供至相应的指令执行单元121,该指令执行单元121可以对访存指令的源操作数进行相应的运算(例如由算术逻辑单元对存储于寄存器中的源操作数进行运算)以获得访存指令对应的地址信息,并根据该地址信息发起相应的请求,例如地址转译请求、写访问请求等。
访存指令的源操作数通常包括地址操作数,指令执行单元121对该地址操作数进行运算以获得访存指令对应的虚拟地址或物理地址。当内存管理单元122被禁用时,指令执行单元121可以直接通过逻辑运算获得访存指令的物理地址。当内存管理单元121被启用时,相应的指令执行单元121根据访存指令对应的虚拟地址发起地址转译请求,该地址转译请求包括与访存指令的地址操作数对应的虚拟地址;内存管理单元122响应地址转译请求,并根据与该虚拟地址匹配的表项将地址转译请求中的虚拟地址转换为物理地址,使得指令执行单元121可以根据转译后的物理地址访问高速缓冲存储器18和/或存储器14。
根据功能的不同,访存指令可包括加载指令和存储指令。加载指令的执行过程通常不需要对存储器14或高速缓冲存储器18中的信息进行修改,指令执行单元121只需要根据加载指令的地址操作数读取存储于存储器14、高速缓冲存储器18或外部的存储设备中的数据。不同于加载指令,存储指令的源操作数不仅包括地址操作数,还包括数据信息,存储指令的执行过程通常需要对存储器14和/或高速缓冲存储器18中的信息进行修改。存储指令的数据信息可以指向写入数据,该写入数据的来源可以是运算指令、加载指令等指令的执行结果,也可以是处理单元12中的寄存器或其他存储单元提供的数据,还可以是立即数。
处理单元12的指令译码单元125可以接收至少两个指令执行单元121发送的指令标识信息和数据有效信号,指令标识信息用于指示相应指令执行单元所执行的指令,数据有效信号用于指示相应指令执行单元已获得指令执行结果,指令译码单元125还能根据待执行的第一指令的指令信息、指令标识信息和数据有效信号,生成数据选择信号,并且可将第一指令和数据选择信号发送给至少两个指令执行单元121中的第一指令执行单元,以使第一指令执行单元根据数据选择信号,从至少两个指令执行单元121中的第二指令执行单元获取第二指令的指令执行结果,进而基于获取到的指令执行结果执行第一指令。指令执行单元121之间直接的数据交互,可以减小指令执行单元121在版图上的距离,从而减小数据旁路,缩短指令执行单元121之间传输指令执行结果所需的时间,而且指令执行单元121的指令执行结果不需要前向传递给指令译码单元125,节省了指令译码单元125进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
本申请实施例在后文中,将对指令译码单元125和指令执行单元121进行详细描述。
指令译码单元
目前,为了解决由于数据相关性导致的流水线阻塞问题,指令执行单元的流水线数据与控制信号均会通过数据旁路传输给指令译码单元进行仲裁,指令译码单元确定出最终的操作数发送给相应的指令执行单元。
然而,指令执行单元将指令执行结果发送给指令译码单元后,译码单元根据对当前指令译码获得的信息,从各指令执行单元前向传递的数据和通过对物理寄存器堆进行访问得到的数据中选择数据来源,当指令执行单元前向传递的数据较多时,指令译码单元需要耗费较长的时间从较多的数据中选择数据来源,而且受制于指令执行单元和指令译码单元的版图分布,导致指令译码单元与指令执行单元的物理路径较长,数据从指令执行单元传递到指令译码单元,再由指令译码单元传递到指令执行单元,也需要较长时间,进而给处理器的时序带来较大压力,影响处理器的性能。
本申请实施例为了针对上述至少部分问题而产生,在这一实施方式中,可通过指令译码单元125实现。下面详细讨论指令译码单元125的内部结构和本申请实施例的实现过程。
图3是本申请一个实施例的指令译码单元的内部结构示意图。如图3所示,指令译码单元125包括第一获取子单元1251、仲裁子单元1252和发射子单元1253。第一获取子单元1251可以接收至少两个指令执行单元121发送的指令标识信息和数据有效信号,指令标识信息用于指示相应指令执行单元所执行的指令,数据有效信号用于指示相应指令执行单元已获得指令执行结果。仲裁子单元1252可以根据待执行的第一指令的指令信息、指令标识信息和数据有效信号,生成数据选择信号。发射子单元1253可将第一指令和数据选择信号发送给至少两个指令执行单元121中的第一指令执行单元,以使第一指令执行单元根据数据选择信号,从至少两个指令执行单元121中的第二指令执行单元获取第二指令的指令执行结果,进而基于获取到的指令执行结果执行第一指令。
本申请中的指令执行单元121可以用于执行指令,例如指令执行单元121可以包括整型运算单元、分支执行单元或访存单元等。
本申请中,每个指令执行单元121均对应有一个寄存器(该寄存器可称为旁路寄存器),在指令执行单元121执行指令之后,可将指令执行结果放入该旁路寄存器中。例如,第二指令由第二指令执行单元执行结束后获得第二指令的指令执行结果,可以将第二指令的指令执行结果存入第二指令执行单元的旁路寄存器中,而第一指令由本实施例中的指令执行单元121(也即第一指令执行单元)执行后,可以将第一指令的指令执行结果存入指令执行单元121的旁路寄存器中。
指令执行单元121在执行完指令后,将指令标识信息和数据有效信号发送给指令译码单元125,而不将指令执行结果发送给指令译码单元125。
具体地,指令执行结果可以是指令执行单元121执行指令后获得的数据,例如该指令如果是一个加法指令(例如该加法指令用于计算变量a和b之和),则指令执行结果可以是执行完该加法指令之后获得的数据(即a+b的数值),其他的情况同理。当然这仅作为一个便于理解的示例,并不用于限制本实施例。在一些示例中,在指令中,指令执行结果可以作为源操作数。
两条指令存在数据相关性,在一些情形中可以是指一条指令的执行结果会对另一条指令的执行产生影响。例如对应于本实施例,第一指令和第二指令存在数据相关性,可以是指执行第二指令后的指令执行结果会对第一指令产生影响,例如其中一种情况是第二指令的指令执行结果需要作为第一指令执行时的输入,又或者可以是其他能够产生影响的情况,在此不进行限制。
可选地,指令标识信息例如可以是指令的ID,能唯一确定地标识一条指令。第一指令具有其对应的指令标识信息,第二指令也具有其对应的指令标识信息。
第一获取子单元1251在接收到第二指令的指令标识信息和数据有效信号后,仲裁子单元1252可以根据指令标识信息确定第二指令与待执行的第一指令存在数据相关性,进而生成针对第一指令的数据选择信号,由发射子单元1253将第一指令和数据选择信号发送给第一指令执行单元,由第一指令执行单元对第一指令进行执行。
当第一获取子单元1251在接收到数据有效信号后,仲裁子单元1252可以根据数据有效信号确定第二指令执行单元已成功执行第二指令并得到指令执行结果,根据第一指令和第二指令的指令标识信息,可以确定第一指令的执行需要基于第二指令的指令执行结果,从而仲裁子单元1252可以生成针对第一指令的数据选择信号,并将数据选择信号发送给执行第一指令的第一指令执行单元,进而第一指令执行单元可以基于第二指令的指令执行结果来执行第一指令,从而指令执行单元121之间可以直接传输数据,而不需要通过指令译码单元125在指令执行单元121之间转发数据。
本申请中,仲裁子单元1252可以根据待执行的第一指令的指令信息及第二指令的指令标识信息和数据有效信号进行仲裁,生成数据选择信号。数据选择信号可以由发射子单元1253发送给第一指令执行单元。应理解,如果仅有一个指令执行单元需要第二指令的指令执行结果进行后级流水线指令的执行,则发射子单元1253会将数据选择信号发给这一个指令执行单元,如果存在多个指令执行单元需要第二指令的指令执行结果进行后级流水线指令的执行,则发射子单元1253会将数据选择信号发送给多个指令执行单元。
本申请中,数据选择信号可相当于指令译码单元125对于第一指令执行单元的控制信号,能够指导第一指令执行单元执行第一指令。第一指令的指令信息,可以包括第一指令的功能信息、以及执行第一指令所需要条件信息等等。
仲裁子单元1252根据第一指令的指令信息、指令标识信息和数据有效信号生成的数据选择信号,可以用于需要执行第一指令的第一指令执行单元根据该数据选择信号从第二指令执行单元获取第二指令的指令执行结果,以基于获取到的指令执行单元执行第一指令。
由于每个指令执行单元121对应有一个旁路寄存器,因此第二指令执行单元在执行第二指令得到指令执行结果后,第二指令会将指令执行结果存储在其对应的旁路寄存器中。因而,第一指令执行单元在执行第一指令前,可以根据数据选择信号从第二指令执行单元获取第二指令的指令执行结果。对于任一指令执行单元121,该指令执行单元121在接收到数据选择信号后,可以根据接收到的数据选择信号从各旁路寄存器或从上级流水线传递的数据中获取指令操作数。
可以看出,本申请中的指令译码单元125在整个过程中只是将第一指令和数据选择信号发送给需要执行第一指令的第一指令执行单元,指令译码单元125与第二指令执行单元之间仅传输控制信号,第二指令执行单元不会将第一指令的指令操作数发送给指令译码单元125,指令操作数相对应控制信号具有较大的位宽,指令执行单元上传指令操作数至指令译码单元125将产生较大的延迟。因此,指令译码单元125不用从多个指令执行单元121所获得的多个指令执行结果(具有较大位宽的指令操作数)中,确定由第二指令执行单元执行第二指令时获得的指令执行结果,而是直接由第一指令执行单元根据数据选择指令直接从第二指令执行单元处获取第二指令的指令执行结果,并基于获取到的第二指令的指令执行结果执行第一指令。
这样就使得第一指令执行单元可以与第二指令执行单元直接进行数据交互(即第一指令执行单元直接从第二指令执行单元获得第二指令的指令执行结果),而无需再经过指令译码单元125获得执行第一指令的所需数据(即第二指令的指令执行结果)。通过指令执行单元之间直接进行数据交互,使得整型运算单元、分支执行单元和访存单元在版图上布局时以各自的旁路寄存器为核心,从而减小整型运算单元、分支执行单元和访存单元之间进行数据交互的距离,在整型运算单元、分支执行单元和访存单元之间传输具有较大位宽(比如64bit)的数据时,可以减小数据传输的延迟,从而可以化解数据旁路的时序问题。
图4是本申请一个实施例的指令译码单元与指令执行单元之间数据交互的示意图。如图4所示,指令译码单元(Instruction Decode Unit,IDU)可以从物理寄存器堆中获取指令操作数,并分别向整型运算单元(Integer Unit,IU)、分支执行单元(Branch JumpUnit,BJU)和访存单元(Load Store Unit,LSU)传输获取到的指令操作数。整型运算单元和访存单元之间可以直接双向传输前级流水线指令的指令执行结果,以作为后级流水线指令的指令操作数。分支执行单元可以直接接收整型运算单元和访存单元传输的前级流水线指令的指令执行结果,以作为后级流水线指令的指令操作数。
由图4可知,访存单元或整型运算单元执行前级流水线指令的指令执行结果,可作为后级流水线指令的指令操作数,通过数据旁路直接传输给执行后级流水线指令的整型运算单元、访存单元或分支执行单元,而无需先将前级流水线指令的指令执行结果传输给指令译码单元,再由指令译码单元将前级流水线指令的指令执行结果传输给执行后级流水线指令的整型运算单元、访存单元或分支执行单元,从而可以缩短整型运算单元、访存单元和分支执行单元之间传输较大位宽的数据时的延迟,进而提高处理单元的性能。
图5是本申请一个实施例的指令译码单元与指令执行单元之间数据和信号交互的示意图。如图5所示,作为指令执行单元的整型运算单元和访存单元可以向指令译码单元发送控制信号,指令译码单元也可以向整型运算单元、访存单元和分支执行单元发送控制信号,整型运算单元和访存单元发送给指令译码单元的控制信号包括所执行指令的指令标识信息和数据有效信号,指令译码范媛发送给整型运算单元、访存单元和分支执行单元的控制指令包括待执行的指令和相应的数据选择信号。控制信号为位宽较小的信号数据,比如为位宽为单比特的数据。
整型运算单元和访存单元之间可以直接双向传输前级流水线指令的指令执行结果,以作为后级流水线指令的指令操作数。分支执行单元可以直接接收整型运算单元和访存单元传输的前级流水线指令的指令执行结果,以作为后级流水线指令的指令操作数。整型运算单元、访存单元和分支执行单元之间传输的指令操作数为位宽较大的数据,比如为64bit位宽的指令执行结果。
由于整型运算单元、访存单元和分支执行单元发送给指令译码单元的控制信号为较小位宽的数据,而较大位宽的指令执行结果在整型运算单元、访存单元和分支执行单元之间直接进行传输,而不需要通过指令译码单元进行转发,从而可以缩短传输较大位宽的指令执行结果的延迟,进而解决数据旁路的时序问题,提高处理单元的性能。
由前述,本申请中的指令执行单元121可以用于执行指令,例如可以是整型运算单元、分支执行单元和访存单元等。而在一些可能的实现方式中,对于前述的两个指令执行单元121,可以包括整型运算单元、分支执行单元和访存单元中的至少两个,其中,第二指令执行单元包括整型运算单元或访存单元,第一指令执行单元包括整型运算单元、分支执行单元或访存单元。
也即,两个指令执行单元121可以是如下的几种情况:第一指令执行单元为整型运算单元,第二指令执行单元为整型运算单元;第一指令执行单元为整型运算单元,第二指令执行单元为访存单元;第一指令执行单元为分支执行单元,第二指令执行单元为整型运算单元;第一指令执行单元为分支执行单元,第二指令执行单元为访存单元;第一指令执行单元为访存单元,第二指令执行单元为整型运算单元;第一指令执行单元为访存单元,第二指令执行单元为访存单元。
具体地说,分支执行单元只有单向数据旁路,而整型运算单元和访存单元均为双向数据旁路,因此分支执行单元只能从别的类型的指令执行单元121的旁路寄存器处获取数据(例如指令执行结果),而整型运算单元和访存单元均既可以从别的指令执行单元121的旁路寄存器处获取数据(例如指令执行结果),整型运算单元和访存单元也可以允许别的类型的指令执行单元121从自己的旁路寄存器获取数据(例如指令执行结果)。由于本实施例中第一指令执行单元在执行第一指令时可以从第二指令执行单元的旁路寄存器获取数据,因此第一指令执行单元可以是整型运算单元、访存单元,或分支执行单元,而第二指令执行单元则可以是整型运算单元或访存单元。因此,通过这样多种的第一指令执行单元的类型以及第二指令执行单元的类型,使得本实施例的适用性更好。
在一些可能的实现方式中,指令译码单元125的发射子单元1253用于根据第一指令的指令信息,从物理寄存器堆获取执行第一指令所需的操作数,并将操作数发送给第一指令执行单元,以使第一指令执行单元基于第二指令的指令执行结果和操作数,执行第一指令。
具体地,对于一部分第一指令而言,第一指令执行单元在执行时只需要第二指令的指令执行结果即可,就可根据该指令执行结果执行第一指令得到第一指令的指令执行结果;而对于另一部分第一指令而言,其在被第一指令执行单元执行时除了需要第二指令的指令执行结果以外,还需要获得相应的操作数,该操作数可以存储在物理寄存器堆中。例如,该操作数可以是预先存储在物理寄存器堆中或者是其他指令执行单元计算得到后再存储到物理寄存器堆中。发射子单元1253根据第一指令的指令信息,确定与第一指令所需的操作数,之后从物理寄存器堆中获取该操作数,第一指令执行单元在接收到操作数时,可以根据该操作数和第二指令的指令执行结果执行第一指令。显然,这样使得本申请实施例对于不同的第一指令有更好的适用性。
如前述,第二指令的指令执行结果也可以是一个操作数(例如源操作数),第一指令执行单元在执行第一指令时,可以是基于两个操作数,以执行第一指令得到第一指令的执行结果。应理解,在具有源寄存器的前提下,第一指令执行单元还可以基于一个操作数和立即数执行第一指令。
示例地,结合一条具体的指令举例说明,这一举例中的具体指令基于RISC-V指令集,例如该第一指令为:add a3,a1,a2。
则第一指令执行单元在执行这一条第一指令时是累加计算a3的数值,即a3=a1+a2。这其中,a2为发射子单元1253从物理寄存器堆中获得并向第一指令执行单元发送的执行第一指令所需的操作数,而a1为第一指令执行单元根据数据选择信号,通过数据旁路从第二指令执行单元的旁路寄存器中获取的第二指令的指令执行结果(在这一示例中,a1作为源操作数)。在第一指令执行单元得到了所需的操作数以及第二指令的指令执行结果之后,可以执行第一指令,执行完毕之后得到a3的值。应理解,上述示例仅用于便于解释说明本实施例,而不应视为对本申请中的任何限制。
对于一个指令执行单元而言,流水线可以有多级。在一些可能的实现方式中,指令译码单元125的发射子单元1253用于将第一指令和数据选择信号发送给第一指令执行单元的第一级流水线,以使第一指令执行单元的第一级流水线基于获取到的指令执行结果执行第一指令。
以具体指令的示例进行说明。在该示例中,第二指令执行单元执行第二指令,第一指令执行单元执行第一指令,其中第二指令和第一指令存在数据相关性,在这示例中两条指令紧邻,均基于RISC-V指令集。具体地,两条指令分别为:
第二指令:add x3,x1,x2;
第一指令:sll x5,x3,x4。
在这其中,第二指令执行单元在执行第二指令时是累加计算x3,即x3=x1+x2,而第一指令执行单元执行第一指令时是将x3向左移x4位,以得到x5。
以第二指令执行单元为整型处理单元,第一指令执行单元为另一个整型处理单元为例,假设这个示例中,第一指令位于指令译码单元125,第二指令位于第二指令执行单元(即整型处理单元)。第二指令执行单元执行第二指令,获得第二指令的执行结果即x3,并在当前时钟周期将第二指令的执行结果存入第二执行单元的旁路寄存器。第二指令执行单元将第二指令的指令标识信息和数据有效信号发送给指令译码单元125的第一获取子单元1251,第一指令执行单元将第一指令的指令标识信息发送给指令译码单元125的第一获取子单元1251。在下一时钟周期,指令译码单元1252根据第一指令的指令信息、第二指令的指令标识信息、第一指令的指令标识信息、数据有效信号生成数据选择信号,指令译码单元125的发射子单元1253将第一指令和数据选择信号发送给第一指令执行单元(即另一个整型处理单元)的第一级流水线,第一指令此时位于第一指令执行单元。指令译码单元125的发射子单元1253在将第一指令和数据选择信号发送给第一指令执行单元的第一级流水线的同时,将从物理寄存器堆中获取的操作数x4发送给第一指令执行单元(即另一个整型处理单元)的第一级流水线(可以看出,除操作数x4以外,其他数据均未从指令译码单元125发送给第一指令执行单元)。第一指令执行单元基于数据选择信号从第二指令执行单元的旁路寄存器中获取第二指令的指令执行结果即x3。至此,第一指令执行单元的第一级流水线可基于从第二指令执行单元的旁路寄存器获得的x3,以及从发射子单元1253得到的x4,执行第一指令,以得到x5。应理解,上述示例仅用于便于解释说明本实施例,而不应视为对本申请中的任何限制。
由于本申请在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元125发送数据有效信号,指令译码单元125根据第一指令的指令标识信息和数据有效信号生成数据选择信号,其发射子单元1253将第一指令和数据选择信号发送给第一指令执行单元的第一级流水线,第一指令执行单元根据数据选择信号可通过数据旁路从第二指令执行单元获取第二指令的指令执行结果,进而第一指令执行单元的第一级流水线基于获取到的指令执行结果执行第一指令。指令执行单元之间直接的数据交互,指令执行单元在版图上布局时以各自的旁路寄存器为核心,缩短指令执行单元进行数据传输的路径,从而对于较大位宽(比如位宽为64bit)的交互数据可以缩短长距离传输的线延迟,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
应理解,本申请中,对于不同类型的第一指令执行单元和第二指令执行单元来说,第一指令执行单元在执行第一指令时的具体方式可能是不同的。
具体地,以整型运算单元为数据源的数据旁路(即第二指令执行单元为整型运算单元),这一类的特点是整形运算单元指令均一个时钟周期可以得到第二指令的指令执行结果,故当第一指令由指令译码单元125发射至第一指令执行单元的第一级流水线,第一指令执行单元一定可以根据数据选择指令从第二指令执行单元的旁路寄存器中获取到对应的源操作数(即第二指令的指令执行结果),因此第一指令执行单元的第一级流水线可以在获得第二指令的指令执行结果后执行第一指令。
而以访存单元为数据源的数据旁路(即第二指令执行单元为访存单元),则此时的第二指令为访存指令,而由于访存指令的执行周期不可预测,存在较多影响访存指令执行周期的因素存在(举例来说,是否命中数据高速缓存dcache会较大影响load指令(即一种访存指令)的执行周期等),因此当第一指令由指令译码单元125发射至第一指令执行单元的第一级流水线,第一指令执行单元不一定可以根据数据选择指令从第二指令执行单元的旁路寄存器中获取到对应的源操作数(即第二指令的指令执行结果)。因此为了适应这种情况,本申请中的第一指令执行单元若在当前时钟周期内不能获得第二指令执行单元(即访存单元)执行访存指令(即第二指令)时的源操作数,则本实施例中令第一指令在第一指令执行单元的第一级流水线进行等待,直至成功获得第二指令的指令执行结果后执行第一指令。
因此,本申请中通过这种令第一指令在第一指令执行单元的第一级流水线进行等待的机制,相比于传统方案中若不能从指令译码单元取得源操作数则第一指令不发射至第一指令执行单元的方式,本实施例减少了对发射资源的占用,对于支持乱序发射的处理器,后续与其无数据相关性的指令可继续发射执行,从而有利于处理器性能的提升。
在一些可能的实现方式中,在第一指令执行单元为访存单元时,由于访存单元的第一级流水线的时序较为紧张,因此本申请中可以增加第二指令执行单元到第一指令执行单元的第一级流水线之间的数据通路(例如第二指令执行单元的第一级流水线到第一指令执行单元的第一级流水线之间的数据通路),这种第二指令执行单元和第一指令执行单元之间直接的数据通路,相比于传统方案中经指令译码单元125仲裁的方式路径更短,故第一指令执行单元(即访存单元)可以在第二指令的指令执行结果进入第一指令执行单元的第一级流水线之前,对第二指令的指令执行结果进行一些预处理,以便于缓解第一指令执行单元的第一级流水线的时序的压力,使得相邻两级流水线负载更为均衡,从而有利于处理器性能的提升。
综上可见,本申请实施例提供的数据旁路方案,在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元发送数据有效信号,指令译码单元根据第一指令的指令标识信息和数据有效信号,向第一指令执行单元发送数据选择信号,第一指令执行单元根据数据选择信号可通过数据旁路从第二指令执行单元获取第二指令的指令执行结果,进而基于获取到的指令执行结果执行第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
指令执行单元
图6是本申请一个实施例的指令执行单元的内部结构示意图。如图6所示,指令执行单元121包括接收子单元1211、第二获取子单元1212和执行子单元1213。接收子单元1211用于接收来自指令译码单元125的第一指令和数据选择信号,其中,数据选择信号指示与第一指令存在数据相关性的第二指令的指令执行结果,第二指令由第二指令执行单元执行。第二获取子单元1212用于根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果。执行子单元1213用于基于第二指令的指令执行结果,执行第一指令。
可以理解的是,基于同一发明构思,在这一实施例中的指令执行单元121可参照上述指令译码单元125实施例中所述的第一指令执行单元121进行理解。下面这一实施例中的指令执行单元121进行详细说明。
本申请中的指令执行单元121可以用于执行指令,例如指令执行单元121可以包括整型运算单元、分支执行单元或访存单元等。
本实施例中的指令执行单元121以及第二指令执行单元可以对应有一个寄存器(该寄存器可称为旁路寄存器),在指令执行单元121执行指令之后,可将指令执行结果放入该旁路寄存器中。例如,第二指令由第二指令执行单元执行结束后获得第二指令的指令执行结果,可以将第二指令的指令执行结果存入第二指令执行单元的旁路寄存器中,而第一指令由本实施例中的指令执行单元121(也即第一指令执行单元)执行后,可以将第一指令的指令执行结果存入指令执行单元121的旁路寄存器中。
第二指令执行单元在执行完第二指令后,将指令标识信息和数据有效信号发送给指令译码单元125,而不将第二指令的指令执行结果发送给指令译码单元125。
具体地,第二指令的指令执行结果可以是第二指令执行单元执行第二指令后获得的数据,例如该第二指令如果是一个加法指令(例如该加法指令用于计算变量a和b之和),则第二指令的指令执行结果可以是执行完该加法指令之后获得的数据(即a+b的数值),其他的情况同理。当然这仅作为一个便于理解的示例,并不用于限制本实施例。在一些示例中,在第一指令中,第二指令的指令执行结果可以作为源操作数。
两条指令存在数据相关性,在一些情形中可以是指一条指令的执行结果会对另一条指令的执行产生影响。例如对应于本实施例,第一指令和第二指令存在数据相关性,可以是指执行第二指令后的指令执行结果会对第一指令的执行产生影响,例如其中一种情况是第二指令的指令执行结果需要作为第一指令执行时的输入,又或者可以是其他能够产生影响的情况,在此不进行限制。
可选地,指令标识信息例如可以是指令的ID,能唯一确定地标识一条指令。第一指令具有其对应的指令标识信息,第二指令也具有其对应的指令标识信息。
指令译码单元125接收到第一指令对应的指令标识信息以及第二指令对应的指令标识信息后,生成数据选择信号,以便于指令译码单元125将第一指令和数据选择信号发送给本实施例中的指令执行单元121(即第一指令执行单元)的接收子单元1211,指令执行单元121的执行子单元1213对第一指令进行执行。
易于理解,第一指令的指令标识信息由指令执行单元121(即第一指令执行单元)向指令译码单元125发送,第二指令的指令标识信息由第二指令执行单元向指令译码单元125发送。
当指令译码单元125在接收到数据有效信号后,指令译码单元125可以根据数据有效信号确定该指令执行单元121已成功执行对应的指令并得到指令执行结果,这整个过程中,指令译码单元125无需对获得的多个指令执行单元121传来的指令执行结果进行仲裁,来确定第一指令执行单元执行第一指令时所需要的第二指令的指令执行结果,也不必将第二指令的指令执行结果发送给第一指令执行单元。
本申请中,指令译码单元125,可以根据待执行的第一指令的指令信息、指令标识信息和数据有效信号进行仲裁,以生成数据选择信号。指令执行单元121的接收子单元1211在接收到指令译码单元125的第一指令和数据选择信号后,第二获取子单元1212根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果。
由于每个指令执行单元均对应有一个旁路寄存器,因此第二指令执行单元在执行完第二指令得到第二指令的指令执行结果后,该第二指令的指令执行结果存储于其相对应的旁路寄存器中。因而,本实施例中的指令执行单元121在执行第一指令前,其第二获取子单元1212根据该数据选择信号从第二指令执行单元获取第二指令的指令执行结果,具体可以是指,第二获取子单元1212从第二指令执行单元的旁路寄存器中获取第二指令的指令执行结果。
可以看出,本申请中的指令译码单元125在整个过程中只是将第一指令和数据选择信号发送给需要执行第一指令的指令执行单元121的接收子单元1211,指令译码单元125并没有接收至少两个指令执行单元121在执行指令获得的指令执行结果。因此指令译码单元125也不用从该至少两个指令执行单元121执行指令而获得的至少两个指令执行结果中,确定由第二指令执行单元执行第二指令时获得的第二指令的指令执行结果,而是直接由指令执行单元121的第二获取子单元1212根据数据选择指令直接从第二指令执行单元处获取第二指令的指令执行结果,并由执行子单元1213基于获取到的第二指令的指令执行结果执行第一指令。
这样就使得指令执行单元121(即第一指令执行单元)可以与第二指令执行单元直接进行数据交互(即指令执行单元121的第二获取子单元1212直接从第二指令执行单元获得第二指令的指令执行结果),而无需再经过指令译码单元125获得执行第一指令的所需数据(即第二指令的指令执行结果),从而减小了指令执行单元121在获取执行第一指令的所需数据(即第二指令的指令执行结果)时在版图上所经过的距离,从而减小数据旁路,缩短第二指令执行单元和指令执行单元121(即第一指令执行单元)之间传输第二指令的指令执行结果所需的时间,而且第二指令执行单元的指令执行结果不需要前向传递给指令译码单元125,也节省了指令译码单元125进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
由前述,本申请中的指令执行单元121可以用于执行指令,例如可以是整型运算单元、分支执行单元和访存单元等。在一些可能的实现方式中,在指令执行单元121(即第一指令执行单元)包括整型运算单元、分支执行单元或访存单元的基础上,第二指令执行单元包括整型运算单元或访存单元。
也即,指令执行单元121(即第一指令执行单元)和第二指令执行单元可以是如下的几种情况:指令执行单元121(即第一指令执行单元)为整型运算单元,第二指令执行单元为整型运算单元;指令执行单元121(即第一指令执行单元)为整型运算单元,第二指令执行单元为访存单元;指令执行单元121(即第一指令执行单元)为分支执行单元,第二指令执行单元为整型运算单元;指令执行单元121(即第一指令执行单元)为分支执行单元,第二指令执行单元为访存单元;指令执行单元121(即第一指令执行单元)为访存单元,第二指令执行单元为整型运算单元;指令执行单元121(即第一指令执行单元)为访存单元,第二指令执行单元为访存单元。
具体地说,分支执行单元只有单向数据旁路,而整型运算单元和访存单元均为双向数据旁路,因此指令执行单元121为分支执行单元时,可以从别的类型的第二指令执行单元的旁路寄存器处接收数据(例如第二指令的指令执行结果),而指令执行单元121为整型运算单元或访存单元时,既可以从别的类型的第二指令执行单元的旁路寄存器处获取数据(例如指令执行结果),也可以允许别的第二指令执行单元从自己的旁路寄存器获取数据(例如指令执行结果)。由于本实施例中指令执行单元121(即第一指令执行单元)的执行子单元1211在执行第一指令时,第二获取子单元1212可以只从第二指令执行单元的旁路寄存器获取数据,而可以不向第二指令执行单元发送数据,而第二指令执行单元则需要能够向第二获取子单元1212发送数据,因此指令执行单元121(即第一指令执行单元)可以是整型运算单元、访存单元,或分支执行单元,而第二指令执行单元则可以是整型运算单元或访存单元,而不为分支执行单元。因此,通过这样多种的指令执行单元121(即第一指令执行单元)的类型以及第二指令执行单元的类型,使得本实施例的适用性更好。
在一些可能的实现方式中,该指令执行单元121中,接收子单元1211用于接收指令译码单元发送的执行第一指令所需操作数;执行子单元1213用于基于第二指令的指令执行结果和操作数,执行第一指令。
具体地,对于一部分第一指令而言,指令执行单元121(即第一指令执行单元)在执行时只需要第二指令的指令执行结果即可,执行子单元1213就可根据该指令执行结果执行第一指令得到第一指令的指令执行结果;而对于另一部分第一指令而言,其在被执行子单元1213执行时除了需要第二指令的指令执行结果以外,还需要获得相应的操作数,该操作数可以存储在物理寄存器堆中。例如,该操作数可以是预先存储在物理寄存器堆中或者是其他指令执行单元计算得到后再存储到物理寄存器堆中。该操作数可以由指令译码单元125根据第一指令的指令信息,从物理寄存器堆获取并发送给指令执行单元121的接收子单元1211,接收子单元1211接收到操作数后,执行子单元1213可以根据该操作数和第二指令的指令执行结果执行第一指令。显然,这样使得本申请实施例对于不同的第一指令有更好的适用性。
如前述,第二指令的指令执行结果也可以是一个操作数(例如源操作数),指令执行单元121在执行第一指令时,可以是基于两个操作数,以执行第一指令得到第一指令的执行结果。
示例地,结合一条具体的指令举例说明,这一举例中的具体指令基于RISC-V指令集,例如该第一指令为:add a3,a1,a2。
则指令执行单元121的执行子单元1213在执行这一条第一指令时是累加计算a3的数值,即a3=a1+a2。这其中,a2为指令译码单元125从物理寄存器堆中获得并向指令执行单元121的接收子单元1211发送的执行第一指令所需的操作数,而a1为指令执行单元121的第二获取子单元1212根据数据选择信号,通过数据旁路从第二指令执行单元的旁路寄存器中获取的第二指令的指令执行结果(在这一示例中,a1作为源操作数)。在指令执行单元121得到了所需的操作数以及第二指令的指令执行结果之后,其执行子单元1213可以执行第一指令,执行完毕之后得到a3的值。应理解,上述示例仅用于便于解释说明本实施例,而不应视为对本申请中的任何限制。
在一些可能的实现方式中,本申请中的指令执行单元121的第二获取子单元1212,用于根据数据选择信号,通过与第二指令执行单元之间的数据旁路,从第二指令执行单元的旁路寄存器读取第二指令的指令执行结果,执行子单元1213用于将第一指令的指令执行结果存储到指令执行单元121的旁路寄存器。
由于指令执行单元121的执行子单元1213将第一指令的指令执行结果存储到指令执行单元121的旁路寄存器中,因此便于后续与第一指令存在数据相关性的其他指令在被执行前,能够被执行该其他指令的指令执行单元从指令执行单元121的旁路寄存器中获取。从而能进一步保证指令执行单元之间直接进行数据交互,减小指令执行单元在版图上的距离,减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,指令执行单元的指令执行结果也不需要前向传递给指令译码单元,能够节省指令译码单元125进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
对于一个指令执行单元而言,流水线可以有多级。在一些可能的实现方式中,该指令执行单元121的第二获取子单元1212,用于根据数据选择信号从第二指令执行单元获取第二指令的指令执行结果,若第二指令执行单元未获得第二指令的指令执行结果,则使第一指令在指令执行单元121的第一级流水线等待第二指令的指令执行结果,以在获取到第二指令的指令执行结果后,基于第二指令的指令执行结果执行第一指令。
以具体指令的示例进行说明。在该示例中,第二指令执行单元执行第二指令,指令执行单元121(即第一指令执行单元)的执行子单元1213执行第一指令,其中第二指令和第一指令存在数据相关性,在这示例中两条指令紧邻,均基于RISC-V指令集。具体地,两条指令分别为:
第二指令:add x3,x1,x2;
第一指令:sll x5,x3,x4。
在这其中,第二指令执行单元在执行第二指令时是累加计算x3,即x3=x1+x2,而指令执行单元121的执行子单元1213执行第一指令时是将x3向左移x4位,以得到x5。
以第二指令执行单元为整型处理单元,指令执行单元121(即第一指令执行单元)为另一个整型处理单元为例,假设这个示例中,第一指令位于指令译码单元125,第二指令位于第二指令执行单元(即整型处理单元)。第二指令执行单元执行第二指令,获得第二指令的执行结果即x3,并在当前时钟周期将第二指令的执行结果存入第二执行单元的旁路寄存器。第二指令执行单元将第二指令的指令标识信息和数据有效信号发送给指令译码单元125,指令执行单元121(即第一指令执行单元)将第一指令的指令标识信息发送给指令译码单元125。在下一时钟周期,指令译码单元125根据第一指令的指令信息、第二指令的指令标识信息、第一指令的指令标识信息、数据有效信号生成数据选择信号,指令译码单元125将第一指令和数据选择信号发送给指令执行单元121(即第一指令执行单元,另一个整型处理单元)的第一级流水线,第一指令此时位于指令执行单元121(即第一指令执行单元)。指令译码单元125在将第一指令和数据选择信号发送给指令执行单元121的第一级流水线的同时,将从物理寄存器堆中获取的操作数x4发送给指令执行单元121的第一级流水线(可以看出,除操作数x4以外,其他数据均未从指令译码单元125发送给指令执行单元121的接收子单元1211)。指令执行单元121(即第一指令执行单元)的第二获取子单元1212基于数据选择信号从第二指令执行单元的旁路寄存器中获取第二指令的指令执行结果即x3。至此,指令执行单元121的第一级流水线可基于第二获取子单元1212从第二指令执行单元的旁路寄存器获得的x3,以及从指令译码单元125得到的x4,执行第一指令,以得到x5。应理解,上述示例仅用于便于解释说明本实施例,而不应视为对本申请中的任何限制。
由于本申请在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元125发送数据有效信号,指令执行单元121的接收子单元1211接收来自指令译码单元125的第一指令和数据选择信号,指令执行单元121的第二获取子单元1211根据数据选择信号可通过数据旁路从第二指令执行单元获取第二指令的指令执行结果,进而第一指令执行单元的第一级流水线基于获取到的指令执行结果执行第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,也节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
应理解,本申请中,对于不同类型的指令执行单元121(即第一指令执行单元)和第二指令执行单元来说,指令执行单元121在执行第一指令时的具体方式可能是不同的。
前面示例中介绍的是指令执行单元121(即第一指令执行单元)以及第二指令执行单元均为整型运算单元的情形,具体地,以整型运算单元为数据源的数据旁路(即第二指令执行单元为整型运算单元),这一类的特点是整形运算单元指令均一个时钟周期可以得到第二指令的指令执行结果,故当第一指令由指令译码单元125发射至指令执行单元121的第一级流水线,指令执行单元一定可以根据数据选择指令从第二指令执行单元的旁路寄存器中获取到对应的源操作数(即第二指令的指令执行结果),因此指令执行单元121的第一级流水线可以在获得第二指令的指令执行结果后执行第一指令。
而另一种情形中,在第二获取子单元1212根据数据选择信号从第二指令执行单元获取第二指令的指令执行结果时,第二指令执行单元可能并未获得第二指令的指令执行结果,则使第一指令在指令执行单元121的第一级流水线等待第二指令的指令执行结果,以在第二获取子单元1212获取到第二指令的指令执行结果后,执行子单元1213基于第二指令的指令执行结果执行第一指令。
这另一种情形的典型例子可以是第二指令执行单元为访存单元时的情形,此时的第二指令为访存指令,而由于访存指令的执行周期不可预测,存在较多影响访存指令执行周期的因素存在(举例来说,是否命中数据高速缓存dcache会较大影响load指令(即一种访存指令)的执行周期等),因此当第一指令由指令译码单元125发射至指令执行单元121的第一级流水线,指令执行单元121不一定可以根据数据选择指令从第二指令执行单元的旁路寄存器中获取到对应的源操作数(即第二指令的指令执行结果),则本实施例中令第一指令在指令执行单元121的第一级流水线进行等待,直至第二获取子单元1212成功获得第二指令的指令执行结果后,执行子单元1213执行第一指令。
因此,本申请中通过这种令第一指令在指令执行单元121的第一级流水线进行等待的机制,相比于传统方案中若不能从指令译码单元125取得源操作数则第一指令不发射至指令执行单元121的方式,本方案减少了对发射资源的占用,对于支持乱序发射的处理器,后续与其无数据相关性的指令可继续发射执行,从而有利于处理器性能的提升。
在一些可能的实现方式中,指令执行单元121还包括:预处理子单元;第二获取子单元1212用于根据数据选择信号,通过第二指令执行单元至指令执行单元的第一级流水线之前的数据通路,获取第二指令的指令执行结果;预处理子单元用于在第二指令的指令执行结果进入指令执行单元的第一级流水线之前,对第二指令的指令执行结果进行预处理。
具体地,在一些指令执行单元121为一些特定的类型时,其第一级流水线的时序较为紧张,例如这种情况可以是在指令执行单元121为访存单元时。因此本申请中可以增加第二指令执行单元到指令执行单元121的第一级流水线之间的数据通路(例如第二指令执行单元的第一级流水线到指令执行单元121(即第一指令执行单元)的第一级流水线之间的数据通路),这种第二指令执行单元和指令执行单元121(即第一指令执行单元)之间直接的数据通路,相比于传统方案中经指令译码单元125仲裁的方式路径更短,故指令执行单元121(即第一指令执行单元,为访存单元)的预处理单元,可以在第二指令的指令执行结果进入指令执行单元121的第一级流水线之前,对第二指令的指令执行结果进行一些预处理,以便于缓解指令执行单元121的第一级流水线的时序的压力,使得相邻两级流水线负载更为均衡,从而有利于处理器性能的提升。
综上所述,本申请实施例提供的数据旁路方案,在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元发送数据有效信号,指令执行单元(即第一指令执行单元)接收来自指令译码单元的第一指令和数据选择信号,指令执行单元根据所述数据选择信号,从所述第二指令执行单元获取所述第二指令的指令执行结果,并基于所述第二指令的指令执行结果,执行所述第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
指令处理方法
图7是本申请一个实施例的指令处理方法的流程图,该指令处理方法可由上述指令译码单元实施例中的指令译码单元125执行。如图7所示,该指令处理方法包括如下步骤:
步骤701、接收至少两个指令执行单元发送的指令标识信息和数据有效信号,其中,指令标识信息用于指示相应指令执行单元所执行的指令,数据有效信号用于指示相应指令执行单元已获得指令执行结果;
步骤702、根据待执行的第一指令的指令信息、指令标识信息和数据有效信号,生成数据选择信号;
步骤703、将第一指令和数据选择信号发送给至少两个指令执行单元中的第一指令执行单元,以使第一指令执行单元根据数据选择信号,从至少两个指令执行单元中的第二指令执行单元获取第二指令的指令执行结果,并基于获取到的指令执行结果执行第一指令。
在本申请实施例中,在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元发送数据有效信号,指令译码单元根据第一指令的指令标识信息和数据有效信号,向第一指令执行单元发送数据选择信号,第一指令执行单元根据数据选择信号可通过数据旁路从第二指令执行单元获取第二指令的指令执行结果,进而基于获取到的指令执行结果执行第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
在一种可能的实现方式中,至少两个指令执行单元包括整型运算单元、分支执行单元和访存单元中的至少两个,第二指令执行单元包括整型运算单元或访存单元,第一指令执行单元包括整型运算单元、分支执行单元或访存单元。
在一种可能的实现方式中,将第一指令和数据选择信号发送给至少两个指令执行单元中的第一指令执行单元,以使第一指令执行单元根据数据选择信号,从至少两个指令执行单元中的第二指令执行单元获取第二指令的指令执行结果,并基于获取到的指令执行结果执行第一指令,包括:根据第一指令的指令信息,从物理寄存器堆获取执行第一指令所需的操作数,并将操作数发送给第一指令执行单元,以使第一指令执行单元基于第二指令的指令执行结果和操作数,执行第一指令。
在一种可能的实现方式中,将第一指令和数据选择信号发送给至少两个指令执行单元中的第一指令执行单元,以使第一指令执行单元根据数据选择信号,从至少两个指令执行单元中的第二指令执行单元获取第二指令的指令执行结果,并基于获取到的指令执行结果执行第一指令,包括:将第一指令和数据选择信号发送给第一指令执行单元的第一级流水线,以使第一指令执行单元的第一级流水线基于获取到的指令执行结果执行第一指令。
需要说明的是,由于该指令处理方法的细节在上述实施例的指令译码单元部分,已经结合结构示意图进行了详细说明,具体过程可参见前述指令译码单元实施例中的描述,在此不再进行赘述。
指令处理方法
图8是本申请另一个实施例的指令处理方法的流程图,该指令处理方法可由上述指令执行单元实施例中的指令执行单元121处理。如图8所示,该指令处理方法包括如下步骤:
步骤801、接收来自指令译码单元的第一指令和数据选择信号,其中,数据选择信号指示与第一指令存在数据相关性的第二指令的指令执行结果,第二指令由第二指令执行单元执行;
步骤802、根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果;
步骤803、基于第二指令的指令执行结果,执行第一指令。
在本申请实施例中,在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元发送数据有效信号,指令执行单元(即第一指令执行单元)接收来自指令译码单元的第一指令和数据选择信号,指令执行单元根据所述数据选择信号,从所述第二指令执行单元获取所述第二指令的指令执行结果,并基于所述第二指令的指令执行结果,执行所述第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。
在一种可能的实现方式中,指令执行单元包括整型运算单元、分支执行单元或访存单元。
在一种可能的实现方式中,接收来自指令译码单元的第一指令和数据选择信号,包括:接收指令译码单元发送的执行第一指令所需操作数;基于第二指令的指令执行结果,执行第一指令,包括:基于第二指令的指令执行结果和操作数,执行第一指令。
在一种可能的实现方式中,根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果,包括:根据所述数据选择信号,通过与所述第二指令执行单元之间的数据旁路,从所述第二指令执行单元的旁路寄存器读取所述第二指令的指令执行结果;所述指令处理方法,还包括:将第一指令的指令执行结果存储到指令执行单元的旁路寄存器。
在一种可能的实现方式中,根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果,包括:根据数据选择信号从第二指令执行单元获取第二指令的指令执行结果,若第二指令执行单元未获得第二指令的指令执行结果,则使第一指令在指令执行单元的第一级流水线等待第二指令的指令执行结果,以在获取到第二指令的指令执行结果后,基于第二指令的指令执行结果执行第一指令。
在一种可能的实现方式中,根据数据选择信号,从第二指令执行单元获取第二指令的指令执行结果,包括:根据数据选择信号,通过第二指令执行单元至指令执行单元的第一级流水线之前的数据通路,获取第二指令的指令执行结果;所述指令处理方法,还包括:在第二指令的指令执行结果进入指令执行单元的第一级流水线之前,对第二指令的指令执行结果进行预处理。
需要说明的是,由于该指令处理方法的细节在上述实施例的指令执行单元部分,已经结合结构示意图进行了详细说明,具体过程可参见前述指令执行单元实施例中的描述,在此不再进行赘述。
计算机存储介质
本申请还提供了一种计算机可读存储介质,存储用于使一机器执行如本文所述的方法的指令。具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。
在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本申请的一部分。
用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD+RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上下载程序代码。
计算机程序产品
本申请实施例还提供了一种计算机程序产品,包括计算机指令,该计算机指令指示计算设备执行上述多个方法实施例中的任一对应的操作。
本申请实施例的商业价值
本申请实施例提供的数据旁路方案,在第一指令与第二指令存在数据相关性时,第二指令执行单元执行第二指令获得指令执行结果后,向指令译码单元发送数据有效信号,指令译码单元根据第一指令的指令标识信息和数据有效信号,向第一指令执行单元发送数据选择信号,第一指令执行单元根据数据选择信号可通过数据旁路从第二指令执行单元获取第二指令的指令执行结果,进而基于获取到的指令执行结果执行第一指令。指令执行单元之间直接的数据交互,可以减小指令执行单元在版图上的距离,从而减小数据旁路,缩短指令执行单元之间传输指令执行结果所需的时间,而且指令执行单元的指令执行结果不需要前向传递给指令译码单元,节省了指令译码单元进行仲裁和转发指令执行结果的时间,从而可以化解数据旁路的时序问题。由此本实施例具有广泛的应用前景,具备较高的商业价值。
应该理解,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于装置和系统实施例中描述的方法,所以描述的比较简单,相关之处参见其他实施例的部分说明即可。
应该理解,上述对本说明书特定实施例进行了描述。其它实施例在权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
应该理解,本文用单数形式描述或者在附图中仅显示一个的元件并不代表将该元件的数量限于一个。此外,本文中被描述或示出为分开的模块或元件可被组合为单个模块或元件,且本文中被描述或示出为单个的模块或元件可被拆分为多个模块或元件。
还应理解,本文采用的术语和表述方式只是用于描述,本说明书的一个或多个实施例并不应局限于这些术语和表述。使用这些术语和表述并不意味着排除任何示意和描述(或其中部分)的等效特征,应认识到可能存在的各种修改也应包含在权利要求范围内。其他修改、变化和替换也可能存在。相应的,权利要求应视为覆盖所有这些等效物。