CN113795823A - 处理器资源的可编程控制 - Google Patents

处理器资源的可编程控制 Download PDF

Info

Publication number
CN113795823A
CN113795823A CN201980091969.5A CN201980091969A CN113795823A CN 113795823 A CN113795823 A CN 113795823A CN 201980091969 A CN201980091969 A CN 201980091969A CN 113795823 A CN113795823 A CN 113795823A
Authority
CN
China
Prior art keywords
micro
processor
instruction
program
caches
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201980091969.5A
Other languages
English (en)
Inventor
P·K·杜塔
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nokia Technologies Oy
Original Assignee
Nokia Technologies Oy
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nokia Technologies Oy filed Critical Nokia Technologies Oy
Publication of CN113795823A publication Critical patent/CN113795823A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3808Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3814Implementation provisions of instruction buffers, e.g. prefetch buffer; banks

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

呈现了处理器的各种示例实施例。处理器的各种示例实施例可以被配置为支持处理器的处理器前端的资源的分割可编程性。处理器的各种示例实施例被配置为以如下方式支持处理器的处理器前端的资源的分割可编程性,该方式实现将处理器的前端的分割可编程资源指派给正由处理器执行的程序的控制块。处理器的各种示例实施例被配置为支持处理器的前端的微操作(UOP)缓存(UC)资源的分割可编程性(其随后可以被称为分割可编程(SP)UC(SP‑UC),其中由于存在多个UC,因此其可以被称为“分割”,并且由于从多个UC的集合中选择活动UC是由处理器执行的程序可控制的,因此可以被称为“可编程的”)。

Description

处理器资源的可编程控制
技术领域
各种示例实施例总体涉及处理器,更特别地但非排他性地,涉及用于处理器的处理器缓存。
背景技术
一般而言,处理器可以基于各种架构,并且可以被配置用于各种目的。例如,一种常见类型的处理器是中央处理单元(CPU),它是计算机内执行程序的组件。当CPU被包含在单个芯片上时,它通常被称为微处理器。微处理器可以基于各种架构,通常被称为指令集架构(ISA),并且可以被配置用于各种目的,诸如通用处理、网络分组转发、图形处理、等等。
发明内容
处理器的各种示例实施例可以被配置为支持处理器的处理器前端资源的可编程性。在至少一些示例实施例中,处理器包括后端、具有前端资源的前端和指令集架构(ISA)。处理器可以被配置为执行程序。前端可以被配置为解码程序的指令以向后端提供微操作集合。后端可以被配置为从前端接收微操作并执行微操作。ISA可以被配置为支持由程序对前端的前端资源集的可编程性。处理器前端资源可以包括微操作(UOP)缓存(UC)资源、分支预测单元(BPU)资源、分支目标缓冲器(BTB)资源等及其各种组合。在至少一些实施例中,一种装置可以包括处理器,其被配置为支持处理器的UC资源的可编程性,其中该处理器包括至少两个微操作缓存的集合,该微操作缓存被配置为存储从要由处理器执行的程序的指令解码的微操作。在至少一些示例实施例中,非瞬态计算机可读存储介质存储指令,该指令被配置为使处理器通过具有至少两个微操作缓存的处理器的解码块来解码程序的指令,以形成微操作并将该微操作存储在微操作缓存中的活动微操作缓存中。在至少一些示例实施例中,一种方法包括:由具有至少两个微操作缓存的处理器的解码块解码程序的指令以形成微操作,并将该微操作存储在微操作缓存中的活动微操作缓存中。在至少一些示例实施例中,一种装置包括处理器,该处理器包括用于通过具有至少两个微操作缓存的处理器的解码块来解码程序的指令以形成微操作的部件,以及用于将微操作存储在微操作缓存中的活动微操作缓存中的部件。在至少一些示例实施例中,一种装置包括用于通过具有至少两个微操作缓存的处理器的解码块来解码程序指令以形成微操作的部件,以及用于将微操作存储在微操作缓存中的活动微操作缓存中的部件。在至少一些实施例中,一种装置可以包括处理器,该处理器被配置为支持处理器的UC资源的可编程性,其中处理器包括ISA,该ISA被配置为支持由处理器执行的程序对处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,非瞬态计算机可读存储介质存储指令,该指令被配置为使处理器执行包括指令集的程序,并且由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,一种方法包括由处理器执行包括指令集的程序,并且由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,一种装置包括处理器,该处理器包括用于执行包括指令集的程序的部件,以及用于由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性的部件。在至少一些示例实施例中,一种装置包括用于由处理器执行包括指令集的程序的部件,以及用于由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性的部件。
在至少一些示例实施例中,一种装置包括处理器,该处理器包括至少两个微操作缓存的集合,该至少两个微操作缓存被配置为存储从要由处理器执行的程序的指令解码的微操作。在至少一些示例实施例中,处理器被配置为在处理器执行程序期间的任何时间仅激活来自至少两个微操作缓存的集合的微操作缓存,以用于微操作的存储或访问。在至少一些示例实施例中,处理器包括指令解码器的集合,其中,在程序的指令之一的解码期间,该指令解码器的集合将微操作存储到微操作缓存中的活动微操作缓存中。在至少一些示例实施例中,处理器被配置为在获取程序的指令的指令指针(IP)的同时,在微操作缓存中的活动微操作缓存中执行查找操作。在至少一些示例实施例中,处理器被配置为基于微操作缓存切换指令,支持将微操作缓存中的一个微操作缓存选择作为活动微操作缓存。在至少一些示例实施例中,微操作缓存切换指令是专门针对将微操作缓存中的一个微操作缓存选择作为活动微操作缓存而配置的指令。在至少一些示例实施例中,微操作缓存切换指令是被配置为提供程序的程序控制功能并且还被配置为支持将微操作缓存中的一个微操作缓存选择作为活动微操作缓存的指令。在至少一些示例实施例中,处理器的ISA支持微操作缓存切换指令。在至少一些示例实施例中,处理器被配置为选择微操作缓存中的第一微操作缓存作为活动微操作缓存,其中微操作缓存切换指令包括微操作缓存中的第二微操作缓存的标识符,其中微操作缓存切换指令的解码使活动微操作缓存从微操作缓存中的第一微操作缓存切换到微操作缓存中的第二微操作缓存。在至少一些示例实施例中,处理器被配置为解码程序的微操作缓存切换指令,以使选择微操作缓存中的第一微操作缓存作为活动微操作缓存,其中从程序的一个或多个后续指令解码的微操作被存储在微操作缓存中的第一微操作缓存中,直到下一微操作缓存切换指令被解码以将活动微操作缓存改变为微操作缓存中的第二微操作缓存。在至少一些示例实施例中,处理器被配置为选择微操作缓存中的第一微操作缓存作为活动微操作缓存,其中处理器被配置为在解码与微操作缓存中的第二微操作缓存相关联的程序的下一指令之前,将活动微操作缓存切换到微操作缓存中的第二微操作缓存。在至少一些示例实施例中,处理器被配置为选择微操作缓存中的第一微操作缓存作为活动微操作缓存,其中处理器被配置为在执行基于微操作缓存切换指令解码的微操作之前,基于微操作缓存切换指令将活动微操作缓存切换到微操作缓存中的第二微操作缓存。在至少一些示例实施例中,处理器被配置为基于确定微操作缓存切换指令存在于微操作缓存中的第一微操作缓存中来执行切换。在至少一些示例实施例中,处理器被配置为基于确定微操作缓存切换指令不存在于微操作缓存中的第一微操作缓存中,在微操作缓存切换指令的解码和存储期间执行切换。在至少一些示例实施例中,处理器包括ISA,该ISA被配置为支持程序对微操作缓存的集合的可编程性。在至少一些示例实施例中,非瞬态计算机可读存储介质存储指令,该指令被配置为使处理器通过具有至少两个微操作缓存的处理器的解码块来解码程序的指令,以形成微操作并将该微操作存储在微操作缓存中的活动微操作缓存中。在至少一些示例实施例中,一种方法包括:由具有至少两个微操作缓存的处理器的解码块解码程序的指令以形成微操作,并将该微操作存储在微操作缓存中的活动微操作缓存中。在至少一些示例实施例中,一种装置包括处理器,该处理器包括用于通过具有至少两个微操作缓存的处理器的解码块对程序的指令进行解码以形成微操作的部件,以及用于将微操作存储在微操作缓存中的活动微操作缓存中的部件。在至少一些示例实施例中,一种装置包括用于通过具有至少两个微操作缓存的处理器的解码块对程序指令进行解码以形成微操作的部件,以及用于将微操作存储在微操作缓存中的活动微操作缓存中的部件。
在至少一些示例实施例中,一种装置包括处理器,该处理器包括指令集架构(ISA),ISA被配置为支持由处理器执行的程序对处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持程序的控制块与微操作缓存中的一个微操作缓存的关联。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持由程序的两个或更多个控制块共享微操作缓存中的一个微操作缓存。在至少一些示例实施例中,处理器被配置为将程序的两个或更多个控制块保持为在空间上并置在程序存储器中。在至少一些示例实施例中,程序包括控制块的集合,其中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持由程序将程序的控制块分布在微操作缓存的至少一部分上。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持被配置为切换微操作缓存中的活动微操作缓存的指令。在至少一些示例实施例中,被配置为切换微操作缓存中的活动微操作缓存的指令包括微缓存标识符,该微缓存标识符指示将使微操作缓存中的一个微操作缓存作为微操作缓存中的活动微操作缓存。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持专门针对将微操作缓存中的一个微操作缓存选择作为活动微操作缓存而配置的指令类型。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持指令类型,该指令类型被配置为提供程序的程序控制功能,并且还被配置为支持将微操作缓存中的一个微操作缓存选择作为活动微操作缓存。在至少一些示例实施例中,为了支持程序对微操作缓存的集合的可编程性,ISA被配置为支持将程序的控制块固定到微操作缓存中的一个微操作缓存,使得基于控制块的指令解码的微操作从微操作缓存中的一个微操作缓存访问,或者将其存储在微操作缓存中的一个微操作缓存中。在至少一些示例实施例中,程序的第一和第二控制块与相应的第一和第二微操作缓存相关联,其中ISA被配置为支持微操作缓存切换指令,微操作缓存切换指令当在将控制从第一控制块转移到第二控制块之前被具有第二控制块的标识符的程序调用时,使活动微操作缓存从微操作缓存中的第一微操作缓存切换到微操作缓存中的第二微操作缓存。在至少一些示例实施例中,非瞬态计算机可读存储介质存储指令,该指令被配置为使处理器执行包括指令集的程序,并且由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,一种方法包括由处理器执行包括指令集的程序,并且由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性。在至少一些示例实施例中,一种装置包括处理器,该处理器包括用于执行包括指令集的程序的部件,以及用于由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性的部件。在至少一些示例实施例中,一种装置包括用于由处理器执行包括指令集的程序的部件,以及用于由处理器的ISA基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性的部件。
附图说明
通过结合附图考虑以下具体实施方式,可以容易地理解本文的教导,其中:
图1描绘了包括分割可编程微操作缓存的处理器的示例实施例;
图2描绘了能够支持处理器前端资源的分割可编程性的处理器前端的示例实施例;
图3描绘了能够支持分割可编程性并操作单个微操作缓存的处理器前端的示例实施例;
图4描绘了处理器前端的指令缓存(IC)的逻辑组织的示例实施例;
图5描绘了用于将指令块从存储器映射到处理器前端的IC的指令指针(IP)的分区的示例实施例;
图6描绘了采用N路关联缓存的微操作缓存的示例实施例;
图7描绘了处理器前端的示例实施例,其示出了与IC结合的微操作缓存,该实施例被配置为在流模式下操作;
图8描绘了UC行的结构的示例实施例,其中UOP槽被配置为存储UOP,该实施例被配置为用于图7的微操作缓存中;
图9描绘了IC行内的基本块的结构的示例实施例,该IC行可以根据该块的第一指令的IP被解码并映射到UC,该实施例被配置为用于图7的微操作缓存中;
图10描绘了处理器前端的示例实施例,其示出了与IC结合的微操作缓存,该实施例被配置为在构建模式下操作;
图11描绘了UC行的结构的示例实施例,其中UOP槽被配置为存储UOP,该实施例被配置为用于图10的微操作缓存中,以及在对IC行中的基本块进行解码之后的UC行的构造中;
图12描绘了在IC行内将用于标识基本块的IP的字段翻译成由UC用来存储从基本块映射的UC行的IP字段的示例实施例,该实施例被配置为用于图10的微操作缓存中;
图13描绘了用于示出程序的结构组件(诸如子例程和分支)的程序的示例实施例,该结构组件导致程序内的控制流集合;
图14描绘了程序存储器的示例实施例,其被实现为存储器中的二维区域,该二维区域被划分为特定缓存的缓存行单元,用于示出用于程序的特定控制流集合的缓存行的工作集合;
图15描绘了被配置为由处理器执行的网络分组处理程序的简化结构的示例实施例;
图16描绘了用于使用单个微操作缓存执行图15的网络分组处理程序的控制流和由此产生的控制块的结构的示例实施例;
图17描绘了处理器前端的示例实施例,其被配置为支持分割可编程性并且包括分割可编程微操作缓存;
图18描绘了x86指令集架构指令的编码的示例实施例,其用于示出被配置为支持处理器前端资源的分割和可编程性的颜色切换指令的编码;
图19描绘了使用x86指令集架构实现的“颜色切换类型-1”(Color Switch Type-1)指令的示例实施例;
图20描绘了x86指令序列的示例实施例,其包括“颜色切换类型-1”指令;
图21描绘了使用x86指令集架构实现的“颜色切换类型-2”(Color Switch Type-2)指令的示例实施例;
图22描绘了基于对“颜色切换”(Color Switch)指令的解码而生成的“颜色切换UOP”(Color Switch UOP)的示例实施例;
图23描绘了解码“颜色切换类型-1”指令的示例实施例;
图24描绘了解码“颜色切换类型-2”指令的示例实施例;
图25描绘了处理器前端的示例实施例,其用于示出被配置用于实现分割可编程微操作缓存的微架构;
图26描绘了处理器前端的示例实施例,其示出了与IC结合的分割可编程微操作缓存,该实施例被配置为在构建模式下操作;
图27描绘了处理器前端的示例实施例,其用于示出用于实现分割可编程微操作缓存的微架构,该实施例被配置为支持用于在不可编程和可编程操作模式之间切换的模式选择;
图28描绘了用于使用分割可编程微操作缓存执行图15的网络分组处理程序的控制流和由此产生的控制块的结构的示例实施例;
图29描绘了被配置为支持处理器的处理器前端资源的分割可编程性的处理器的示例实施例;
图30描绘了供处理器使用以支持处理器的微操作缓存资源的可编程性的方法的示例实施例;
图31描绘了供处理器使用以支持处理器的微操作缓存资源的可编程性的方法的示例实施例;
图32描绘了供处理器使用以支持处理器前端资源的可编程性的方法的示例实施例;以及
图33描绘了可以利用本文呈现的各种功能的计算机的示例实施例。
为了便于理解,在可能的情况下,使用相同的附图标记来表示附图共同的相同元件。
具体实施方式
呈现了处理器的各种示例实施例。处理器的各种示例实施例被配置为支持处理器的处理器前端的资源的分割可编程性。处理器的各种示例实施例被配置为以如下方式支持处理器的处理器前端的资源的分割可编程性,该方式使得能够将处理器前端的分割可编程资源指派给正由处理器执行的程序的控制块。处理器的各种示例实施例被配置为支持处理器前端的微操作(UOP)缓存(UC)资源的分割可编程性(其随后可被称为分割可编程(SP)UC(SP-UC),其中,由于存在多个UC,因此其可被称为“分割”,并且由于从多个UC的集合中选择活动UC是由处理器执行的程序可控制的,因此其可被称为“可编程”)。处理器的各种示例实施例被配置为通过提供包括至少两个UC的集合的处理器来支持处理器的UC资源的分割可编程性,UC被配置为存储从要由处理器执行的程序的指令解码的微操作。处理器的各种示例实施例被配置为通过提供包括指令集架构(ISA)的处理器来支持处理器的UC资源的分割可编程性,ISA被配置为支持由处理器执行的程序对处理器的两个或更多个UC的集合的可编程性。处理器的各种示例实施例被配置为通过提供包括至少两个UC的集合和ISA的处理器来支持处理器的UC资源的分割可编程性,UC被配置为存储从要由处理器执行的程序的指令解码的微操作,ISA被配置为支持由处理器执行的程序对处理器的两个或更多个UC的集合的可编程性。处理器的各种示例实施例被配置有在不可编程操作模式(例如,其中UC资源是不可编程的)和可编程操作模式(例如,其中UC资源是可编程的)中的处理器操作,以及在二者之间的处理器的关联切换。处理器的各种示例实施例被配置为支持处理器前端的各种其他资源类型的分割可编程性。将理解,这些和各种其他示例实施例以及这种处理器和相关联的SP-UC的优点或潜在优点可以通过参考各种附图进一步理解,这些附图将在下面进一步讨论。
图1描绘了包括分割可编程微操作缓存的处理器的示例实施例。
处理器100包括前端110、后端120和存储器130。前端110包括ISA指令解码器111和SP-UC 112,其被配置为支持本文讨论的各种功能。存储器130被配置为存储用于要由处理器100执行的程序的程序ISA指令131和程序数据132。首先考虑处理器的各种更一般方面以及相关联的处理器架构和微架构,可以进一步理解图1的处理器100的操作。
总体而言,处理器(诸如处理器100)可以基于各种架构,并且可以被配置用于各种目的。例如,一种常见类型的处理器是中央处理单元(CPU),它是计算机内执行程序的组件。当CPU被包含在单个芯片上时,它通常被称为微处理器。微处理器可以基于通常被称为ISA的各种架构,并且可以被配置用于各种目的,诸如通用处理、网络分组处理、图形处理、等等。
总体而言,超标量处理器是在处理器核内实现一种被称为指令级并行化的并行化形式的处理器。单核处理器只有一个核,而多核处理器具有多个核。将理解,本文可以使用术语“处理器核”来表示任一个这些类型的处理器中的核。与每个时钟周期最多可以执行一条指令的标量处理器中的核相比,超标量处理器中的核可以在时钟周期期间执行多于一条指令,通常通过将多条指令同时分派到该核上的不同执行单元。处理器核按照由输入数据和执行单元的可用性而不是它们在程序中的原始顺序控制的顺序来执行指令。通过这样做,处理器核可以避免在等待前一指令完成时空闲,并且与此同时可以处理能够立即和独立运行的下一指令。与在给定时钟速率下以其他方式可能的吞吐量(例如,在一个时间单位中可以执行的指令数量)相比,这种执行指令的方法(其被称为“无序”执行)允许更大的吞吐量。将理解,大多数超标量处理器遵循无序执行。
总体而言,ISA可以被认为是处理器的模型,并且通常被称为处理器的架构。ISA定义了所支持的数据类型、存储器模型和寄存器及其语义(诸如针对数据操作数的存储器一致性和寻址模式)、指令集和输入/输出模型。微架构是给定ISA在处理器中实现的方式。微架构由构建块和电学电路组成,以实现构建块所需的逻辑。给定ISA可以利用不同的微架构来实现,这些微架构可以在性能、物理大小、开销、功耗等方面有所不同。因此,ISA充当程序和处理器之间的接口。为ISA编写的程序可以在实现相同ISA的不同微架构上执行。这使得针对特定ISA的不同代处理器之间的程序兼容性得以轻松实现。
总体而言,处理器支持的指令可以以各种方式构造。例如,在某些处理器(诸如无序超标量处理器)中,指令具有可变的长度。这样的指令能够执行复杂任务,使得单个指令可以被分解成多个更简单的任务。这些类别的处理器也被称为复杂指令集计算机(CISC)。例如,指令可以是将寄存器加到存储器(add-register-to-memory),这意味着“将寄存器R1中的值与存储器位置M中的值相加,然后将结果存储回存储器位置M中”。然后,该指令被分解成分别将值从存储器M加载到本地寄存器R2,将R1和R2中的值相加并将结果存储在R2中,以及将R2中的值存储到存储器位置M。x86是在各种供应商提供的处理器中实现的这样一种ISA。x86指令的长度可以从1B到15B不等,其中最简单的指令可以使用一个字节进行编码,而涉及复杂操作的指令可以使用多个字节进行编码。
而言而言,CISC处理器提供了许多优势。例如,CISC处理器可以提供更大的指令密度,这可以改善程序的静态大小(例如,用于给定程序的存储量)。这对嵌入式系统尤其重要,因为它可能占系统开销的很大一部分,并且可能影响系统的物理大小(这会影响适合用途与否和制造开销)。例如,CISC处理器还可以改进代码的动态大小(即,由处理器执行的程序中的指令集),并且减少用于(从存储器和从缓存两者)获取指令的带宽量。这可以降低开销和能量使用,并且可以提高性能。对于给定的命中率,较小的动态代码大小也会减小缓存的大小;较小的缓存可以使用更少的能量和更少的芯片面积,并且可以具有更低的访问时延。例如,在具有可变长度指令的CISC处理器中,可以在指令中编码较大的常量。使用编码后的常量,而不是从数据存储器加载常量,利用了空间局部性,更早地提供了要执行的值,避免了额外的指令,并且删除了数据缓存访问。换言之,一次更宽的访问比相同总大小的多次访问更简单。例如,在CISC处理器中,考虑到对可变长度指令的支持,扩展ISA一般更容易,并且可以通过使用超长指令来包括附加信息。
如上所述,使用ISA的可变长度指令可以提供许多优点。然而,处理器的微架构通常不能以其原生形式执行ISA的可变长度指令。在处理器的微架构级别,指令由固定长度的更简单的微操作(例如,通常被称为“微op”并缩写为“OP”或“UOP”)来表示。可变长度指令被分解成固定长度的UOP序列。UOP对存储在一个或多个寄存器中的数据执行基本操作,包括在寄存器之间或在寄存器与外部总线之间传输数据,以及对寄存器执行算术和逻辑操作。例如,前面描述的将寄存器加到存储器指令被分解为单独的加载、加法和存储UOP序列。指令由处理器的前端动态解码为UOP。解码为UOP之后,处理器的后端发布并执行UOP。该动态解码还提供了从可以定义其自身的UOP集合的处理器的底层微架构中更清晰地分离出“稳定的”和“标准化的”ISA(例如,x86)。例如,Haswell和Skylake是英特尔支持X86 ISA的两个不同的微架构,但每个微架构均可以定义其自身的原生UOP集合。这些架构享有多功能向后兼容CISC前端和简单经济高效的后端的双重优势。此外,附加的间接级别支持在幕后无缝优化内部UOP,而无需对程序员界面进行任何改变。将理解,除非本文另有指示,否则术语“指令”指的是由处理器(例如,x86)支持的ISA的可变长度指令。注意,对UOP的指令进行解码不限于仅具有可变长度指令的ISA,而是还适用于支持固定长度更简单指令的ISA。这些类别的处理器被称为精简指令集计算机(RISC)。此类ISA的示例包括MIPS、ARM等。
在无序超标量处理器中,指令通常要经过多个阶段来执行。这些阶段被称为处理器的流水线。处理器的流水线的第一部分负责从指令库获取指令(说明性地,从处理器100的存储器130获取ISA程序指令131)。从获取指令到动态解码指令以形成UOP的阶段被称为处理器的“前端”(说明性地,处理器100的前端110)。处理器的流水线中的剩余阶段(例如,重命名、执行和退出),其以前端提供的UOP为单位进行处理,被称为处理器的“后端”(说明性地,处理器100的后端120)。注意,无序超标量处理器的后端可以在每个时钟周期执行多个UOP,因此,无序超标量处理器的有效前端(例如,将指令解码为UOP的效率及其以低时延和高带宽向后端的足够供应)可以提高处理器的整体性能。
基于上述内容,现在进一步描述处理器100在执行程序中的操作。前端110从存储器130读取程序的程序ISA指令(其基于处理器100支持的ISA)。前端110的ISA指令解码器111接收程序ISA指令131,解码程序ISA指令131以形成UOP集合,并将UOP存储在SP-UC 112中。前端110向后端120提供UOP。后端120从前端110接收UOP并执行UOP以提供由要由处理器100执行的程序的程序ISA指令131所请求的功能。处理器100的ISA被配置为提供对前端110的SP-UC 112中的SP-UC资源的可编程控制,并且因此将UOP从前端110过度传递到后端120以供后端120处理,以提供由处理器100执行的程序的程序ISA指令131所请求的功能。
将理解,处理器100的、基于使用处理器100的ISA的操作被配置为提供对处理器100的前端110的SP-UC 112中的SP-UC资源的可编程控制,这可以通过参照图2被进一步理解。
图2描绘了能够支持处理器前端资源的分割可编程性的处理器前端的示例实施例。将理解,图2的前端200可以用作图1的处理器100的前端110。
图2的前端200包括一级(L1)指令缓存(L1-IC)210、指令获取单元(IFU)220、分支预测单元(BPU)230、指令长度解码器(ILD)240、指令队列(IQ)250、指令解码器(ID)260、UOP缓存(UC)270和指令解码器队列(IDQ)280。
L1-IC 210是相关联处理器的缓存层级结构的一部分,并且可以通过更一般地考虑缓存层级结构处理器来进一步理解。总体而言,缓存是更小、更快的存储器,更靠近处理器,它存储来自频繁使用的存储器位置的程序数据或程序指令的副本,以降低平均访问开销(时间或能量)。数据或程序指令由通常称为缓存行的连续存储器位置的块存储在缓存中,其中每个缓存行由缓存行中的第一存储器地址在缓存中索引。缓存受益于程序中存储器访问模式的时间和空间局部性,其中空间局部性是指使用相对靠近的存储器位置(即,在缓存行内),而时间局部性是指在相对较小的持续时间内重新使用特定缓存行。许多处理器使用多级缓存。例如,常见处理器架构可以利用至少三个级别(L)的缓存,其通常被称为L1、L2和L3。L1缓存是最小的,并且距离处理器最近,因此比其他缓存级别更快。通常,L1缓存被分割成两个部分:仅保存程序指令的L1指令缓存(例如,大小为32KB,尽管可以使用其他大小)和仅保存程序数据的L1数据缓存(例如,大小为32KB,尽管可以使用其他大小)。L2缓存(例如,大小为256KB,尽管可以使用其他大小)和L3缓存(例如,大小为2MB,尽管可以使用其他大小)是通常是统一缓存的后续级别(意味着它们保存指令和程序数据两者)。L3缓存通常对于多核处理器中的处理器核是常见的,因此位于处理器核的外部。将理解,缓存大小和访问时延根据级别增长。如果对应于所查找的存储器地址的缓存行在L1缓存中缺失,则处理器在后续级别的缓存中查找(例如,L2缓存,然后是L3缓存,依此类推)。如果存储器地址在所有可用缓存级别中缺失,则处理器可以访问主存储器以检索存储器地址处的指令或数据。因此,只有当存储器地址在所有缓存中均缺失时,才访问主存储器。一旦定位到缺失的块,就将其带入L1缓存中的缓存行中。
IFU 220负责向处理器馈送要执行的指令,因此,它是处理指令的第一组件。IFU220主要包括计算下一获取地址然后从L1-IC 210获取指令所需的逻辑。指令由IFU 220以原始字节流的形式从L1-IC 210获取。
BPU 230被配置为预测针对IFU 220的下一获取地址,因为否则分支指令(包括条件分支、跳转、子例程调用和子例程返回、等等)在获取指令流中引入显著的额外复杂性级别,因为直到分支指令本身被执行才能计算正确的获取地址。总体而言,这一预测中具有两个部分。第一部分是预测分支方向,即取或不取。第二部分是针对所预测的方向预测分支的目标地址。
ILD 240提供了预解码阶段。ILD 240将来自IFU 220的原始字节流分离成有效指令序列,并将它们传递到IQ 250。例如,如上所述,x86指令的长度可以在1B到15B之间不等,并且可以驻留在程序存储器中的任何字节地址中,因此,需要将原始字节流分离成可变长度的指令。在每个周期解码几个指令的长度增加了复杂性级别,因为必须推测性地确定起始地址。也就是说,在对第一指令进行解码并计算其长度之前,不知道第二指令的起始地址这一事实带来了长度解码过程的串行化,并且将其并行化需要在对其解码之前确定每条指令的长度。ILD 240提供了基于许多并行和推测计算的复杂逻辑,以帮助实现这种并行化(尽管这是以增加功耗为代价的)。注意,RISC处理器可以不采用ILD 240,因为指令的长度是固定的,因此指令将在固定的存储器边界开始。
IQ 250对指令解码阶段的指令进行排队。在ILD 240从原始字节流分离指令之后,IQ 250将指令进行排队,以供ID 260在指令解码阶段使用。
ID 260提供指令解码阶段(其也可以被称为动态翻译阶段)。在该阶段中,从IQ205读取指令,并将其翻译成后续的功能等效的UOP。该翻译由一组解码器261中的几个解码器之一执行,该组解码器261包括复杂解码器261-C和三个简单解码器261-S1至261-S3(尽管将理解,可以使用更少或更多的指令解码器)。包括该组解码器261的ID 260也可以被称为微指令翻译引擎(MITE)。由此产生的UOP由ID 260传递到IDQ 280,然后UOP可以通过IDQ280进入处理器的后端。例如,在基于x86的处理器中,简单指令可以翻译为1-4个UOP,而复杂指令可以翻译为5个或更多个UOP。将理解,对于基于其他ISA的处理器而言,指令可以被翻译成其他数量的UOP。
总体而言,UC 270是UOP缓存,其被配置为缓存先前由MITE解码的指令的UOP,从而消除MITE重新解码先前由MITE解码的指令以获得相关联的UOP的需要(即,避免L1-IC->IFU->ILD->MITE解码路径)。这种类型的缓存可以被称为L0指令缓存(L0-IC),其可以以UC行为单位存储被解码成UOP的指令块。UOP缓存受益于程序中控制流的临时局部性,因此先前执行的指令会被再次执行。在从L1-IC 210获取指令地址之前,首先在L0-IC中查找该指令地址。如果相应的UC行存在于L0-IC中(意味着命中),则相关联的UOP被直接提供给IDQ280以供进一步执行,从而完全避免了L1-IC->IFU->ILD->MITE解码路径。如果相应的UC行不存在于L0-IC中(意味着未命中),则指令将通过L1-IC->IFU->ILD->MITE解码路径完成整个复杂解码周期。以这种方式避免L1-IC->IFU->ILD->MITE解码路径的能力提供了显著的优点,因为从指令到UOP(尤其对于高性能处理器)的解码过程在电路、功耗和时间方面可能是开销大的,尤其是在单个复杂指令可能执行若干操作的情况下。将理解,由于超标量处理器的后端可以在每个时钟周期执行几个UOP(例如,每个周期6个UOP),因此从处理器的前端向处理器的后端提供UOP的速率是可以通过UC 270中的高命中率实现的性能的关键要素。UC 270可以使用单个UC在前端200内实现(例如,其实施例参照图3-16呈现),或者可以在前端200内实现为包括多个UC集合的分割可编程UC(SP-UC)(例如,其实施例参照图17-31呈现)。
IDQ 280对要提供给处理器后端的UOP进行排队。由IDQ 280排队的UOP可以包括由ID 260(MITE)解码的UOP和从UC 270传递的UOP。
如上所述,前端200被配置为支持前端200的各种资源类型的分割可编程性,包括UC 270的UC资源。将理解,通过首先考虑使用单个UC的前端200的操作(例如,如参照图3-16所呈现的),可以进一步理解使用UC资源的分割可编程性的前端200的操作(例如,如参照图17-31所呈现的)。
图3描绘了能够支持分割可编程性并操作单个微操作缓存的处理器前端的示例实施例。
图3的前端300包括L1-IC 310、IFU 320、BPU 330、ILD 340、IQ 350、ID 360、UC370(其是单个UC,因此不是分割可编程的)和IDQ 380。将理解,总体而言,除非另有指示,否则图3的前端300的组件的操作可以分别与图2的前端200的相应组件的操作类似。
如上所述,前端300被配置为支持前端200的各种资源类型的分割可编程性,但是仅支持单个UC(说明性地,UC 370)。将理解,通过首先考虑L1-IC 310的操作(如参照图4-5所呈现的),单个UC 370的操作(如参照图6-12所呈现的),以及基于如参照图4-5所呈现的L1-IC 310的操作和如参照图6-12所呈现的单个UC 370的操作的处理器的使用来支持程序的执行(如参照图13-16所呈现的),可以进一步理解使用UC资源的分割可编程性的前端300的操作(例如,如参照图17-31所呈现的)。
如本文参照图4和图5进一步讨论的,处理器前端的L1-IC(例如,图3的前端300的L1-IC 310)的微架构可能对UC(例如,图3的前端300的UC 370)的设计考虑具有部分含义。
总体而言,存储程序指令的缓存被称为指令缓存(IC),指令存储器中的地址被称为指令指针(IP)。IC以“IC行”为单位存储来自指令存储器的原始字节块。将理解,指令在进入IC时尚未被解码,因此一般而言IC不理解指令。还将理解,由于指令可以在任何字节位置开始,因此指令可以部分地存储在IC行中,因此也可以溢出到另一IC行中。在IC中,IC行由其IP标识,该IP是所存储的块中第一个字节的IP。图4中描绘了IC的逻辑组织,并且图5中描绘了IC的IP划分。
如图4所示,IC 400包括两个主要构建块:标签阵列410和数据阵列420。数据阵列420存储IC行,而标签阵列410用于将IP匹配到数据阵列条目中。数据阵列420在逻辑上被组织为S个集合的组,其中每个集合包括N个IC行。集合中IC行的数量被称为IC的“关联度”。还可以说关联性N的缓存是N路关联缓存,其中每一路为IC行。块首先通过其IP映射到集合Si中,然后被放置到集合Si中的任意IC行Nj中。为了将块映射到IC 400中,如图5所示,IP被划分为三个字段。
如图5所示,IP 500被划分为IP标签(IP-Tag)字段510、IP索引(IP-Index)字段520和IP偏移(IP-Offset)字段530。IP 500的K个最低有效位用于标识要访问IC行内部的哪些字节。地址的这一部分称为块偏移量。假设IC行的大小为Q字节,则偏移字段中K=log2(Q)比特。如图4所示,本文将这K个比特表示为IP偏移(由IP偏移字段530指示)。IP 500的下一部分称为索引。如名称所示,该索引用于标识IC中的集合Si。对于由S个集合组成的IC,在索引字段中使用M=log2(S)比特。如图5所示,本文将这M个比特表示为IP索引(由IP索引字段520指示)。IP 500的剩余比特是标签字段。如图5所示,本文将这M个比特表示为IP标签(由IP标签字段510指示)。
现在参照图4和图5,注意,由于不同的IC行可以映射到IC 400中的相同集合Si(由于重叠的M比特,因此它们具有相同的IP索引),所以可以使用一种机制来将IP索引反向映射到IP。标签阵列410用于此目的。标签阵列410具有与数据阵列420相同的逻辑组织(相同数量的集合S和关联性N)。对于数据阵列420中的每个IC行,标签阵列410中的相应位置保存一些元数据:IP标签位和IC行的状态(有效,等等)。
再次参照图4和图5,可以如下执行IC 400中的IP 500的查找。为了查找IP,使用IP索引部分访问数据阵列420和标签阵列410两者中的集合Si;然而,为了知道集合内的IC行是否对应于给定IP,IP标签位一般需要与标签阵列410中的集合Si中的条目相匹配。如果集合Si中的第j个条目的IP标签位匹配,则正确的数据在集合Si中的相应数据阵列420的第j个IC行中(这被称为缓存命中)。如果集合Si中没有IP标签在标签阵列410中匹配,则所请求的IC行不驻留在L1-IC中(这是缓存未命中)。在这种缓存未命中的情况下,向存储器层级结构的更高级别发出请求,并且需要等待IC行被安装在L1-IC中,然后才能进行访问。参照以下示例可以进一步理解这一点。即,考虑具有64个集合且缓存行大小为64B的8路关联缓存。然后,每个缓存行将保存64B的指令块。这里,K=6且M=6。如果处理器尝试访问IP 0xf045处的指令(标签=0x1e,索引=0x1,偏移=0x5),则它在集合1中查找带有标签0x1e的缓存行。如果找到IC行,则检索IC行中的第五个字节。
如图5所示,对标签阵列410和数据阵列420的访问可以串行或并行进行。在图5中,在访问标签阵列410的同时从数据阵列420读取整个集合。将该地址与IP标签条目进行比较,以找出该集合的哪个IC行中驻留有正在执行搜索的数据。该信息被馈送到数据阵列420的输出处的复用器(路复用器),该复用器选择该集合的IC行之一。最后,地址的偏移部分用于从选定的IC行提取适当的字节(此过程称为数据对齐)。IP偏移字段中的位数确定IC行的大小,即,IC行的大小是log2(IP偏移字段中的位数)。基于IP索引选择IC中的集合,并且利用IP标签来标记集合内的IC行(即,集合中的路)。在图5中,IP偏移为4比特,IP索引为4比特,并且IP标签为8比特,因此,对于示例性IC行,IP标签=0xFF且IP索引=0x0。因此,IC行在集合0中被标记有0xFF。显然,IC行内的所有指令共享相同的IP标签和IP索引。这也意味着IC行内的所有基本块的地址(即不包括控制指令的指令序列-这将在后面详细解释)共享相同的IP标签和IP索引。当P个频繁访问的IC行映射到同一集合Si并且缓存关联性N为<P时,IC 400遭受冲突未命中。在这种情况下,集合Si中的有效IC行之一被逐出以容纳较新的IC行。将理解,(1)关联性越高,IC 400将遭受的冲突未命中越少,以及(2)另一方面,IC 400具有的路越多,路复用器变得越大,并且这可能影响处理器的周期时间。注意,某些L1-IC可以被组织成每条IC行64集合×8路×64B,从而总计32KB的指令的最大容量(尽管将理解,可以使用其他布置,可以支持其他容量,等等)。
如本文参照图6-12进一步讨论的,通过首先考虑仅使用单个UC的前端的操作和这种UC(例如,图3的UC 370)的相关联的微架构,可以进一步理解UC资源的分割可编程性(例如,如参照图17-31所呈现的)。
再次参照图2和图3,将理解,图2的前端200和图3的前端300被配置为支持支持从UC获取UOP的流操作模式,如本文在下面进一步讨论的图6-9中所呈现的。
图6描绘了采用N路关联缓存的微操作缓存的示例实施例。
在图6中,UC 600包括UC标签阵列610和UC数据阵列620。UC标签阵列610中的集合由N路UC-标签组成。UC数据阵列620中的集合由N路UC行组成。UC标签由存储在相应UC行中的第一条指令的元组{IP标签,IP偏移}和辅助数据组成。在图6中,这些在UC标签条目中被标记为“tag”(标签)、“off”(偏移)和“aux”(辅助数据)。UC 600的输入是IP,即正在对其执行UC行搜索的IP,并且如果命中,则输出为该UC行。
在图6的UC 600中,UC标签阵列610和UC数据阵列620被串行访问。UC查找可以在第一周期中执行UC标签查找。即使UC标签匹配记录命中,UC数据获取也可能被延迟到较晚的时钟周期。这种UC设计确保了UC数据仅从导致UC标签匹配的一条路读取;UC数据阵列中的其他路将被完全禁用。通过禁止非匹配路输出数据,实现了进一步的节能。如图6所示,通过使用延迟元件来实现访问UC-标签阵列610和UC数据阵列620的串行化。延迟元件可以是单周期延迟元件或多周期延迟元件(例如,提供延迟路径的级联锁存器系列)。根据要使用延迟元件的应用,可以将延迟元件调整为更长或更短的延迟。为简单起见,本文将UC 500呈现为在UC标签阵列610和UC数据阵列620之间的访问路径上采用单周期延迟元件(这意味着UC查找需要两个周期);然而,将理解,可以在UC标签阵列610与UC数据阵列620之间的访问路径上使用多周期延迟元件。在图6中,为了简单起见,仅针对路0扩展逻辑和互连。将理解,类似的逻辑也适用于其他路(即,路1到路N-1)。
在图6的UC 600中,UC查找可以在第一周期中执行UC标签查找,并且如果在第一周期中存在命中,则可以在第二周期中执行UC数据获取。如下面进一步讨论的,通过考虑UC600的示例实施例结合被配置为以流模式操作的处理器前端的IC,可以进一步理解这些操作,如图7所示。将理解,图7可以被认为是图6的扩展视图,其中前端中的相关组件和UC被抽象出来。更具体地,图7的前端700示出了在UC 600处的UC查找的第一周期(例如,处理来自UC 600的命中/未命中输出等)和第二周期(例如,处理UC数据输出等)的上下文中执行的具体功能。
在图6的UC 600中,UC中的每个集合包含多个UC行(作为路的数量,即,路0…路N-1),并且每条UC行包含固定数量的UOP槽。一些槽包含活动UOP,而其他槽可能保持为空。图8中呈现了被配置为用于UC 600中的UC行的结构的示例实施例,该UC行具有被配置为存储UOP的四个UOP槽。图8的UC行800示出了最多四个连续的UOP可以被存储在UC行800中。作为示例,如果UOP的大小是4B,则UC行的大小是32B,因此,从UC命中获取的带宽是每个时钟周期4个UOP。
在图6的UC 600中,UC 600存储被预解码为UOP的指令的“基本块”。“基本块”是在某个程序控制流期间由处理器获取的IC行内的指令序列。当控制指令(诸如条件分支或无条件分支)改变执行序列时,基本块终止。本文中,术语基本块有时指的是IC行中的基本指令块,有时指的是源自这样的指令序列的UOP序列。意图将从上下文中清晰可见。图9中呈现了基本块的结构的示例实施例,其位于可以根据块的第一条指令的IP映射到UC 600中的IC行内。为了清楚起见,IC行900的大小被描绘为16B;然而,将理解,IC行可以更小或更大(例如,64B或更大)。在图9中,IC行900包含存储器地址范围0xFF00-0xFF0F中的指令。这里,假设在某个程序控制流程中,获取单元跳转到地址0xFF03,并分别获取长度为2B、3B、1B、2B的指令I1、I2、I3、I4。注意,I4是条件分支指令(JE=等于时跳转),并假设分支预测器(BPU)预测I4之后跳转。然后,在获取I4之后,获取单元跳转到由I4指示的目标存储器地址。在这种情况下,包含指令I1-I4的存储器地址范围0xFF03-0xFF0A构成基本块,该基本块被解码并存储在UC中。根据块中第一条指令的IP(即图9中的0xFF03)将基本块映射到UC中。UC使用相同的IP的三部分结构(例如,如用于图5中的IC)来存储基本块。从基本块产生的UOP可以跨越一条或多条UC行,取决于由此产生的UOP数量。使用存储在UC行中的第一条指令的IP来完成对UC的访问。基本块的UC中的集合是基于IP索引选择的,因此基本块的所有UC行存储在同一集合内的不同路中。这样的UC行将承载相同的IP标签,因此,为了区分UC行,UC行中的第一条指令的IP偏移也被存储为UC行的标签。在这方面,UC中的标签是元组{IP标签,IP偏移},它与IC中的标签(其仅存储IP标签)略有不同。该标签存储在UC标签阵列中的相应条目中。此外,每条UC行存储辅助数据,该辅助数据包含存储在UC行中的有效UOP的数量以及发起UC行中的UOP的ISA指令的总长度。此辅助数据与UC标签阵列一起存储,并在UC查找期间被访问。
再次参照图6和图7,IP的查找可以如下执行(其中图6和图7内标记了沿信号流的各种输入和输出)。
IP的查找可以由在一个或两个周期中执行的各种步骤组成。在第一周期(其可以表示为周期1)中,执行UC标签查找(如在下面的步骤1-8中所讨论的),执行针对UC的下一IP的计算(如在下面的步骤9-11中所讨论的),并且执行L1-IC查找(如在下面的步骤12中所讨论的)。在仅在第一周期中UC标签阵列中存在命中的情况下才执行的第二周期(其可以被表示为周期2)中,执行UC数据获取(如在下面的步骤13-17中所讨论的),并且执行下一UC标签查找(如在下面的步骤18-19中所讨论的)。将理解,这些步骤描述了跨图6的UC 600的信号流。
在IP查找的周期1中,可以如下执行UC标签查找(如下面的步骤1-8中所讨论的):
1.来自输入IP的IP索引(A)被发送到UC标签阵列(A.1)中的地址解码器。
2.UC标签阵列中的地址解码器选择/激活由IP索引所索引的集合。结果,该集合中的每条路均发送出其所存储的{标签,偏移,辅助数据}(B)。
3.对于UC标签阵列中的每条路,以下操作被执行。
3.1.首先将“标签”(C.2)与输入IP标签(C.1)相比较。如果匹配,则结果为1,否则为0。
3.2.来自步骤3.1的输出被馈送到两个三态逻辑门的选择器(C.3),这两个三态逻辑门分别控制来自IP偏移和“off”的输入。如果选择器的输入为1,则三态逻辑门将允许将其输入切换为输出,否则它会阻塞输出。因此,如果在步骤3.1中IP标签与“tag”不匹配,那么选择器将分别阻止IP偏移和“off”的进一步输出,否则将允许这些输出。
3.3.比较来自三态门的IP偏移和“off”输出(C.4)。如果匹配,则结果(C.6)为1,否则结果为0。
3.4.将“aux”发送到N路复用器(C.5)。
3.5.来自每条路的步骤3.3的结果(C.6)被发送到以下:
3.5.1.作为从UC(D)产生最终命中/未命中输出的或(OR)门的输入(C.6.1)。
3.5.2.作为延迟元件2(C.6.2)的输入。在下一周期中,如果该路为命中,则延迟元件2产生所需的信号以从UC数据阵列检索该路。
3.5.3.作为到N路复用器(在步骤3.4中提到的)的选择器(C.6.3),如果此路为命中,则选择器选择“aux”输入(C.5)。
4.将来自每个路的信号C.6.1逻辑或(OR)在一起,以生成来自UC的最终命中/未命中输出(D)。如果存在命中,则至少一条路将信号C.6.1作为1发送。
5.基于来自每条路的选择器输入C.6.3,N路复用器将选择一个“aux”路(C.5)作为输出。如果存在命中,则至少一条路将在C.6.3中将输入作为1发送,并且路复用器将选择相应的“aux”行作为输出(F)。
6.来自输入IP的IP索引(A)也被发送到三态逻辑门(A.2)。在该周期结束时,来自UC的命中/未命中输出(D)作为选择器输入(D.1)馈送到该三态逻辑门。因此,如果在该周期中存在命中,则三态逻辑门允许IP索引作为延迟元件1的输入。在下一周期中,延迟元件-1将IP索引发送到UC-数据阵列中的地址解码器。
7.来自UC的命中/未命中输出(D)被发送到IFU(D.1)、ILD(D.2)、IQ(D.3)和MITE(D.4),如果存在命中,则其禁用相应的单元。该步骤如图7所示。
8.来自UC的命中/未命中输出(D)被发送到延迟元件(D.5)。在下一周期中,此行充当2到1复用器的选择器输入,该复用器在解码路径和UC之间进行选择,以将UOP发送到IDQ。该步骤如图7所示。
在IP查找的周期-1中,可以如下执行针对SP-UC的下一-IP的计算(如下面的步骤9-11中所讨论的):
9.IP也被并行地作为输入(G.1)发送到分支预测器(BPU),以检查如果该IP在UC中为命中,则执行序列是否要在该IP之后分支,即,针对该IP的UC行包含被预测要采取的控制/分支指令。在该周期结束时,BPU生成两个信号-命中/未命中(H),如果命中则生成1,如果未命中则生成0,并且如果命中则生成下一IP(I.1)。该步骤如图7所示。
10.如果BPU未命中,则IP还被并行地作为输入(G.2)发送到加法器以计算下一IP。在这种情况下,下一IP将是序列中下一UC行的IP。在该周期结束时,如果对于当前IP,UC为命中,则来自“aux”输出(F)的ByteLen(字节长度)被作为另一输入(F.1)馈送到加法器。然后,加法器生成要在UC中查找的下一IP(I.2)。该步骤如图7所示。
11.信号I.1和I.2是到2到1复用器的输入,其中具有来自BPU的命中/未命中线路的选择器输入(H)。如果BPU指示命中,则生成I.1(即,来自分支的下一IP)作为来自复用器的输出(I),否则生成I.2(即,序列中的下一IP)作为输出(I)。该步骤如图6所示。
在IP查找的周期-1中,可以如下执行L1-IC查找(如下面的步骤12中所讨论的):
12.IP还被并行发送到L1-IC(G.3),用于查找从该IP开始的指令,使得如果在UC-标签阵列中的查找导致未命中,则指令从L1-IC馈送。该步骤如图7所示。
在IP查找的周期-2中,可以如下执行UC-数据获取(如下面的步骤13-17中所讨论的):
13.延迟元件-1将IP索引发送到UC-数据阵列中的地址解码器(A.3)。地址解码器选择由IP索引映射的UC-数据阵列中的集合(S)。
14.每条路上的延迟元件-2(C.6.2)将输入发送到:
14.1.UC-数据阵列中相应的路径行(W)。
14.2.作为到N路复用器的选择器,复用器基于该选择器从UC-数据阵列中选择UC-数据行。
15.在步骤14.1中,只有命中的路才会将W作为1发送。这将仅激活UC-数据阵列中的该路。因此,从步骤10-11开始,UC-数据阵列将仅从集合S中命中的路发送出UC-数据(J)。
16.在步骤14.2中,只有命中的路才会将选择器作为1发送。因此,N路复用器输出来自步骤12的UC-数据作为来自UC的最终输出(E)。
17.从步骤16输出的UC-数据(E)作为输入(E.1)被发送到在UC和解码路径之间进行选择的2到1复用器。由于存在命中,因此到复用器的选择器(D.6)设置为1,其将UC-数据输出到IDQ。该步骤如图7所示。
在IP查找的周期-2中,可以如下执行下一UC-标签查找(如下面的步骤18-19中所讨论的):
18.由于在前一周期中UC-标签查找中存在命中,因此到IP的‘enable’行输入(en)被置位,其利用从步骤11接收的输入(I)更新IP。该步骤如图7所示。
19.针对新IP重复步骤1-12。
将理解,为了清楚地描述示例实施例,提供了前述步骤的编号,其不一定暗示执行步骤的顺序(例如,可以以不同的顺序执行至少一些步骤,可以同时执行至少一些步骤等,以及它们的各种组合)。
将理解,IP的查找可以由在各种其他周期中执行的各种其他步骤组成。
再次参照图2和图3,将理解,图2的前端200和图3的前端300被配置为支持构建-操作模式,其支持通过路径L1-IC->IFU->ILD->IQ->MITE获取和解码指令,并将它们并行存储到UC以提供给IDQ,如本文在下面进一步讨论的图10-12中所呈现的。
将理解,当在流-模式和构建-模式之间移动时,模式切换发生在前端(例如,图2的前端200或图3的前端300)。例如,当前端处于流-模式且UC-标记查找导致未命中时,前端将切换到构建-模式。
再次参照图6,在图6的UC 600中,UC查找可以在第一周期中执行UC-标签查找,并且如果在第一周期中存在未命中,则可以通过路径L1-IC->IFU->ILD->IQ->MITE执行指令的获取和解码,并将它们并行存储到UC以提供给IDQ。如下面进一步讨论的,通过考虑UC600的示例实施例结合被配置为在构建-模式下操作的处理器前端的IC,可以进一步理解这些操作,如图10所示。将理解,图10可以被认为是图6的一般化视图,其仅示出了在构建-模式中使用的组件和信号流。更具体地,图10的前端1000示出了由块构建器执行的具体功能,该块构建器被配置为观察来自MITE的解码后的UOP输出并构建用于存储在UC中的UC行。以这种方式,如果程序的控制流返回到导致UC未命中的IP,则该IP将改为导致命中。该过程,其可以是单周期或多周期过程,包括下文描述的以下步骤(将理解,其描述了跨图10的前端的信号流)。
1.当从MITE解码后的UOP被提供给后端时(K.1),UOP也被并行地发送到块构建器中的UC填充缓冲器(K.2)。
2.在块构建器中,来自连续指令的UOP被打包在一起以填充UC行。在UC行被构建(L)之后,其准备好被存储在UC中。
3.将UC行的{IP,ByteLen}发送到IP更新逻辑(L.1)。IP更新逻辑读取IP寄存器(M)以检查UC行的IP(L.1)是否与来自M的IP相同,来自M的IP是较早在UC中未命中的IP。如果不相同,则会丢弃该UC行。
4.该UE行现在被存储在UC中(L.2)。
5.当UC行被并行地存储在UC中(L.2)的同时,IP更新逻辑发送UC行的Byte Len(字节长度)(N)以计算序列中的下一IP。信号N作为输入发送到2到1复用器,该复用器从来自UC的“aux”输出(F)的Byte Len取另一输入。复用器的选择器是来自UC的命中/未命中(D)输出。在构建-模式下,D发送未命中,因此复用器连接来自M的信号作为输出(F.1)。
6.用于更新下一IP的信号流的剩余部分(使用BPU和信号F.1)与针对流-模式的描述相同。
将理解,为了清楚地描述示例实施例,提供了前述步骤的编号,其不一定暗示执行步骤的顺序(例如,可以以不同的顺序执行至少一些步骤,可以同时执行至少一些步骤等,以及它们的各种组合)。
注意,在构建-模式下,通过L1-IC->IFU->ILD->IQ->MITE的五个流水线阶段在电路和处理方面开销非常大,并且花费的周期时间至少是流-模式的6倍。因此,UC中的未命中会增加完成指令执行所需的周期数量。前端中的这五个流水线阶段极度耗电,并且消耗了大约28%的处理器功率。例如,如果UC行由6个UOP槽组成,并且如果UC命中,则UC可以向后端提供6个UOP/周期;然而,如果UC未命中,则构建模式可以提供不超过4个UOP/周期,这将减少对后端的UOP供应至少33%。
图11描绘了UC行的结构的示例实施例,其中UOP槽被配置为存储UOP,其被配置用于图10的微操作缓存中。更具体地,图11描绘了IC行到UC行的映射1100的示例,其将基本块从IC行(例如,如图8所呈现的IC行)映射到UC行。在本示例中,UC行被描述为由4个UOP槽组成。
在图11的示例中,来自同一IC行的具有可变指令长度的五条不同指令被翻译成UOP。由此产生的UOP被存储在对应于IP索引的UC集合中的几条UC行中。每条指令及其UOP用相同的灰度级颜色标记。
在图11的示例中,在同一IC行中存在两个基本块:(1)由指令I1-I4(I4是JE,条件分支指令)组成的BB_1和(2)由单个RET指令组成的BB_2。BB_1跨越被标记为UCL1和UCL2的两条UC行。UCL1的最后一个UOP槽保持为空,因为下一序列指令(I3)需要3个UOP,并且不能完全容纳在第一行中。结束基本块的最后一行(UCL3)只有3个UOP,留下最后一个UOP槽为空。
如图11的示例所示,UC行并不总是被充分利用。在基本块的最后一个UC行中可能存在几个空槽。此外,强制同一指令的所有UOP共享同一UC行的策略也可能在其他UC行(例如,示例中的UCL1)中留下空的UOP槽。此外,UC可能遭受某种级别的重复(例如,当控制流导致已经在UC中的指令,但不是作为其UC行中的第一条指令时,可能会发生这种情况)。在任何情况下,这种UC设计方法试图(1)将基本指令块映射到具有最大行利用率的UC行,以及(2)在每行中存储足够的UOP以确保足够的带宽。这些目标可能相互冲突,因为直觉上,目标(1)将推动更短的行,而目标(2)将推动更长的行。
如图6的示例所示,当P个频繁访问的缓存块映射到同一缓存集合并且缓存关联性N<P时,UC(与图4的IC一样)可能遭受冲突未命中。在这种情况下,有效UC行之一被逐出以容纳较新的基本块。在这方面,将理解,UC中集合的关联性越高,UC行将遭受的冲突未命中越少。另一方面,集合具有的路越多,路复用器变得越大,这可能会影响处理器的周期时间。
图12描绘了L1-IC和UC在IP内的字段上的差异的示例实施例,其中IP是来自L1-IC的基本块的第一条指令,其被映射到图10的UC。更具体地,图12的IP 1200示出了L1-C的集合的数量可以是单个UC中集合数量的两倍,因此UC从IP索引中打折一位以选择UC中的相应集合,并且还将折扣的位溢出到IP标签中。
如本文参照图13-16进一步讨论的,UC资源的分割可编程性(例如,如参照图17-31所呈现的)可以通过首先考虑处理器的使用来进一步理解,其基于如参照图4-5所呈现的L1-IC 310的操作和仅使用单个UC的前端的操作以及如参照图6-12所呈现的这种UC(例如,图3的UC 370)的相关联的微架构,以支持程序的执行(如参照图13-16所呈现的)。
总体而言,存在程序的两个结构组件:(1)子例程和(2)分支,它们更改其指令的执行序列。子例程是执行特定任务的程序指令序列,其被打包为单元。然后,这个单元可以用于任何应执行该任务的程序中。子例程的行为方式与用作较大程序或另一子程序中的一个步骤的程序大致相同。注意,当在诸如x86的特定处理器架构的上下文内描述这些组件时,可以更好地理解这些组件。在程序的一次执行期间,子例程可以被调用(例如,通过x86中的调用(CALL)指令)多次并且从几个位置被调用,包括从其他子例程调用,然后一旦该子例程正在执行的任务完成,则其分支回(例如,通过x86中的RET指令)到CALL之后的下一条指令。子例程使用调用栈,调用栈是存储器中存储有关计算机程序的活动子例程的信息的栈数据结构。在x86中,每个CALL指令均将栈帧推送到调用栈上。栈帧有多种用途,诸如将参数传递给子例程、子例程使用的局部变量等等,但它的主要目的是追踪每个活动子例程在其执行RET时应将控制返回到的点。为此,CALL指令后面的地址(返回地址)与每个CALL一起推入栈帧中。因此,RET指令读取保存在调用栈中的最新栈帧中的返回地址,弹出栈帧,并将控制转移到该地址。注意,控制到返回地址的转移一般发生在前端中的指令获取期间,这发生在后端执行RET指令之前,即从存储器中的栈帧读取返回地址时。因此,针对调用栈的返回地址常常预留在处理器的寄存器中,称为“返回地址栈”(RAS)。一些处理器还将RET指令的地址保持在BPU(分支预测器)中,并将它们各自的返回地址作为预测目标。为简单起见,术语RAS在本文可以用来指用于前端将控制转移到返回地址的任何硬件辅助方法。图13中呈现了这类程序的示例。
图13描绘了用于示出程序的结构组件(诸如子例程和分支)的程序的示例实施例。
程序1300是要由处理器执行的程序。如上所述,程序1300包括结构组件子例程和分支。
处理器顺序地执行MAIN(主程序)中的指令,直到指令CALL sub1。CALL指令通过将控制传递给与CALL一起指定的子例程(其在图13中为sub1)来中断MAIN的流。然后执行sub1中的指令。在执行sub1的同时,它还在指令CALL sub2中调用子例程sub2。这是嵌套子例程调用的示例,即MAIN->sub1->sub2。最终,在sub1中的指令完成后,处理器执行RET指令,以在CALL sub1之后返回到MAIN中的下一条指令。
在程序(例如,MAIN)或子例程(例如,Sub1或Sub2)内,指令的顺序执行可以被分支指令中断。分支可能导致处理器开始执行当前子例程内的不同指令序列,从而偏离其顺序执行指令的默认行为。分支指令可以是或者(1)条件分支(例如,x86中的JE/Jump-if-Equity(如果相等则跳转)指令),其根据条件是真还是假而可能或可能不导致分支,或者(2)将导致分支的无条件分支(例如,x86中的JUMP(跳转))。在图13中,在MAIN程序中,JE j1是条件分支指令。JE j1条件性地将执行切换到从标签j1开始的代码序列。本示例中使用的标签是特定代码序列的第一条指令的存储器地址的助记符。在执行j1中的序列之后,它使用无条件JUMP指令以合并回调用JE j1的原始指令序列中的某个点m1。当执行j1的指令序列的同时,它遇到另一条件分支指令JE j2。同样的过程适用于JE j2,其条件性地将执行切换到从标签j2开始的代码序列。这是嵌套分支的示例。类似地,条件分支JE j3被包括在子例程sub1内。
将理解,为了清楚地描述其中处理器被配置为支持程序指令的执行的各种实施例,本文可以使用以下术语。切换或中断指令的顺序执行的指令在本文中被称为“控制指令”(例如,在x86中,诸如图13的示例中,诸如CALL、RET、JE、JUMP等指令是控制指令)。控制指令的目标指令序列在本文中被称为“控制块”(例如,在x86中,诸如图13的示例中,sub1、sub2、j1、m1、j2、m2、j3、m3是控制块),因此,程序中指令的执行顺序是控制块的特定链,其中控制块可以包括嵌套的控制块。程序中控制块的执行顺序在本文中被称为“控制流”(即,控制的流),并且将理解,条件分支(例如,在x86中,诸如图13的示例中,为JE)可以在程序中生成多个控制流。由于每个这样的分支都是分叉,因此基于分叉的条件,执行可以在分叉上走任一条路。术语“工作集合”用于表示程序中跨“某一控制流集合”的控制块的集合。注意,从L1-IC或UC的角度来看,工作集合是工作集合中的相应缓存行。通过参照图14,可以进一步理解工作集合。
图14描绘了程序存储器的示例实施例,其被实现为存储器中的二维区域,该二维区域被划分为特定缓存的缓存行的单元,用于示出用于程序的特定控制流集合的缓存行的工作集合。在图14的程序存储器1400中,用于程序中的特定控制流集合的工作集合用“W”来标记。在这些控制流的执行期间,只有标记后的缓存行被带入缓存中,其余的缓存行不被访问。如果程序没有控制流(这通常非常少见),则程序的大小等于工作集合的大小。
因此,跨越控制流,处理器从程序存储器中的任意地址开始在控制块之间跳转,这对命中率L1-IC和UC有影响。L1-IC和UC上的命中率影响程序的性能和功率效率。这些缓存中的命中率受以下三种类型的未命中的影响,这些未命中可能发生在集合关联缓存微架构(例如,诸如图4所呈现的集合关联缓存微架构)中:(1)强制未命中、(2)容量未命中和(3)冲突未命中,下面将进一步讨论每一种未命中。
强制未命中是第一次访问缓存行时的未命中,因为缓存行一般需要被带入缓存中。这也被称为冷启动未命中或首次参考未命中。强制未命中是不可避免的,由于这是一次未命中,因此其不会影响程序的持续性能。
当竞争一集合的缓存行的数量P大于该集合中的路的数量N时,发生冲突未命中。这意味着P个缓存行承载相同的IP索引值,该值用于映射到指定的集合。因此,为了容纳新的缓存行,可以从该集合中逐出一个或多个现有的缓存行。本文可以使用术语“颠簸(thrashing)”来表示由于集合中的冲突而对缓存行的逐出。
当因为缓存不能包含程序所需的所有缓存行而从缓存中逐出缓存行时(例如,在程序的大小远远大于缓存的总容量的情况下),就会发生容量未命中。为了消除集合关联缓存中的容量未命中,程序的大小一般需要小于或等于缓存的大小。这也意味着,如果工作集合的大小小于程序的大小(例如,如图14的示例中所示),则缓存未得到充分利用,这是最不可能的情况(因为使程序没有控制流是非常罕见的)。注意,在这种情况下,也没有冲突未命中。
如果程序的大小大于缓存的容量,则在命中容量未命中之前,它更有可能由于其控制流而命中冲突未命中,因为控制流增加了P个控制块共享同一IP索引的概率。因此,在集合关联缓存中,工作集合的命中率主要由冲突未命中率驱动。
总体而言,存在两个类别的超高性能程序(应用),其一般经历在L1-C中没有冲突未命中或在L1-C中可容忍的冲突未命中。由这些程序访问的数据适合L1-DC(即L1-数据缓存),因为数据被有效打包,因此L1-DC中不会出现容量或冲突未命中。因此,这些程序的性能一般取决于小得多的UC的峰值性能。这两类程序被定义如下:(1)A类程序是完全适合L1-IC的程序,使得L1-IC中没有容量或冲突未命中,但大于UC的容量;以及(2)B类程序是大于L1-C并因此在L1-C中经历冲突未命中的程序。
这些高性能程序的性能取决于来自UC的最大部分工作集合的持续提供(例如,理想UC利用率%=(((UC容量)/(工作集合大小))x 100)%。然而,更实际的是,由于UC中其控制流引发的冲突未命中,因此有效UC利用率远低于理想UC利用率。例如,如果工作集合的大小等于UC的容量,则理想UC利用率应为100%,但在冲突未命中的最糟情况下,有效利用率为20%。关于单个UC微架构中冲突未命中严重程度的证明可以理解如下。UC的大小一般比L1-IC小得多,以实现最小的访问时延和更低的功耗。例如,UC可以被组织为每条UC行32集合×8路×6个UOP,总计1536个UOP的最大容量,其中每个UOP的大小是4B(即,UC的总大小是6KB)。例如,L1-IC可以被组织为每条IC行64集合x 8路x 64B,总计最大指令容量为32KB。在该示例中,尽管L1-IC和UC二者的每个集合具有相同数量的路,但L1-IC的集合数量是UC的两倍。因此,每次在IC行中穿过32B边界时,将启动新的UC行,即每1/2条IC行至少使用1个新UC行。此外,在图7中呈现的IC-到-UC映射示例中,来自IC行的9B的指令被映射到3个UC行,其中每个UC行最多容纳4个UOP。因此,在该示例中,对于容纳容量高达6个UOP的UC行,9B的指令将使用2.5个UC行。此外,可以推断IC行上的32B的对准块将映射到2.5×32/9=8.88~8个UC行,即几乎UC中的整个集合。因此,64B大小的IC行将映射到16个UC行,因此,在该示例中,UC具有比L1-IC中高16倍的冲突未命中概率。
如上所述,可以在各种上下文内使用A类或B类的超高性能应用。例如,A类或B类的一个这样的超高性能应用是由实现网络功能虚拟化(NFV)路由器的转发平面的处理器进行的网络分组处理。NFV路由器功能可以在诸如x86的通用CISC服务器处理器中实现。这种网络分组处理程序的简化结构如在图15中呈现。
图15描绘了被配置为由处理器执行的网络分组处理程序的简化结构的示例实施例。
网络分组处理程序1500(本文被称为NET_PROC程序)可以由用于支持分组处理的处理器来执行。处理器对每个传入分组重复执行NET_PROC程序。NET_PROC程序在输入端口上接收传入分组,处理该分组,然后在输出端口上将该分组发送出去。在NET_PROC内,分组由子例程链处理,子例程链包括与分组入口(被表示为ING 1510)和分组出口(被表示为EGR1520)相关联的两个顶级子例程。
ING 1510子例程可以被配置为执行分组传入功能,诸如分组的解封装、基于分组上的各种报头对分组进行分类、基于分组的分类来确定下一跳转发上下文、执行与相应转发上下文相关联的转发表查找以及针对EGR 1520设置相关联的输入参数等及其各种组合。
EGR 1520子例程可以被配置为执行分组出口功能,诸如基于来自ING 1410的输入参数标识分组转发上下文、执行与转发上下文相关联的表查找、添加或修改转发上下文上的适当封装、将分组发送到适当的输出端口等及其各种组合。
图16描绘了用于执行图15的网络分组处理程序的控制流的结构。
如图16的控制流结构1600所示,处理器顺序执行NET_PROC中的指令,直到指令CALL ING。CALL ING指令通过将控制传递给CALL之后指定的子例程(即,ING)来中断NET_PROC流。然后执行ING中的指令。在完成ING中的指令的执行后,处理器执行RET指令,以返回到NET_PROC中CALL ING指令之后的下一条指令。然后,处理器顺序执行NET_PROC中的指令,直到指令CALL EGR。CALL EGR指令通过将控制传递给CALL之后指定的子例程(即,EGR)来中断NET_PROC流。然后执行EGR中的指令。在完成EGR中的指令执行后,处理器执行RET指令,以返回到NET_PROC中CALL EGR指令之后的下一条指令。处理器对每个传入分组重复上述过程。
如图16所示,在NET_PROC、ING和EGR内,指令的顺序执行可以由分支指令中断。在ING内,处理器顺序执行指令,直到其命中JE ipv6_1指令。如果分组是IPv6分组,则此JE指令将执行序列切换到被标记为ipv6_1的控制块。在执行ipv6_1控制块中的序列之后,它使用JUMP指令来在被标记为ipv6_m_1的指令处合并回主指令序列。该序列一直执行,直到它命中JE mpls指令。如果分组是MPLS分组,则该JE指令将执行切换到被标记为mpls的控制块。在执行mpls控制块中的序列之后,它使用JUMP指令在被标记为mpls_m的指令处合并回到主指令序列。该序列一直执行,直到JE ipv6_2指令。如果分组是IPv6分组,则该JE指令将执行序列切换到被标记为ipv6_2的控制块。在执行ipv6_2控制块中的序列之后,它使用JUMP指令在被标记为ipv6_m_2的指令处合并回主指令序列。将理解,尽管图16仅描述了ING中用于处理IPv6分组的两个顶级条件分支(为了清楚起见),但是对于相同的条件(例如,IPv6、MPLS等),可以存在多个这样的分支,并且进一步地,顶级条件分支内可以具有嵌套分支。还将理解,类似的控制流也可以存在于EGR内(再次,为了清楚起见,从图16中省略)。
注意,NET_PROC中的上述控制流模式可能导致UC中的严重冲突未命中。例如,在图16中,为了处理传入分组,NET_PROC中的指令开始于IP=3ffe:10:20(以IP标签:IP索引:IP偏移的格式读取)。NET_PROC中的指令被获取、解码、存储在UC中,并顺序执行,直到CALLING。到目前为止,NET_PROC中共享相同IP索引0x10的指令子集被存储在UC中的集合0x10中。CALL ING将指令序列切换到从IP=6abb:10:0a开始的ING,该ING承载相同的IP索引0x10。ING中的指令被获取、解码并存储在相同的UC集合中,这些UC集合也存储了来自NET_PROC的指令。为了存储ING的指令,可能会由于集合中空闲UC行的不可用性,因此被来自NET_PROC的指令占据的一些或所有UC行被逐出。例如,假设分组类型为IPv6。然后,在ING内,JE ipv6_1指令将指令序列切换到从IP=14ab:10:3e开始的控制块ipv6_1。控制块ipv6_1中的指令被获取、解码并存储在到目前为止被ING中的指令占据的相同UC集合中。为了将指令存储在ipv6_1控制块中,可能会逐出那些集合中的一些或所有UC行。在执行ipv6_1控制块中的序列之后,JUMP指令在被标记为ipv6_m_1的指令(其在IP=72a1:10:0x31)处合并回执行。因此,后续指令被存储在相同的UC集合中,该UC集合也将指令存储在ipv6_1控制块中。为了存储ipv6_m1的指令,可能会逐出公共集合中由来自ipv6_1的指令占据的一些或所有UC行。当该IPv6分组的控制流在控制块ipv6_2和ipv6_m2之间来回跳转时,可以观察到类似的颠簸行为。随后,当NET_PROC调用EGR时,UC中可能会出现相同的颠簸模式。
鉴于上述,将理解,在处理每个传入分组的同时,控制块NET_PROC、ING、EGR、ipv6_1、ipv6_m1、ipv6_2、ipv6_m2、mpls、mpls_m等中的大部分指令可能必须再次从L1-IC获取、解码并存储到UC中。控制块在程序存储器中的位置取决于程序的结构,该程序结构独立于处理器的底层微架构,尤其是因为UC的微架构实现对该程序不可见。例如,针对UC的IP标签、IP索引和IP偏移字段中的比特数可以在微架构之间不等,其在相应的微架构之间改变UC中的工作集合的运行时足迹。另一方面,程序代码中的修改可以重新定位控制块的地址,这会改变特定UC中工作集合的运行时足迹。注意,在NET_PROC的上下文中,UC中的冲突未命中可能以如下方式影响NET_PROC程序:(1)增加处理指令中的周期数,这增加了路由器中分组的时延;(2)增加了功耗(例如,增加了28%),这增加了功率方面的操作开销;以及(3)降低了指令获取吞吐量(例如,降低了33%),这降低了分组处理吞吐量(例如,降低了33%)。
将理解,一般要求高性能NFV路由器的转发平面以最小时延和最小功耗一致地处理和转发分组,以便满足每比特的最佳操作开销。因此,这种高性能NFV路由器的转发平面一般必须提取运行高性能NFV路由器的转发平面的处理器的峰值性能。如下文进一步讨论的,基于以如下方式被配置为向超高性能程序提供可编程控制的处理器的使用,该方式以用于减少或甚至最小化由于处理器正在执行的程序的控制块之间的干扰而引起的冲突未命中(例如,基于包括多个UC的SP-UC的使用,以及支持使用这种包括多个UC的SP-UC的相关联的控制能力),本文呈现的各种示例实施例可以被配置为支持高性能NFV路由器的改进性能。
处理器的各种示例实施例可以被配置为支持处理器资源的分割可编程性。处理器的各种示例实施例可以被配置为支持处理器的处理器前端的资源的分割可编程性。处理器的各种示例实施例可以被配置为以如下方式支持处理器的处理器前端的资源的分割可编程性,该方式使得能够将处理器的前端的分割可编程资源指派给由处理器正在执行的程序的控制块。
处理器的各种示例实施例可以被配置为支持处理器资源的分割可编程性。处理器的各种示例实施例可以被配置为以用于减少甚至消除工作集合中的关键控制块之间的冲突未命中的方式,来支持用于A类或B类的超高性能应用的处理器资源的分割可编程性。处理器的各种示例实施例可以被配置为基于用于在处理器中采用UC以最小化这种关键控制块之间的冲突未命中的范例来支持处理器的资源的分割可编程性。处理器的各种示例实施例可以被配置为基于架构(即,ISA)和微架构中的技术来支持处理器资源的分割可编程性,以实现用于在处理器中采用UC以最小化这种关键控制块之间的冲突未命中的范例。对于超高性能应用,这些技术可以改进和保证处理器前端的性能,同时还可以节省处理器前端的更多功率。
如上所述,处理器的各种示例实施例可以被配置为支持处理器前端的UC的分割可编程性。处理器的各种示例实施例可以被配置为基于使用包含多个UC的UC库来支持处理器前端的UC的分割可编程性,其中库中的每个UC是唯一可标识的(例如,用数字标识符标识),并且因此可由可以由处理器执行的程序编程。例如,如果在库中存在P个UC,则UC可以被指派标识符为0,1…,(P-1)。在程序执行期间的任何时刻,库中只有一个UC是活动的,即,用于存储或访问UOP。例如,如果UC-1是UC库中当前活动的UC,则解码器仅将UOP存储到UC-1。获取IP的同时,UC-1仅查找匹配的UC行。集合中的活动UC由程序中的特殊指令选择,该指令对被设置为活动的UC的标识符进行编码。特殊指令可以是用于切换活动UC的专用指令,或者可以是增强为编码UC的标识符的现有控制指令。这些特殊指令中的任何一个均可以被称为包括在处理器的ISA的指令集中的“UC切换指令”。当UC切换指令在UC-K中被解码或被访问时,它将活动UC从UC-K切换到UC-M,其中UC-M是UC切换指令中编码的UC标识符。在UC切换指令之后获取的后续指令在UC-M中被存储并被访问,直到另一UC切换指令再次切换活动UC。注意,活动UC从UC-K到UC-M的切换发生在获取后续指令之前,这也意味着处理器的后端尚未执行UC切换指令。因此,当UC切换指令在UC-K中为命中时,或者在UC切换指令的解码阶段期间(即,UC切换指令在UC-K中为未命中,因此它通过L1-IC->IFU->ILD->IQ->MITE路径被获取并存储到UC-K中),可以发生活动UC的切换,使得后续获取的指令在UC-M中被存储或被访问。UC的这种范例在本文中被称为分割可编程微操作缓存(SP-UC),其中,由于存在多个UC,因此它被认为是“分割的”,并且由于活动UC的选择是可由处理器执行的程序控制的,因此它被认为是“可编程的”。
如上所述,处理器的各种示例实施例可以被配置为基于SP-UC支持处理器前端的UC的分割可编程性。总体而言,SP-UC使程序能够将特定的控制块固定到特定的UC-M。一旦固定,则控制块中的指令将在UC-M中被访问或被存储。例如,假设在将控制转移到控制块之前,活动UC是UC-K。然后,在将控制转移到控制块的同时,程序调用利用UC-M编码的UC切换指令,该指令将活动UC从UC-K改变为UC-M。随后,控制块中的所有指令均被固定到UC-M。在完成控制块的执行时,可将活动UC从UC-M恢复回UC-K,同时将控制转移到父程序中的原始序列。通过这种方法,程序可以将性能关键控制块固定到库中互斥的UC中,从而消除由于它们之间的干扰而导致的冲突未命中。该方法还增加了每个UC中工作集合的空间局部性,因为控制块是程序存储器中较窄区域内的指令序列。在集合关联缓存中,冲突未命中率与缓存的工作集合的空间局部性成反比。如果SP-UC中的关键控制块数量高于UC数量,则可以固定多个控制块以共享特定UC。这样的控制块被称为“亲和组”,并且将理解,冲突未命中可能由于亲和组内的兄弟控制块之间的干扰而发生,但是不应该在不是亲和组的一部分的控制块之间发生。该程序可以使亲和组中的兄弟控制块在空间上并置在程序存储器中,这最小化了块之间的干扰,从而进一步减少或消除了冲突未命中。该方法提供了对程序的绝对控制,以便以实现改进甚至最佳程序性能的方式在UC之间指派其控制块。
将理解,通过考虑被配置为支持分割可编程性并且包括分割可编程微操作缓存的处理器的前端,可以进一步理解分割可编程性的这些和各种其他实施例和优点,如图17所呈现的。
图17描绘了处理器的前端的示例实施例,其被配置为支持分割可编程性并且包括分割可编程微操作缓存。
图17的前端1700包括L1-IC 1710、IFU 1720、BPU 1730、ILD 1740、IQ 1750、ID1760、分割可编程(SP)UC(SP-UC)1770(包括UC 1771-1-1771-(P-1)的集合或库,其可统称为UC 1771)和IDQ 1780。将理解,一般而言,图17的前端1700的组件的操作可以分别类似于图2的前端200的相应组件的操作,除非另有指示(例如,为了支持UC资源的分割可编程性)。
如上所述,前端1700被配置为支持前端200的各种资源类型的分割可编程性,包括支持分割可编程的UC(说明性地,SP-UC 1770)。将理解,通过首先考虑L1-IC 210的操作(如参照图4-5所呈现的),单个UC 370的操作(如参照图6-12所呈现的),以及基于如参照图4-5所呈现的L1-IC 310的操作和如参照图6-12所呈现的单个UC 370的操作的处理器的使用来支持程序的执行(如参照图13-16所呈现的),可以进一步理解使用UC资源的分割可编程性的前端200的操作(例如,如参照图17-31所呈现的)。
用于基于SP-UC(诸如图17的前端1700的SP-UC 1770)支持处理器操作的各种实施例被配置为支持UC切换指令。可以在处理器的架构中支持UC切换指令(例如,对于处理器的ISA的指令集)。UC切换指令可以被配置为将UC索引编码为要被切换为活动的UC。可以使用专用UC切换指令或增强处理器的ISA的现有控制指令来实现UC切换指令。
在至少一些实施例中,可以使用专用UC切换指令来实现UC切换指令。专用UC切换指令在不改变执行序列的情况下切换活动UC。这意味着后续指令将在由该UC切换指令选择的UC(例如,UC 271之一)中被存储和/或访问。这种类型的指令在本文被表示为“UC切换类型-1”。
在至少一些实施例中,可以使用处理器的ISA的现有控制指令来实现UC切换指令。处理器的ISA的现有控制指令可以利用UC切换功能来增强。处理器的ISA的现有控制指令切换UC,同时将执行序列跳转到控制块。因此,将执行序列跳转到控制块的现有控制指令(例如,在x86中,诸如JUMP、JE、CALL等指令)可以用于此目的。这种类型的指令在本文被表示为“UC切换类型-2”。
如本文所讨论的,SP-UC是处理器的微架构的组件,而UC切换指令是处理器架构/ISA的一部分。因此,本文描述的UC切换指令不一定限于用于控制UC的分割和可编程性以提供SP-UC和SP-UC的UC之间的关联切换;相反,这些UC切换指令可以用于控制其他类型的处理器资源的分割和可编程性以及这些其他类型的处理器资源的各部分之间的关联切换。除了UC资源,这些其他资源还可以包括其他处理器前端资源,诸如分支预测器、分支目标缓冲器等。还将理解,根据本文呈现的各种实施例,可以对这种处理器前端资源的各种组合进行分割和编程。因此,为了支持处理器前端的UC资源的分割和可编程性而提供的UC切换指令可以被一般化为“资源切换指令”或“颜色切换指令”,其表示控制供处理器执行的程序的控制块使用的各种处理器前端资源类型的分割和可编程性的更一般的能力,并且因此还具有正被执行的程序将“颜色”归于控制块的能力,使得控制块然后能够使用该颜色的资源(即,对于一种或多种资源类型中支持分割和可编程性的任何一种,具有该颜色的相应资源类型的相应部分)。在这样的实施例中,不是在指令内编码标识控制块的UC的UC索引,而是在指令内编码标识控制块的颜色(以及由此相关联的处理器前端资源)的颜色索引。以此方式,从处理器架构的角度来看,颜色提供了处理器内的资源池的概念,使得当程序向控制块指派颜色时,则控制块被分配有该颜色的资源(例如,以SP-UC的UC形式的UC资源、分支预测器的分支预测器资源、分支目标缓冲器的分支目标缓冲器资源等及其各种组合中的一个或多个)。将理解,程序的多个控制块可以共享颜色(并且可以被称为亲和组),使得多个控制块中的每一个控制块均被指派有所指派颜色的资源集合。在SP-UC的上下文中,颜色索引被1:1映射到UC索引(即,SP-UC是UC池,其中每个UC被指派有颜色索引)。将理解,考虑到基于颜色将UC资源的分割和可编程性一般化到其他类型的资源,还可以引入UC切换指令的更一般版本。即,为了支持各种处理器前端资源类型的分割和可编程性,颜色切换指令可以被定义为包括“颜色切换类型-1”指令(例如,“UC切换类型-1”指令的更一般版本)和“颜色切换类型-2”指令(例如,“UC切换类型-2”指令的更一般版本)。将理解,在基于颜色的各种资源类型的分割和可编程性的情况下,其中被分割的资源是提供SP-UC的UC,颜色切换指令然后可以充当上面最初介绍的UC切换指令(例如,其中颜色值指示SP-UC中的UC索引)。将理解,颜色切换指令可以使用各种处理器ISA来实现;然而,为了清楚地描述基于颜色的处理器前端资源的分割和可编程性的各种实施例,颜色切换指令(包括将颜色切换指令实现为用于支持SP-UC的UC切换指令)主要在特定ISA(即,x86)的上下文中描述。将理解,如图18所示,可以通过首先总体上考虑x86指令的编码来进一步理解x86中的颜色切换指令的编码。
图18描绘了x86指令集架构指令的编码,用于示出被配置为支持处理器前端资源的分割和可编程性的颜色切换指令的编码。
如图18所示,指令1800包括多个字段,该多个字段包括指令前缀字段、操作码字段、ModR/M字段、SIB字段、位移字段、以及立即数字段。
操作码字段是单个字节,其表示指令的基本操作。因此,此字段是必填字段,最多允许256个主操作码映射。例如,0x74是用于短跳转的JE指令的操作码(即,条件跳转到程序存储器中0x7f的相对偏移内的位置)。备选操作码映射是使用转义序列定义的,转义序列需要操作码字段中的2-3个字节。例如,转义序列是编码为[0f<opcode>]的2-字节操作码。这里0f标识备选操作码映射。例如,0f 84是用于近跳转的JE指令的操作码(即,条件跳转到对于短跳转而言太远而无法到达的位置)。
ModR/M字段是1-字节的可选字段,其语义为模式-寄存器-存储器(Mode-Register-Memory)。如果指令具有操作数(即,基于操作码),则此字段指定(多个)操作数及其寻址模式。该字段中的位被划分为以下几个部分:
Mod:位6-7描述存储器操作数的4种寻址模式,如下所示,在MOV指令的上下文中。下面的MOV指令在存储器和寄存器EAX之间转移数据。
Figure BDA0003209155350000431
Reg:位3-5指定源或目的地寄存器。这允许在x86架构中对8个通用寄存器进行编码。
R/M:位0-2,与Mod字段结合,指定或双操作数指令中的第二个操作数或单个操作数指令中的唯一操作数(例如,NOT或NEG)。在两个操作数指令的情况下,此字段将在以下情况下对ESI寄存器进行编码。寄存器EAX将在Reg字段中编码。
Figure BDA0003209155350000432
SIB字段是1-字节的可选字段,其语义为缩放-索引-基准(Scale-Index-Base)。此字段用于缩放索引寻址模式(在Mod中指定),如以下示例所示:
Figure BDA0003209155350000433
这里,缩放=4(缩放因子)、索引=EBX(包含索引部分的寄存器)和基准=EDX(包含基准部分的寄存器)。
位移字段是1、2或4字节的可变长度字段。它具有多个用例,诸如:(1)在针对SIB描述的示例中,该字段包含非零偏移值8或(2)在控制指令中,它包含程序存储器中的控制块的地址,其形式为或者(a)绝对值(即,加到程序存储器地址的基准)或(b)相对值(即,相对于控制指令的地址的偏移)。
立即数字段是包含指令的常量操作数的可变长度字段。例如,在将8加到寄存器EAX的指令(即,指令“MOV EAX,8”)中,立即数字段将包含值8。
指令前缀字段是可变长度可选字段,其最多可以包含4个前缀,其中每个前缀为1-字节字段。此字段改变x86指令的默认操作。例如,66h是“操作数覆盖”前缀,它改变了默认指令模式所期望的数据大小(例如,从64位改变为16位)。将理解,x86 ISA目前支持以下前缀:
·前缀组1
ο0xF0:LOCK前缀
ο0xF2:REPNE/REPNZ前缀
ο0xF3:REP或REPE/REPZ前缀
·前缀组2
ο0x2E:CS分段覆盖
ο0x36:SS分段覆盖
ο0x3E:DS分段覆盖
ο0x26:ES分段覆盖
ο0x64:FS分段覆盖
ο0x65:GS分段覆盖
ο0x2E:未采用分支
ο0x3E:采用分支
·前缀组3
ο0x66:操作数大小覆盖前缀
·前缀组4
ο0x67:地址大小覆盖前缀
“颜色切换类型-1”指令可以用于控制处理器前端资源的分割和可编程性,以及在这些处理器前端资源的各部分之间的关联切换。可以认为“颜色切换类型-1”指令是“UC切换类型-1”指令的更一般版本(其特定于处理器前端的UC资源的分割和可编程性),并且因此可以被配置为在不改变执行序列的情况下切换活动处理器前端资源。可以使用专用切换指令来实现“颜色切换类型-1”指令,像“UC切换类型-1”指令一样。可以在诸如x86和其他的各种ISA中使用“颜色切换类型-1”指令,像“UC切换类型-1”一样。图19呈现了x86 ISA中的“颜色切换类型-1”指令的示例实现。
图19描绘了使用x86指令集架构实现的“颜色切换类型-1”指令的示例实施例。如图19所示,“颜色切换类型-1”指令1900仅包括操作码和立即数字段。将理解,由于这是新的指令,因此可以分配来自现有操作码映射的当前未指派的值来指示“颜色切换类型-1”指令。利用要被切换为活动的颜色的索引对1字节立即数字段进行编码。可以利用助记符(例如,“CLCHG”或另一合适的值)来表示该“颜色切换类型-1”指令,以便指示该指令是“颜色切换类型-1”指令。图20中呈现了x86指令序列2000中的“颜色切换类型-1”指令的示例。
“颜色切换类型-2”指令可以用于控制处理器前端资源的分割和可编程性,以及在这些处理器前端资源的各部分之间的相关联的切换。可以认为“颜色切换类型-2”指令是“UC切换类型-2”指令的更一般版本(其特定于处理器前端的UC资源的分割和可编程性),并且因此可以被配置为在将执行序列跳转到控制块的同时切换活动处理器前端资源。可以通过增强具有资源切换功能的处理器的ISA的现有控制指令来实现“颜色切换类型-2”指令,像“UC切换类型-2”指令一样。可以在诸如x86和其他的各种ISA中使用“颜色切换类型-2”指令,像“UC切换类型-2”指令一样。下面将进一步讨论x86 ISA中“颜色切换类型-2”指令的示例实现。
如上所述,x86 ISA中的“颜色切换类型-2”指令的实现可以基于针对“颜色切换类型-2”指令的功能的现有x86 ISA控制指令的增强。例如,可以如下定义新的指令前缀组(尽管将理解,可以使用其他前缀组定义):前缀组6(0x80:标颜色的-分段-前缀-基准(Colored-Segment-Prefix-Base)+<颜色索引(Color Index)>=标颜色的-分段-前缀(Colored-Segment-Prefix))。这里,活动处理器前端资源(例如,SP-UC的UC)由标颜色的-分段-前缀值标识。例如,假设处理器支持SP-UC中的8个UC,则值0x80指示UC-0,值0x87指示UC-8,依此类推。在x86中,当控制指令被编码为“颜色切换类型-2”指令时,则指令的助记符被前置指示符(例如,“C”或另一合适的值),以便指示控制指令是“颜色切换类型-2”指令。例如,在使用“C”作为前置指示符的情况下,被编码为“颜色切换类型-2”指令的JUMP指令将利用助记符CJUMP表示。类似地,RET作为CRET,JE作为CJE,JLE作为CJLE,CALL作为CCALL,依此类推。图21中呈现了x86指令序列2100中的“颜色切换类型-2”指令的示例(其示出了以“主”控制块开始的程序)。
支持基于颜色的处理器前端资源的分割和可编程性的处理器可以被配置为向处理器要执行的程序提供所支持的颜色数量的指示。这将使程序能够基于所支持的颜色数量为其控制块动态指派颜色。处理器可以通过多种方式向程序通知所支持的颜色数量,诸如通过广告颜色数量使得程序可以发现该信息、响应来自程序的颜色数量请求等及其各种组合。将理解,处理器向程序通知所支持的颜色数量的方式可以在不同的ISA上有所不同。例如,在x86 ISA中,允许软件发现处理器细节的CPUID(CPU标识)指令可以为此进行增强。CPUID指令不带参数,因为CPUID隐式地使用x86中的EAX寄存器来确定所返回的主要信息类别(有时称为CPUID叶)。可以首先在EAX=0的情况下调用CPUID,因为这将在EAX寄存器中返回处理器支持的最高EAX调用参数(叶)。可以通过添加所支持的颜色数量作为新的叶来扩展现有的CPUID范例。将理解,处理器向程序通知所支持的颜色数量的方式对于其他ISA而言可以不同。
颜色切换指令的解码导致颜色切换UOP的生成,其示例被呈现为图22中的颜色切换UOP 2200。将理解,颜色切换UOP内的字段的确切结构取决于处理器的底层微架构。因此,本文没有定义其字段的确切结构,而是可以基于处理器的底层微架构来定义。然而,本文提供了用于对颜色切换UOP中的下一有效颜色进行编码的规则。例如,在至少一些实施例中,可以使用颜色索引字段和分支-比特位(B-比特位)字段(这两个字段在图22中示出)在颜色切换UOP中编码下一个活动颜色。颜色索引字段是对下一有效颜色的索引进行编码的k-比特位字段,其中数字k取决于处理器所支持的颜色数量(例如,SP-UC中的UC数量)。例如,如果SP-UC包含8个UC,则k=3,因为可以使用3-比特位字段唯一地标识8个不同的UC。B-比特位字段被配置为提供关于活动颜色是否被切换或是否仅当执行序列在该UOP之后分支到另一控制块时活动颜色才被切换的指示(例如,可以使用“1”来指示只有在执行序列在该UOP之后分支到另一控制块时活动颜色才被切换到颜色索引,并且可以使用“0”来指示活动颜色无条件地被切换到颜色索引,或者反之亦然)。
如上所述,颜色切换指令的解码导致颜色切换UOP的生成。将“颜色切换类型-1”指令解码为颜色切换UOP。“颜色切换类型-1”指令可以被解码为图23中所示的颜色切换UOP。将“颜色切换类型-1”指令解码为x86中的颜色切换UOP可以如下执行:(1)当解码器发现操作码作为颜色切换类型-1时,其生成颜色切换UOP,(2)解码器将立即数(颜色索引)字段从指令复制到UOP中的颜色索引比特,以及(3)解码器将B-比特位设置为0。
如上所述,颜色切换指令的解码导致颜色切换UOP的生成。当“颜色切换类型-2”指令被解码时,除了由底层(非颜色版本的)控制指令生成的UOP,它还生成颜色切换UOP。在解码期间,颜色切换UOP中的B-比特位被设置为1(因为只有在获取该指令之后分支到控制块时才切换下一活动颜色),并且颜色切换UOP是解码后的UOP中的最后一个UOP。如图24所示,可以将“颜色切换类型-2”指令解码为颜色切换UOP和一个或多个其他指令。可以如下执行x86中的“颜色切换类型-2”指令的解码:(1)如果操作码是控制指令之一,则解码器解码控制指令以生成UOP,(2)如果指令包含标颜色的-分段-前缀,则解码器将颜色切换UOP添加到已经解码后的UOP的列表中,(3)解码器将颜色切换UOP中的颜色索引设置为=标颜色的-分段-前缀–标颜色的-分段-前缀-基准,以及(4)解码器将B-比特位设置为0。
处理器可以配置有微架构,该微架构被配置为支持处理器前端资源的分割和可编程性以及这种处理器前端资源的各部分之间的关联切换。为清楚起见,本文主要在使用用于实现SP-UC的通用颜色切换指令的上下文中呈现处理器的微架构,该处理器的微架构被配置为支持处理器前端资源的分割和可编程性以及这种处理器前端资源的各部分之间的关联切换(使得将理解,对颜色切换指令的引用可以被认为是对可以特定于SP-UC的UC的UC切换指令的引用)。图25中呈现了用于实现SP-UC的微架构的示例实施例。
图25描绘了用于实现SP-UC的微架构的示例实施例。如前所述,SP-UC包括UC库和用于管理UC库内各个UC的输入和输出的电路。UC库由K个UC组成(其被表示为UC-0到UC-K-1)。接着,每个UC利用N路集合关联UC-标签和UC-数据阵列来实现,类似于图6中呈现的微架构(为了清楚起见,图25中没有展开)。然而,在图25的SP-UC中,UC-标签和UC-数据(即,UC行)条目可以具有以下附加规则:
规则1:颜色切换指令(即,“颜色切换类型-1”指令或“颜色切换类型-2”指令)终止基本块。这意味着在UC-行中只能存在一个颜色-切换-UOP。此规则使UC切换操作能够按UC行粒度来处理。
规则2:UC-标签中的辅助数据另外保存UC切换信息如下:UC-切换-信息(UC-Switch-Info)={UC-索引,B-比特位,有效-比特位}。如果与UC-标签相对应的UC-行包含颜色-切换-UOP,则有效-比特位被设置为1。UC-索引和B-比特位分别从该UC-行中的颜色-切换-UOP复制颜色索引和B-比特位。
注意,这些附加规则预计将带来SP-UC的微架构的大大简化和高效。
如图25所示,SP-UC可以被配置为提供改进的IP查找。基于SP-UC的IP查找可以具有与其相关联的各种SP-UC输入和输出。SP-UC的输入是IP和活动UC。活动UC寄存器包含当前IP的UC索引。SP-UC的输出为命中/未命中状态、UC-数据和辅助数据。在SP-UC中的IP查找可以由在一个或两个周期中执行的各种步骤组成。在第一周期(其可以表示为周期-1)中,执行UC-标签查找(如在下面的步骤1-12中所讨论的),执行L1-IC查找(如在下面的步骤13中所讨论的),执行SP-UC的下一IP的计算(如在下面的步骤14-17中所讨论的),并且执行SP-UC的下一活动UC的计算(如在步骤18-20中所讨论的)。在第二周期(其可表示为周期-2)中,该第二周期仅在第一周期中在UC-标签阵列中存在命中的情况下(即,如果来自SP-UC的命中/未命中导致命中)才会执行,执行SP-UC数据获取(如在下面的步骤21-23中所讨论的),并且执行下一UC-标签查找(如在下面的步骤24-26中所讨论的)。将理解,这些步骤描述了跨越图25的前端2500的SP-UC的信号流。
在IP查找的周期-1中,可以执行SP-UC中的UC-标签查找(如下面的步骤1-12中所讨论的):
1.要查找的IP(1)作为输入(1.1)发送到K-路IP解复用器。解复用器的每条路的输出连接到UC的IP输入(3)。解复用器基于从活动UC寄存器接收的选择器输入(2.1)来激活对应于当前活动UC的唯一路的输出。因此,IP最终仅被发送到当前活动的UC。
2.每个UC中的UC-标签阵列生成输出行-命中/未命中(4)和辅助数据(5)。辅助数据由UOP数量、字节长度、UC-切换-信息组成。
3.来自每个UC的命中/未命中行作为输入(5.1)连接到K-路命中/未命中复用器。基于由选择器输入(4.1)选择的UC,复用器连接来自所选UC的命中/未命中行作为输出。
4.来自每个UC的辅助数据行作为输入(6.1)连接到K-路辅助复用器。基于选择器输入(5.1)选择的UC,该复用器连接来自所选UC的辅助数据行作为输出。
5.活动UC寄存器值还作为选择器(2.2)被发送到K-路选择器解复用器,其生成选择器行(4)以控制来自UC的输出。
6.来自步骤5的选择器行(4)作为选择器输入(4.1)馈送到K-路命中/未命中复用器(如步骤3中所描述的)。因此,此复用器连接来自活动UC的命中/未命中行作为输出(7)。
7.来自步骤5的选择器行(4)作为选择器输入(4.2)馈送到K-路辅助复用器(如步骤4中所描述的)。因此,此复用器连接来自活动UC的辅助数据行作为输出(8)。
8.从步骤1-7可以明显看出,IP仅在当前活动UC的UC-标签阵列中进行查找。在周期结束时,步骤6-7从活动UC生成命中/未命中和辅助数据输出。
9.如果SP-UC中存在命中,则活动UC中的UC-标签向延迟元件(15)发送激励信号,以在下一周期中读出相应的UC-数据条目。这在UC-0的上下文中描述,而不管它是否是活动UC。
10.来自步骤5的选择器行(4)被馈送到延迟元件(4.3),以在下一周期中控制K-路UC-数据。
11.来自SP-UC的命中/未命中输出(7)被发送到IFU(7.1)、ILD(7.2)、IQ(7.3)和MITE(7.4),如果存在命中,则其禁用相应的单元。
12.来自SP-UC的命中/未命中输出(7)被发送到延迟元件(7.5)。在下一周期中,此行充当到2到1复用器的选择器输入,该复用器在解码路径和SP-UC之间进行选择,以将UOP发送到IDQ。
在IP查找的周期-1中,执行L1-IC查找(如下面的步骤13中所讨论的):
13.IP还被并行发送到L1-IC,用于查找从该IP开始的指令,使得如果在SP-UC中的查找导致未命中,则从L1-IC馈送指令。
在IP查找的周期-1中,可以如下执行针对SP-UC的下一IP的计算(如下面的步骤14-17中所讨论的):
14.IP还被并行发送到分支预测器单元(BPU)(1.2)。在该周期结束时,BPU确定执行序列是否在当前IP的UC行之后分支到另一控制块,这在命中/未命中输出(10)中指示。如果存在命中,则在其输出(11)中指示下一IP(即,下一控制块的IP)。
15.IP还被并行发送到加法器(1.3),在该加法器中,IP在该周期结束时被加到从SP-UC输出的辅助数据(8.1)中的字节长度。该加法产生序列中的下一IP(13)。
16.从步骤10和11计算的下一IP被馈送到2到1路复用器中,其中路是由来自BPU的命中/未命中(10)来选择。如果命中,则复用器发送11到输出(14),否则它发送13到输出(14)。
17.来自SP-UC的命中/未命中输出(7)被输入到与时钟同步的IP的‘使能’(en)行。
在IP查找的周期-1中,针对SP-UC的下一活动UC的计算可以如下执行(如下面的步骤18-20中所讨论的):
18.来自UC-切换-信息的UC索引作为数据输入(8.2)被发送到活动UC寄存器。
19.来自UC-切换-信息的B-比特位(8.3)和来自BPU的命中/未命中(10.1)被输入到异或非(XNOR)门。如果活动UC要被切换到UC-切换-信息中的UC索引,则此门的输出为1。
20.来自UC-切换-信息的有效-比特位、来自SP-UC的命中/未命中以及来自步骤15的输出被输入到与(AND)门。与门的输出作为‘使能’行输入到与时钟同步的活动UC寄存器。如果UC-切换-信息有效,并且UC要切换到UC-切换-信息中的UC索引,则使能行将被设置为1。
在IP查找的周期-2中,可以如下执行SP-UC数据获取(如下面的步骤21-23中所讨论的):
21.在当前的活动UC中,通过延迟元件(在步骤9)发送的来自匹配的UC-标签的激励信号激活相应的UC-数据条目(16)。这在UC-0中进行了描述,无论它是否是当前的活动UC。
22.来自每个UC的UC-数据行作为输入(17.1)连接到K-路UC-数据复用器。复用器的输出由通过延迟元件(在步骤10)发送的选择器输入(4.3)控制。基于来自活动UC的选择器输入,复用器将来自活动UC的UC-数据行连接作为输出(9)。
23.从步骤22输出的UC-数据(9)作为输入(9.1)被发送到在SP-UC和解码路径之间选择的2到1复用器。由于存在命中,因此到复用器(7.6)的选择器被设置为1,这将UC-数据输出到IDQ。
在IP查找的周期-2中,可以如下执行下一UC-标签查找(如下面的步骤24-26中所讨论的):
24.由于在前一周期中在UC-标签查找中存在命中,因此到IP的‘使能’行(en)输入被置位,其利用从步骤14接收的输入(14)更新IP。
25.如果活动UC寄存器中的使能行被设置为1,则活动UC寄存器被更新为在8.2中接收到的值。
26.针对当前IP和活动UC寄存器重复步骤1-20。
将理解,为了清楚地描述示例实施例,提供了前述步骤的编号,但是不一定暗示执行步骤的顺序(例如,可以以不同的顺序执行至少一些步骤,可以同时执行至少一些步骤等,以及它们的各种组合)。
将理解,IP查找可以由在各种其他周期中执行的各种其他步骤组成。
注意,为简单起见,图25未指示如何在通过指令解码路径(即,当IP未命中SP-UC时的构建模式)提供UOP的同时切换活动UC,因此沿着IFU->ILD->IQ->MITE路径从L1-IC获取指令。如下面进一步讨论的,参照图26的前端2600呈现了图25的扩展,其中展示了UC切换,同时通过构建-模式提供UOP。
再次参照图2和17,将理解,图2的前端200和图17的前端1700被配置为支持构建-模式操作,其支持通过路径L1-IC->IFU->ILD->IQ->MITE获取和解码指令,并将它们并行存储到SP-UC以提供给IDQ。
将理解,当在流-模式和构建-模式之间移动时,模式切换在前端(例如,图2的前端200或图17的前端1700)发生。例如,当前端处于流-模式且UC-标签查找导致未命中时,前端将切换到构建-模式。
再次参照图25,在图25的SP-UC中,UC查找可以在第一周期中执行UC-标签查找,并且如果在第一周期中存在未命中,则可以执行通过路径L1-IC->IFU->ILD->IQ->MITE的指令获取和解码,并将它们并行存储到SP-UC以提供给IDQ。如下面进一步讨论的,可以通过图25的SP-UC的示例实施例结合被配置为在构建-模式下操作的处理器的前端的IC来进一步理解这些操作,如图26所示。将理解,图26可以被认为是图25的一般化视图,其仅示出了在构建-模式中使用的组件和信号流。
在图26中,块构建器被配置为观察从MITE输出的解码后UOP,并构建UC行以用于存储在SP-UC中。以此方式,如果程序流返回到导致SP-UC处未命中的IP,则该IP将反而导致命中。该过程,其可以是单周期或多周期过程,包括下文描述的以下步骤(将理解,其描述了通过图26的前端的信号流):
1.当来自MITE的解码后UOP被提供给后端(1.1)时,UOP还被并行地发送到块构建器中的UC填充缓冲器(1.2)。
2.在块构建器中,来自连续指令的UOP被打包在一起以填充UC行。UC行被构建之后(2),其准备好被存储在SP-UC中。
3.将UCL的{IP,ByteLen}发送到IP更新逻辑(2.3)。IP更新逻辑读取IP寄存器(15)以检查UC行的IP(2.3)是否与来自15的IP相同,该IP是较早在UC中未命中的IP。如果不相同,则丢弃该UC行。
4.在UC行被存储在SP-UC中之前,它确定应该存储它的活动UC,并相应地更新活动UC寄存器。此确定由活动UC更新逻辑做出,其执行步骤如下:
4.1.从存储到SP-UC中的最后一条UC行,它将元组{IP,ByteLen,UC-切换-信息}记录到本地寄存器中。该寄存器被读取(8)以完成直到4.4的步骤。如果UC-切换-信息无效(即,有效-比特位被设置为0),则转到步骤4.5。
4.2.如果UC-切换-信息包含被设置为0的B-比特位,则检查(前一UC行的)IP+ByteLen是否等于当前UC行的IP。
4.2.1.如果是,则意味着当前UC行包含序列中的后续UOP,这些UOP将被存储在由UC-切换-信息中的UC-索引指定的UC中。然后转到步骤4.4。
4.2.2.如果否,则转到步骤4.5。
4.3.如果UC-切换-信息包含被设置为1的B-比特位,则检查(前一UC行的)IP+ByteLen是否不等于当前UC行的IP。
4.3.1.如果是,则这意味着当前UC行是分支到的控制块的开始,该控制块被存储在由UC-切换-信息中的UC-索引指定的UC中。然后转到步骤4.4。
4.3.2.如果否,则转到步骤4.5。
4.4.利用来自UC-切换-信息的UC索引(4)更新活动UC寄存器中的值。从本地寄存器中所存储的UC-切换-信息返回该UC索引作为针对UC行的活动UC(7)。转到步骤4.6。
4.5.读取活动UC寄存器中的现有值(6),并将该值作为UC行的活动UC返回(7)。
4.6.从当前UC行,将元组{IP,ByteLen,UC-切换-信息}记录到本地寄存器中(9)。在针对下一UC行执行步骤4.1-4.4的同时,将再次引用本地寄存器。
5.UC行现在被存储在SP-UC中(2.1)。
6.当UC行被存储在SP-UC(2.1)中的同时,并行地,IP更新逻辑发送UC行的字节长度(16)以计算序列中的下一IP。信号16作为输入被发送到2到1复用器,该复用器从SP-UC的“aux”输出的字节长度中获得另一输入。复用器的选择器是来自UC的命中/未命中输出。在构建模式下,命中/未命中发送未命中,因此复用器连接来自16的信号作为输出(8.1)。用于更新下一IP的剩余信号流(使用BPU和信号8.1)与流模式中描述的相同。
将理解,为了清楚地描述示例实施例,提供了前述步骤的编号,但是不一定暗示执行步骤的顺序(例如,可以以不同的顺序执行至少一些步骤,可以同时执行至少一些步骤等,以及它们的各种组合)。
将理解,在图25和26的SP-UC微架构中,SP-UC中的查找在两个时钟周期中执行,即在与图6的单个UC微架构中相同的周期数中执行。SP-UC的周期时间和功耗可能受其在芯片上消耗的表面积的影响。SP-UC的实现可以考虑UC-库的组织的几种方法,以提供与单个UC微架构相当甚至更好的功率性能特性。例如,在使用与单个UC制造相同的密度(例如,22nm半导体器件制造节点等)制造SP-UC的情况下,具有K个UC的SP-UC可能消耗与单个UC情况相等的表面积,这可以通过保持SP-UC中的每个UC的大小等于或近似等于单个UC情况下的UC大小除以UC的数量(K)来实现。例如,在使用比单个UC情况更高密度的技术制造SP-UC的情况下,SP-UC内的UC大小可以保持等于或大于单个UC情况下的UC大小(例如,使用14nm制造节点、12nm制造节点等)。
将理解,被配置为支持分割可编程性的处理器可以被配置为支持两种操作模式:(1)统一模式,其中尽管支持但不使用分割可编程性能力,以及(2)分割模式,其中使用分割可编程性能力。例如,在SP-UC的情况下,支持SP-UC的处理器也可以支持将SP-UC作为单个不可编程UC操作的选项。这为不支持分割可编程性能力的使用的程序(例如,不支持使用颜色切换指令来虚拟化处理器前端资源的程序)提供了向后兼容性。在可以被设置为处理器中的默认模式以向后兼容的统一操作模式中,可以将原本可以共享和可编程的资源集合捆绑在一起以充当不可编程的整体资源(例如,在SP-UC的情况下,将SP-UC的UC库中的各个UC捆绑在一起以作为不可编程的整体UC来操作)。在分割操作模式中,其可以从统一操作模式(其中统一操作模式是默认模式)进入,使用颜色切换指令(例如,在SP-UC的情况下,SP-UC的UC库中的各个UC作为一组来操作以支持共享和可编程性),资源集合是可共享和可编程的。通过参照图27,可以进一步理解用于在统一模式和分割模式之间切换的模式选择的使用。
图27描绘了用于在处理器中实现分离可编程微操作缓存的微架构的示例实施例,该处理器被配置为支持用于在不可编程和可编程操作模式之间切换的模式选择。将理解,图27的微架构是图25的微架构的扩展,其包括了用于模式选择的附加逻辑,为了清楚起见,省略了SP-UC内的细节。如图27的前端2700所示,被称为“模式选择器”(18)的寄存器是设置SP-UC的操作模式的寄存器。例如,可以将“模式选择器”寄存器的值设置为1,以指示处理器将在分割模式下操作,并且如果处理器将在统一模式下操作,则将其设置为0(或者反之亦然,其中0可以用于分割模式,而1可以用于统一模式)。“模式选择器”寄存器的设置可以在引导时间期间通过计算机系统的BIOS设置来完成。基于“模式选择器”寄存器的模式选择操作可以如下执行。
如上所述,“模式选择器”寄存器被配置为支持处理器在统一模式下的操作。为了描述处理器在统一模式下的操作,假设SP-UC中的每个UC包含S个集合,并且每个集合具有N路。在统一模式下操作的同时,SP-UC充当具有(S x K)个集合的单个UC,其中每个集合有N路。例如,UC-0包含集合0到S-1,UC-1包含集合S到2S-1,依此类推。要实现此功能,IP首先自动映射到特定UC,然后再映射到该UC内的集合。通过从IP标签窃取log2(K)比特来选择UC,即,所偷取的比特的值是UC索引。然后,如参照图15所讨论的,IP索引、IP偏移和IP标签中的剩余比特被用于查找该UC内的UC行。从IP标签中提取这些比特是由“IP标签调整”逻辑执行的。该逻辑由来自模式选择器寄存器(18)的输入(18.1)使能(en)。在统一模式下,输入(18.1)值为1,因此逻辑被使能。所提取的log2(K)比特作为输入(19)被发送到“2到1UC索引”复用器。该“2到1UC索引”复用器从活动UC寄存器获得另一输入(2)。“2到1UC索引”复用器基于选择器(18.2)输出任一输入,其从模式选择器寄存器(18)馈送。在统一模式中,选择器(18.2)值为1,因此复用器输出包含从IP标签偷取的log2(K)比特的输入19。
如上所述,“模式选择器”寄存器也被配置为支持处理器在分割模式下的操作。当在分割模式下操作的同时,模式选择器(18)被设置为值0。因此,IP标签调整逻辑被禁用,并且IP标签中的整个比特被发送到SP-UC。到2到1UC索引复用器的选择器(18.2)值为0,因此复用器从活动UC寄存器输出输入2。
将理解,可以以其他方式支持对用于在处理器的非可编程和可编程操作模式之间切换的模式选择的支持。
如本文所讨论的,处理器可以用于支持用于各种目的的程序的执行,诸如通用处理、网络分组转发处理(例如,NFV)、图形处理等。用于处理器前端的UC资源的分割可编程性的各种示例实施例可以被配置为支持NFV。本文参照图15和16呈现了网络分组处理程序和相关联的控制流结构的示例。参照图28呈现了示出基于具有SP-UC的处理器的使用来执行网络分组处理程序1500的示例实施例。图28描述了用于使用分割可编程微操作缓存来执行图15的网络分组处理程序的控制流和由此产生额控制块的结构。如图28的控制流结构2800所示,处理器执行NET_PROC中的指令。图28还示出了SP-UC中的UC锁定。在NET_PROC开始时,通过专用UC切换指令将UC-0设置为活动UC,如图28中的SWITCH UC-0所示。其目的是将NET_PROC中的所有指令固定到UC-0。当NET_PROC利用指令CALL ING UC-1调用子例程ING时,CALL指令被增强以执行UC切换,其中它将UC-1编码为活动UC。因此,ING中的所有指令被固定到UC-1。在ING执行完成后,RET指令将活动UC“自动”切换到UC-0,即,切换到在CALL INGUC-1之前活动的UC。注意,RET指令不是利用UC索引编码的,因为子例程可以从许多不同的位置调用子例程,并且每个这样的调用位置可以具有其自身的固定UC。因此,当调用CALL指令时,它还会将调用上下文的固定UC推入RAS和调用栈中。当获取RET时,它从RAS读取调用上下文的固定UC,并切换回UC。类似地,当NET_PROC利用指令CALL EGR UC-2调用子例程EGR时,EGR内的所有指令被固定到UC-2。因此,SP-UC中的NET_PROC、ING和EGR的足迹是互斥的工作集合。在ING内,所有IPv6相关的条件控制块(即,ipv6_1和ipv6_2)被捆绑为固定到UC-3的亲和组。如图28所示,程序使两个控制块在空间上并置,以消除它们之间的冲突未命中。在此上下文中,JE指令被增强以执行UC切换,其中它将UC-3编码为活动UC。在完成控制块的执行时,JUMP指令将UC切换回UC-1。在此上下文中,增强JUMP指令以执行UC切换,其中它将UC-1编码为下一活动UC。类似地,MPLS相关的控制块,mpls_1,被固定到UC-4。IPv4相关的处理由ING的默认执行序列(即,非IPv6和非MPLS)执行,其被固定到UC-1。EGR内的控制块可以以相同的方式固定,即,IPv6控制块被固定在UC-3中,MPLS控制块固定在UC-4中,依此类推。因此,IPv4、IPv6和MPLS分组处理工作集合在SP-UC中的足迹是互斥的。
处理器的各种示例实施例被配置为支持处理器的处理器前端资源的分割可编程性。参照图29呈现了被配置为支持处理器的处理器前端资源的分割可编程性的处理器。如图29所示,处理器2900包括ISA 2901和处理器前端资源2902。ISA 2901被配置为支持处理器2900上的软件与处理器2900的底层硬件之间的交互。ISA 2901被配置为支持处理器前端资源2902的分割可编程性(例如,基于各种指令的使用,诸如颜色切换指令等)。处理器前端资源2902可以包括UC资源(例如,由此为处理器2900提供SP-UC)、分支预测单元资源(例如,由此为处理器2900提供SP-BPU)等及其各种组合。
诸如图29的处理器2900的处理器的各种示例实施例可以被配置为支持处理器的处理器前端资源的可编程性。在至少一些实施例中,处理器包括后端、具有前端资源的前端和指令集架构(ISA)。处理器被配置为执行程序。前端被配置为对程序的指令进行解码,以向后端提供微操作集合。后端被配置为接收来自前端的微操作,并执行微操作。ISA被配置为支持程序对前端的前端资源集的可编程性。
诸如图29的处理器2900的处理器的各种示例实施例可以被配置为通过提供包括至少两个微操作缓存的集合的处理器,来支持处理器的UC资源的分割可编程性,该微操作缓存被配置为存储从要由处理器执行的程序的指令解码的微操作。
诸如图29的处理器2900的处理器的各种示例实施例可以被配置为通过提供包括指令集架构(ISA)的处理器来支持处理器的UC资源的分割可编程性,该ISA被配置为支持由处理器执行的程序对处理器的两个或更多个UC的集合的可编程性。
诸如图29的处理器2900的处理器的各种示例实施例可以被配置为通过提供包括至少两个UC和ISA的集合的处理器,来支持处理器的UC资源的分割可编程性,该UC被配置为存储从要由处理器执行的程序的指令解码的微操作,ISA被配置为支持由处理器执行的程序对处理器的两个或更多个UC的集合的可编程性。
图30描绘了供处理器使用以支持处理器的微操作缓存资源的可编程性的方法的示例实施例。将理解,尽管主要被呈现为串行执行,但是方法3000的至少一部分功能可以同时执行或者以不同于参照图30所呈现的顺序来执行。在框3001,方法3000开始。在框3010,由具有至少两个微操作缓存的处理器的解码块解码程序的指令以形成微操作。在框3020,将微操作存储在微操作缓存中的活动微操作缓存中。在框3099,方法3000结束。
图31描绘了供处理器使用以支持处理器的微操作缓存资源的可编程性的方法的示例实施例。将理解,尽管主要被呈现为串行执行,但是方法3100的至少一部分功能可以同时执行或者以不同于参照图31所呈现的顺序来执行。在框3101,方法3100开始。在框3110,由处理器执行包括指令集的程序。在框3120,由处理器的指令集架构(ISA)基于程序的执行来支持处理器的两个或更多个微操作缓存的集合的可编程性。在框3199,方法3100结束。
图32描绘了供处理器使用以支持处理器前端资源的可编程性的方法的示例实施例。将理解,尽管主要被呈现为串行执行,但是方法3200的至少一部分功能可以同时执行或者以不同于参照图32所呈现的顺序来执行。在框3201,方法3200开始。在框3210,由处理器执行包括指令集的程序。在框3220,由处理器的指令集架构(ISA)基于程序的执行来支持处理器的处理器前端资源集合的可编程性。在框3299,方法3200结束。
将理解,尽管本文主要在支持特定类型的处理器架构(例如,x86)和微架构的特定类型的处理器(例如,CISC、超标量等)的上下文中呈现,但是本文呈现的各种示例实施例可以在各种其他类型的处理器(例如,RISC等)的上下文中提供,可以在支持各种其他处理器架构(例如,ARM、MIPS等)的处理器的上下文中提供,可以在支持各种其他处理器微架构的处理器的上下文中提供等,以及它们的各种组合。
将理解,尽管本文主要在没有参考处理器核(例如,单核处理器)描述的处理器的上下文中呈现,但是本文呈现的各种示例实施例可以在多核处理器的上下文中提供。将理解,在至少一些这样的多核处理器中,一些或所有处理器核可以分别具有前端和后端。因此,在至少一些实施例中,本文中提及的“处理器”可以被认为是指多核处理器的各个“处理器核”(并且因此支持处理器的各个处理器核的前端资源的分割可编程性)。
用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以提供各种优势或潜在优势。例如,用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以提高从处理器的前端到处理器的后端的吞吐量。例如,用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以通过处理器前端的解码电路来减少或最小化功耗。例如,用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以支持更严格的处理器性能要求。例如,用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以支持实现NFV解决方案的处理器的改进或优化的分组吞吐量和功率效率。用于支持处理器的处理器前端的资源的分割可编程性的各种示例实施例可以提供各种其他优势或潜在优势。
图33描绘了可以利用本文呈现的各种功能的计算机的示例实施例。
计算机3300包括处理器3302(例如,中央处理单元、处理器、具有处理器核的集合的处理器、处理器的处理器核等)和存储器3304(例如,随机存取存储器、只读存储器等)。处理器3302和存储器3304可以通信地连接。
计算机3300还可以包括协作元件3305。协作元件3305可以是硬件设备。协作元件3305可以是可以加载到存储器3304中并由处理器3302执行以实现本文讨论的功能的过程(在这种情况下,协作元件3305(包括相关联的数据结构)可以被存储在非瞬态计算机可读存储介质上,诸如存储设备或其他存储元件(例如,磁驱动器、光驱动器等))。
计算机3300还可以包括一个或多个输入/输出设备3306。输入/输出设备3306可以包括一个或多个用户输入设备(例如,键盘、小键盘、鼠标、麦克风、相机等)、用户输出设备(例如,显示器、扬声器等)、一个或多个网络通信设备或元件(例如,输入端口、输出端口、接收机、发射机、收发机等)、一个或多个存储设备(例如,磁带驱动器、软盘驱动器、硬盘驱动器,压缩盘驱动器等)等,以及它们的各种组合。
将理解,计算机3300可以表示适合于实现本文描述的功能元件、本文描述的功能元件的部分等及其各种组合的一般架构和功能。例如,计算机3300可以提供适合于实现或使用本文呈现的处理器的一般架构和功能。
将理解,本文呈现的功能中的至少一些可以用软件(例如,经由在一个或多个处理器上的软件实现,用于在通用计算机上执行(例如,经由通过一个或多个处理器的执行)来实现,以便提供专用计算机等)和/或可以用硬件(例如,使用通用计算机、一个或多个专用集成电路和/或任何其他硬件等同物)来实现。
将理解,本文呈现的功能中的至少一些可以在硬件内实现,例如,作为与处理器协作以执行各种功能的电路。本文描述的功能/元件的部分可以被实现为计算机程序产品,其中计算机指令在由计算机处理时,适配计算机的操作,使得本文描述的方法和/或技术被调用或以其他方式提供。用于调用各种方法的指令可以被存储在固定或可移动介质(例如,非瞬态计算机可读介质)中,经由广播或其他信号承载介质中的数据流传输,和/或存储在根据指令操作的计算设备内的存储器内。
将理解,本文中使用的术语“或”指的是非排他性的“或”,除非另有指示(例如,使用“或者否则”或“在备选方案中”)。
将理解,尽管本文详细示出并描述了并入本文呈现的教导的各种实施例,但是本领域技术人员可以容易地设计出仍并入这些教导的许多其他变化实施例。

Claims (29)

1.一种装置,包括:
处理器,包括至少两个微操作缓存的集合,所述至少两个微操作缓存被配置为存储从要由所述处理器执行的程序的指令解码的微操作。
2.根据权利要求1所述的装置,其中,所述处理器被配置为在由所述处理器执行所述程序期间的任何时间,仅激活来自所述至少两个微操作缓存的集合的微操作缓存,以用于存储或访问微操作。
3.根据权利要求1至2中任一项所述的装置,其中所述处理器包括指令解码器的集合,其中在所述程序的指令之一的解码期间,所述指令解码器的集合将微操作存储到所述微操作缓存中的活动微操作缓存。
4.根据权利要求1至3中任一项所述的装置,其中所述处理器被配置为在获取所述程序的指令的指令指针(IP)的同时,在所述微操作缓存的活动微操作缓存中执行查找操作。
5.根据权利要求1至4中任一项所述的装置,其中所述处理器被配置为基于微操作缓存切换指令,支持将所述微操作缓存中的一个微操作缓存选择作为活动微操作缓存。
6.根据权利要求5所述的装置,其中所述微操作缓存切换指令是专门针对将所述微操作缓存中的一个微操作缓存选择作为所述活动微操作缓存而配置的指令。
7.根据权利要求5所述的装置,其中所述微操作缓存切换指令是被配置为提供所述程序的程序控制功能并且还被配置为支持将所述微操作缓存中的一个微操作缓存选择作为所述活动微操作缓存的指令。
8.根据权利要求5所述的装置,其中所述微操作缓存切换指令由所述处理器的指令集架构(ISA)支持。
9.根据权利要求1至8中任一项所述的装置,其中所述处理器被配置为选择所述微操作缓存中的第一微操作缓存作为活动微操作缓存,其中所述微操作缓存切换指令包括所述微操作缓存中的第二微操作缓存的标识符,其中对所述微操作缓存切换指令的解码使所述活动微操作缓存从所述微操作缓存中的所述第一微操作缓存切换到所述微操作缓存中的所述第二微操作缓存。
10.根据权利要求1至9中任一项所述的装置,其中所述处理器被配置为解码所述程序的微操作缓存切换指令,以使得选择所述微操作缓存中的第一微操作缓存作为活动微操作缓存,其中从所述程序的一个或多个后续指令解码的微操作被存储在所述微操作缓存中的所述第一微操作缓存中,直到下一微操作缓存切换指令被解码,以将所述活动微操作缓存改变为所述微操作缓存中的第二微操作缓存。
11.根据权利要求1至10中任一项所述的装置,其中所述处理器被配置为选择所述微操作缓存中的第一微操作缓存作为活动微操作缓存,其中所述处理器被配置为在解码与所述微操作缓存中的第二微操作缓存相关联的所述程序的下一指令之前,将所述活动微操作缓存切换到所述微操作缓存中的所述第二微操作缓存。
12.根据权利要求1至11中任一项所述的装置,其中所述处理器被配置为选择所述微操作缓存中的第一微操作缓存作为活动微操作缓存,其中所述处理器被配置为在执行基于微操作缓存切换指令解码的微操作之前,基于所述微操作缓存切换指令将所述活动微操作缓存切换到所述微操作缓存中的第二微操作缓存。
13.根据权利要求12所述的装置,其中所述处理器被配置为基于确定所述微操作缓存切换指令存在于所述微操作缓存中的所述第一微操作缓存中来执行所述切换。
14.根据权利要求12所述的装置,其中所述处理器被配置为基于确定所述微操作缓存切换指令不存在于所述微操作缓存中的所述第一微操作缓存中,在对所述微操作缓存切换指令的解码和存储期间执行所述切换。
15.根据权利要求1至14中任一项所述的装置,其中所述处理器包括指令集架构(ISA),所述指令集架构被配置为支持通过所述程序对所述微操作缓存的集合的可编程性。
16.一种方法,包括:
由具有至少两个微操作缓存的处理器的解码块解码程序指令,以形成微操作;以及
将所述微操作存储在所述微操作缓存中的活动微操作缓存中。
17.一种装置,包括:
处理器,包括指令集架构(ISA),所述ISA被配置为支持通过由所述处理器执行的程序对所述处理器的两个或更多个微操作缓存的集合的可编程性。
18.根据权利要求17所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持所述程序的控制块与所述微操作缓存中的一个微操作缓存的关联。
19.根据权利要求17至18中任一项所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持由所述程序的两个或更多个控制块对所述微操作缓存中的一个微操作缓存的共享。
20.根据权利要求19所述的装置,其中所述处理器被配置为将所述程序的所述两个或更多个控制块保持为在空间上并置在程序存储器中。
21.根据权利要求17至20中任一项所述的装置,其中所述程序包括控制块的集合,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持通过所述程序将所述程序的所述控制块分布在所述微操作缓存的至少一部分上。
22.根据权利要求17至21中任一项所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持被配置为切换所述微操作缓存中的活动微操作缓存的指令。
23.根据权利要求22所述的装置,其中被配置为切换所述微操作缓存中的所述活动微操作缓存的所述指令包括微缓存标识符,所述微缓存标识符指示所述微操作缓存中的一个微操作缓存作为所述微操作缓存中的所述活动微操作缓存。
24.根据权利要求17至23中任一项所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持专门针对将所述微操作缓存中的一个微操作缓存选择作为所述活动微操作缓存而配置的指令类型。
25.根据权利要求17至24中任一项所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持如下指令类型,所述指令类型被配置为提供所述程序的程序控制功能,并且还被配置为支持将所述微操作缓存中的一个微操作缓存选择作为所述活动微操作缓存。
26.根据权利要求17至25中任一项所述的装置,其中为了支持通过所述程序对所述微操作缓存的集合的可编程性,所述ISA被配置为支持将所述程序的控制块固定到所述微操作缓存中的一个微操作缓存,使得基于所述控制块的指令解码的微操作从所述微操作缓存中的所述一个微操作缓存被访问或者被存储在所述一个微操作缓存中。
27.根据权利要求17至26中任一项所述的装置,其中所述程序的第一控制块和第二控制块与相应的所述微操作缓存中的第一微操作缓存和第二微操作缓存相关联,其中所述ISA被配置为支持微操作缓存切换指令,在将控制从所述第一控制块转移到所述第二控制块之前,所述微操作缓存切换指令当由具有所述第二控制块的标识符的所述程序调用时,使所述活动微操作缓存从所述微操作缓存中的所述第一微操作缓存切换到所述微操作缓存中的所述第二微操作缓存。
28.一种方法,包括:
由处理器执行包括指令集的程序;以及
由所述处理器的指令集架构(ISA)基于所述程序的执行来支持所述处理器的两个或更多个微操作缓存的集合的可编程性。
29.一种装置,包括:
处理器,包括后端、具有前端资源的前端、以及指令集架构(ISA),其中所述处理器被配置为执行程序;
其中所述前端被配置为解码所述程序的指令,以向所述后端提供微操作的集合;
其中所述后端被配置为从所述前端接收所述微操作,并执行所述微操作;
其中所述ISA被配置为支持通过所述程序对所述前端的所述前端资源的所述集合的可编程性。
CN201980091969.5A 2019-02-13 2019-02-13 处理器资源的可编程控制 Pending CN113795823A (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/US2019/017856 WO2020167303A1 (en) 2019-02-13 2019-02-13 Programmable control of processor resources

Publications (1)

Publication Number Publication Date
CN113795823A true CN113795823A (zh) 2021-12-14

Family

ID=65576725

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201980091969.5A Pending CN113795823A (zh) 2019-02-13 2019-02-13 处理器资源的可编程控制

Country Status (4)

Country Link
US (1) US20220107810A1 (zh)
EP (1) EP3903186A1 (zh)
CN (1) CN113795823A (zh)
WO (1) WO2020167303A1 (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20230367600A1 (en) * 2022-05-12 2023-11-16 Nokia Solutions And Networks Oy Affinity groups in a micro-operations cache of a processor

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5630083A (en) * 1994-03-01 1997-05-13 Intel Corporation Decoder for decoding multiple instructions in parallel
US7260684B2 (en) * 2001-01-16 2007-08-21 Intel Corporation Trace cache filtering
US8473724B1 (en) * 2006-07-09 2013-06-25 Oracle America, Inc. Controlling operation of a processor according to execution mode of an instruction sequence
KR101842550B1 (ko) * 2011-11-22 2018-03-28 소프트 머신즈, 인크. 다중 엔진 마이크로프로세서용 가속 코드 최적화기
US11645083B2 (en) * 2013-08-23 2023-05-09 Texas Instruments Incorporated Processor having adaptive pipeline with latency reduction logic that selectively executes instructions to reduce latency
US10884751B2 (en) * 2018-07-13 2021-01-05 Advanced Micro Devices, Inc. Method and apparatus for virtualizing the micro-op cache

Also Published As

Publication number Publication date
US20220107810A1 (en) 2022-04-07
EP3903186A1 (en) 2021-11-03
WO2020167303A1 (en) 2020-08-20

Similar Documents

Publication Publication Date Title
US7734895B1 (en) Configuring sets of processor cores for processing instructions
EP3238073B1 (en) Hiding page translation miss latency in program memory controller by selective page miss translation prefetch
US5774710A (en) Cache line branch prediction scheme that shares among sets of a set associative cache
US11474944B2 (en) Zero latency prefetching in caches
KR19990087940A (ko) 단일클럭사이클내에불연속명령을페치하기위한방법및시스템
US20230078414A1 (en) Servicing cpu demand requests with inflight prefetches
WO2014039962A1 (en) Fetch width predictor
KR19980079301A (ko) 레지스터 파일 판독을 감소시키는 벡터 프로세서 디자인
US5878252A (en) Microprocessor configured to generate help instructions for performing data cache fills
CN113795823A (zh) 处理器资源的可编程控制
US6016532A (en) Method for handling data cache misses using help instructions
US20230367600A1 (en) Affinity groups in a micro-operations cache of a processor
EP4250098A1 (en) Multi-indexed micro-operations cache for a processor
US20240118896A1 (en) Dynamic branch capable micro-operations cache
US20230305843A1 (en) Processor micro-operations cache architecture for intermediate instructions
US20230305962A1 (en) Processor micro-operations cache architecture
CN111124494B (zh) 一种cpu中加速无条件跳转的方法及电路
US20230305992A1 (en) Processor using target instructions
US7114062B2 (en) Processor which accelerates execution of binary programs intended for execution on a conventional processor core, using a reconfigurable combinational logic array, a function lookup unit, and a compatible conventional processor core, without requiring recompilation
CN116627505A (zh) 指令缓存及操作方法、处理器核及指令处理方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination