掌桥专利:专业的专利平台
掌桥专利
首页

用于异构计算的系统、方法和装置

文献发布时间:2023-06-19 10:16:30


用于异构计算的系统、方法和装置

本申请是申请日为2016年12月31日、申请号为201680091968.7(PCT国际申请号为PCT/US2016/069640)、名称为“用于异构计算的系统、方法和装置”的发明专利申请的分案申请。

技术领域

本公开内容总体上涉及计算设备领域,具体而言,涉及异构计算方法、设备和系统。

背景技术

在当今的计算机中,CPU执行通用计算任务,例如运行应用软件和操作系统。诸如图形和图像处理之类的专用计算任务由图形处理器、图像处理器、数字信号处理器和固定功能加速器来处理。在当今的异构机器中,每种类型的处理器都以不同的方式编程。

与当今的通用处理器相比,大数据处理时代需要以更低能量实现更高性能。加速器(例如,定制固定功能单元或定制可编程单元)有助于满足这些需求。由于该领域在算法和工作负载方面正在快速发展,所以可用的加速器集合很难进行先验预测,并且极有可能在产品生成中的库存单元间有差异,并且随着产品世代而演进。

发明内容

在一个方面,本申请公开了一种系统,包括:多个异构处理元件;硬件异构调度器,用于分派用于在所述多个异构处理元件中的一个或多个异构处理元件上执行的指令,所述指令对应于将由所述多个异构处理元件中的所述一个或多个异构处理元件处理的代码片段,其中,所述指令对于所述多个异构处理元件中的所述一个或多个异构处理元件中的至少一个异构处理元件而言是本机指令。

附图说明

通过以下结合附图的详细说明将容易理解实施例。为了便于说明,相似的附图标记标明相似的结构元件。在附图的图中,示例性而非限制性示出了实施例。

图1是异构多处理执行环境的表示;

图2是异构多处理执行环境的表示;

图3示出了异构调度器的示例性实施方式;

图4示出了计算机系统的系统引导和设备发现的实施例;

图5示出了基于程序阶段到三类处理元件的映射的线程迁移的示例;

图6是异构调度器执行的示例性实施方式流程;

图7示出了异构调度器的线程目的地选择的方法的示例;

图8示出了对逻辑ID使用条带映射的概念;

图9示出了对逻辑ID使用条带映射的示例;

图10示出了核心组的示例;

图11示出了利用二进制转换器切换机制的系统中的线程执行方法的示例;

图12示出了对加速器的热代码的核心分配的示例性方法;

图13示出了用于唤醒或写入页目录基址寄存器事件的潜在核心分配的示例性方法;

图14示出了串行阶段线程的示例;

图15示出了针对休眠命令事件的线程响应的潜在核心分配的示例性方法;

图16示出了响应于阶段变化事件针对线程的潜在核心分配的示例性方法;

图17示出描绘加速区域的代码的示例;

图18示出了在硬件处理器核心中使用ABEGIN的执行方法的实施例;

图19示出了在硬件处理器核心中使用AEND的执行方法的实施例;

图20示出了使用模式匹配提供ABEGIN/AEND等效的系统;

图21示出了暴露于模式识别的非加速描绘线程的执行方法的实施例;

图22示出了暴露于模式识别的非加速描绘线程的执行方法的实施例;

图23示出了不同类型的存储器依赖性、它们的语义、排序要求和用例;

图24示出了ABEGIN指令指向的存储器数据块的示例;

图25示出了被配置为使用ABEGIN/AEND语义的存储器2503的示例;

图26示出了使用ABEGIN/AEND以不同的执行模式操作的方法的示例;

图27示出了使用ABEGIN/AEND以不同的执行模式操作的方法的示例;

图28示出了一种实施方式的附加细节;

图29示出了加速器的实施例;

图30示出了计算机系统,其包括通过多协议链路耦合到处理器的加速器和一个或多个计算机处理器芯片;

图31示出了根据实施例的设备偏移(device bias)流程;

图32示出了根据一种实施方式的示例性过程;

图33示出了从一个或多个I/O设备释放操作数的过程;

图34示出了使用两种不同类型的工作队列的实施方式;

图35示出了数据流加速器(DSA)设备的实施方式,该DSA设备包括接收通过I/O结构接口提交的描述符的多个工作队列;

图36示出了两个工作队列;

图37示出了使用引擎和分组的另一种配置;

图38示出了描述符的实施方式;

图39示出了完成记录的实施方式;

图40示出了示例性的无操作描述符和无操作完成记录;

图41示出了示例性批次描述符和无操作完成记录;

图42示出了示例性排出描述符和排出完成记录;

图43示出示例性存储器移动描述符和存储器移动完成记录;

图44示出了示例性填充描述符;

图45示出了示例性比较描述符和比较完成记录;

图46示出了示例性比较立即数描述符;

图47示出了示例性创建数据记录描述符和创建增量记录完成记录;

图48示出了增量记录的格式;

图49示出了示例性应用增量记录描述符;

图50示出了使用创建增量记录和应用增量记录操作的一种实施方式;

图51示出了具有双重转换描述符的示例性存储器复制和具有双重转换完成记录的存储器复制;

图52示出了示例性CRC生成描述符和CRC生成完成记录;

图53示出了具有CRC生成描述符的示例性复制;

图54示出了示例性DIF插入描述符和DIF插入完成记录;

图55示出了示例性DIF条带描述符和DIF条带完成记录;

图56示出了示例性DIF更新描述符和DIF更新完成记录;

图57示出了示例性缓存刷新描述符;

图58示出了由ENQCMD生成的64字节的排队存储数据;

图59示出了用以处理MOVDIRI指令的由处理器执行的方法的实施例;

图60示出了用以处理MOVDIRI64B指令的由处理器执行的方法的实施例;

图61示出了用以处理ENCQMD指令的由处理器执行的方法的实施例;

图62示出了ENQCMDS指令的格式;

图63示出了用以处理ENCQMDs指令的由处理器执行的方法的实施例;

图64示出了用以处理UMONITOR指令的由处理器执行的方法的实施例;

图65示出了用以处理UMWAIT指令的由处理器执行的方法的实施例;

图66示出了用以处理TPAUSE指令的由处理器执行的方法的实施例;

图67示出了使用UMWAIT和UMONITOR指令的执行的示例;

图68示出了使用TPAUSE和UMONITOR指令的执行的示例;

图69示出了示例性实施方式,其中加速器通过缓存一致性接口通信地耦合到多个核心;

图70示出了加速器以及先前描述的其他部件的另一视图,包括数据管理单元、多个处理元件和快速片上储存器;

图71示出了由处理元件执行的示例性操作集;

图72a示出了稀疏矩阵A与向量x之间用以产生向量y的乘法的示例;

图72b示出了矩阵A的CSR表示,其中每个值被存储为(值,行索引)对;

图72c示出了使用(值,列索引)对的矩阵A的CSC表示;

图73a、73b和73c示出了每个计算模式的伪代码;

图74示出了数据管理单元和处理元件的一种实施方式的处理流程;

图75a突出显示spMspV_csc和scale_update操作的路径(使用虚线);

图75b示出了spMdV_csr操作的路径;

图76a-b示出了将图表示为邻接矩阵的示例;

图76c示出了顶点程序;

图76d示出了用于执行顶点程序的示例性程序代码;

图76e示出了GSPMV公式化;

图77示出了框架;

图78示出了在每个PE内部提供的可定制逻辑块;

图79示出了每个加速器区块的操作;

图80a总结了模板的一种实施方式的可定制参数;

图80b示出了调整考虑因素;

图81示出了最常见的稀疏矩阵格式之一;

图82示出了使用CRS数据格式实现稀疏矩阵密集向量乘法所涉及的步骤;

图83示出了加速器的实施方式,其包括加速器逻辑管芯和一个或多个DRAM堆叠;

图84a-84b示出了加速器逻辑芯片的一种实施方式,其从顶部透视图穿过DRAM管芯堆叠定向;

图85提供了DPE的高级概览;

图86示出了分块方案的实施方式;

图87示出了块描述符;

图88示出了适合单个点积引擎的缓冲器内的双行矩阵;

图89示出了使用该格式的点积引擎中的硬件的一种实施方式;

图90示出了进行捕获的匹配逻辑单元的内容;

图91示出了根据一种实施方式的支持稀疏矩阵稀疏向量乘法的点积引擎设计的细节;

图92示出了使用特定值的示例;

图93示出了如何组合稀疏密集和稀疏稀疏的点积引擎以产生可以处理两种类型的计算的点积引擎;

图94a示出了具有12个加速器堆叠的插口替换实施方式;

图94b示出了具有处理器/核心集和8个堆叠的多芯片封装(MCP)实施方式;

图95示出了加速器堆叠;

图96示出了旨在位于WIO3 DRAM堆叠下的加速器的潜在布局,包括64个点积引擎、8个向量缓存和集成存储器控制器;

图97比较了七种DRAM技术;

图98a-b示出了堆叠的DRAM;

图99示出了广度优先搜索(BFS)列表;

图100示出了根据一种实施方式的用于指定Lambda函数的描述符的格式;

图101示出了实施例中的头部字的低六字节;

图102示出了矩阵值缓冲区、矩阵索引缓冲区和向量值缓冲区;

图103示出了Lambda数据路径的一种实施方式的细节;

图104示出了指令编码的实施方式;

图105示出了一个特定指令集的编码;

图106示出了示例性比较谓词的编码;

图107示出了使用偏移的实施例;

图108A-108b示出了与基于工作队列的实施方式一起使用的存储器映射I/O(MMIO)空间寄存器;

图109示出了矩阵乘法的示例;

图110示出了具有二叉树缩减网络的octoMADD指令操作;

图111示出了用以处理乘法加法指令的由处理器执行的方法的实施例;

图112示出了用以处理乘法加法指令的由处理器执行的方法的实施例;

图113(A)-113(C)示出了用于执行MADD指令的示例性硬件;

图114示出了硬件异构调度器电路及其与存储器的交互的示例;

图115示出了软件异构调度器的示例;

图116示出了用于系统后引导设备发现的方法的实施例;

图117(A)-(B)示出了共享存储器中的线程的移动的示例;

图118示出了可以由异构调度器执行的用于线程移动的示例性方法;

图119是被配置为呈现如上详述的抽象执行环境的处理器的框图;

图120是示出示例性多芯片配置的简化框图;

图121示出了表示包括多芯片链路(MCL)的示例性实施方式的系统的至少一部分的框图;

图122示出了示例性MCL的示例性逻辑PHY的框图;

图123示出了简化的框图,示出了用于实现MCL的逻辑的另一种表示;

图124示出了当不支持ABEGIN/AEND时的执行示例;

图125是根据本发明一个实施例的寄存器架构的框图;

图126A是示出根据本发明实施例的示例性有序流水线和示例性寄存器重命名、乱序(out-of-order)发布/执行流水线的框图;

图126B是示出根据本发明实施例的要包括在处理器中的有序架构核心和示例性寄存器重命名、乱序发布/执行架构核心的示例性实施例的框图;

图127A-B示出了更具体的示例性有序核心架构的框图,该核心将是芯片中的几个逻辑块之一(包括相同类型和/或不同类型的其他核心);

图128是根据本发明实施例的可以具有多于一个核心、可以具有集成存储器控制器并且可以具有集成图形的处理器的框图;

图129示出了根据本发明的一个实施例的系统的框图;

图130是根据本发明实施例的第一更具体的示例性系统的框图;

图131是根据本发明实施例的第二更具体的示例性系统的框图;

图132是根据本发明实施例的SoC的框图;及

图133是根据本发明实施例的对比使用软件指令转换器将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。

具体实施方式

在以下的详细说明中参考了附图,附图构成说明的一部分,其中,相似的参考标记在通篇中标明相似的部分,在附图中示例性地显示了可以实践的实施例。应理解,在不脱离本公开内容的范围的情况下,可以利用其他实施例,可以做出结构或逻辑变化。因此,以下的详细说明不应视为限制性意义的,实施例的范围由所附权利要求书及其等同变换来限定。

以最有助于理解所要求保护的主题的方式将多个操作描述为依次的多个分离动作或操作。但描述的顺序不应解释为暗示这些操作必定是顺序相关的。具体而言,这些操作可以不按照所呈现的顺序执行。所述的操作可以以不同于所述实施例的顺序执行。在另外的实施例中可以执行多个额外的操作和/或可以省略所述的操作。

对于本公开内容,短语“A和/或B”表示(A)、(B)或(A和B)。对于本公开内容,短语“A、B和/或C”表示(A)、(B)、(C)、(A和B)、(A和C)、(B和C)或(A、B和C)。

本说明书可以使用短语“在一个实施例中”或“在实施例中”,其分别可以指代一个或多个相同或不同实施例。而且,如针对本公开的实施例所使用的术语“包括”、“包含”、“具有”等是同义词。

如在背景技术中所讨论的,部署加速器解决方案并管理可移植地利用加速器的复杂性可能是具有挑战性的,因为存在实现不同混合加速器的各种库存单元和平台。此外,考虑到操作系统(以及版本、补丁等)的多样性,通过设备驱动程序模型部署加速器具有局限性,包括由于开发人员的努力而导致采用的障碍,不可移植性以及大数据处理的严格性能要求。加速器通常是硬件设备(电路),其比在通用处理器上运行的软件更有效地执行功能。例如,硬件加速器可用于改进特定算法/任务(例如视频编码或解码、特定散列函数等)或算法/任务类(例如机器学习、稀疏数据操作、密码、图形、物理、正则表达、分组处理、人工智能、数字信号处理等)的执行。加速器的示例包括但不限于图形处理单元(“GPU”)、固定功能现场可编程门阵列(“FPGA”)加速器和固定功能专用集成电路(“ASIC”)。注意,在一些实施方式中,加速器可以是通用中央处理单元(“CPU”),如果该CPU比系统中的其他处理器更高效。

给定系统(例如,片上系统(“SOC”)、处理器库存单元、机架等)的功率预算可能由仅在可用硅区域的一小部分上的处理元件消耗。这使得构建各种专用硬件块是有利的,这些硬件块减少了特定操作的能量消耗,即使并非所有硬件块都可以同时运行。

详细描述了用于选择处理元件(例如,核心或加速器)以处理线程,与处理元件接口连接和/或管理异构多处理器环境内的功耗的系统、方法和装置的实施例。例如,在各种实施例中,异构多处理器被配置(例如,通过设计或通过软件)以基于线程和/或处理元件的对应工作负载的特性在异构多处理器的不同类型的处理元件之间动态地迁移线程,为一个或多个处理元件提供编程接口,转换代码以便在特定处理元件上执行,基于工作负载和所选处理元件的特性选择与所选处理元件一起使用的通信协议,或实现这些操作的组合。

在第一方面,工作负载分派接口,即异构调度器,向系统程序员呈现同构多处理器编程模型。特别地,该方面可以使程序员能够开发针对特定架构或等效抽象的软件,同时促进对底层硬件的持续改进,而无需对所开发的软件进行相应的改变。

在第二方面,多协议链路允许第一实体(诸如异构调度器)使用与通信相关联的协议与多个设备通信。这取代了具有用于设备通信的单独链路的需要。特别是,该链路具有在其上动态多路复用的三个或更多个协议。例如,公共链路支持以下协议:1)生产者/消费者、发现、配置、中断(PDCI)协议,以启用设备发现、设备配置、错误报告、中断、DMA样式数据传输和各种服务,如可以在一个或多个专有或行业标准中指定的(例如,PCI Express规范或等效替代方案);2)缓存代理一致性(CAC)协议,以使设备能够向处理元件发出一致的读写请求;以及3)存储器访问(MA)协议,以使处理元件能够访问另一个处理元件的本地存储器。

在第三方面,线程或其部分的调度、迁移或仿真是基于线程的阶段完成的。例如,通常将线程的数据并行阶段调度或迁移到SIMD核心;通常将线程的线程并行阶段调度或迁移到一个或多个标量核心;通常将串行阶段调度或迁移到乱序核心。每种核心类型最小化能量或延迟,这两者都被考虑以进行线程的调度、迁移或仿真。如果调度或迁移是不可能的或不利的,则可以使用仿真。

在第四方面,线程或其部分被机会性地卸载到加速器。特别地,线程的加速器开始(ABEGIN)指令和加速器结束(AEND)指令或其部分之间是(bookend)可以在加速器上执行的指令。如果加速器不可用,则ABEGIN和AEND之间的指令将照常执行。但是,当加速器可用并且希望使用加速器(例如,使用更少的功率)时,则ABEGIN和AEND指令之间的指令被转换为在该加速器上执行并被调度在该加速器上执行。因此,加速器的使用是机会性的。

在第五方面,分析线程或其部分以(机会性)卸载到加速器而不使用ABEGIN或AEND。对于可在加速器上执行的代码,针对线程或其部分运行软件或硬件、模式匹配。如果加速器不可用,或者线程或其部分不适于加速器执行,则线程的指令照常执行。然而,当加速器可用并且希望使用加速器(例如,使用更少的功率)时,则指令被转换为在该加速器上执行并被调度在该加速器上执行。因此,加速器的使用是机会性的。

在第六方面,执行代码片段(线程的一部分)的转换以更好地适合所选择的目的地处理元件。例如,代码片段:1)被转换以利用不同的指令集,2)被使得更多并行,3)被使得更少并行(串行化),4)被使得数据并行(例如,向量化),和/或5)被使得数据并行更少(例如,非向量化)。

在第七方面,工作队列(共享或专用的)接收描述符,该描述符定义要由设备完成的工作范围。专用工作队列存储单个应用程序的描述符,而共享工作队列存储由多个应用程序提交的描述符。硬件接口/仲裁器根据指定的仲裁策略(例如,基于每个应用的处理要求和QoS/公平性策略)将描述符从工作队列分派到加速器处理引擎。

在第八方面,密集矩阵乘法的改进允许利用单个指令的执行的二维矩阵乘法。多个打包数据(SIMD、向量)源与单个打包数据源相乘。在某些情况下,二叉树用于乘法。

图1是异构多处理执行环境的表示。在该示例中,异构调度器101接收第一类型的代码片段(例如,与软件线程相关联的一个或多个指令)。代码片段可以是任何数量的源代码表示的形式,包括,例如,机器代码、中间表示、字节代码、基于文本的代码(例如,汇编代码,诸如C++的高级语言的源代码)等。异构调度器101呈现同构多处理器编程模型(例如,使得所有线程对用户和/或操作系统而言看起来像是在标量核心上执行,并确定接收到的代码片段的工作负载类型(程序阶段),选择对应于确定的工作负载类型的一种类型的处理元件(标量、乱序(OOO)、单指令多数据(SIMD)或加速器)以处理工作负载(例如,用于线程并行代码的标量,用于串行代码的OOO,用于数据并行的SIMD和用于数据并行的加速器),并调度代码片段以由相应的处理元件处理。在图1所示的具体实施方式中,处理元件类型包括标量核心103(诸如有序核心),单指令多数据(SIMD)核心105,其对打包数据操作数进行操作,其中,寄存器具有连续存储的多个数据元素,低延迟、乱序核心107和加速器109。在一些实施例中,标量核心103,单指令多数据(SIMD)核心105,低延迟、乱序核心107在异构处理器中,并且加速器109在该异构处理器外部。然而,应该注意,可以使用各种不同的处理元件布置。在一些实施方式中,异构调度器101将所接收的代码片段或其一部分转换或解译为与所选类型的处理元件相对应的格式。

处理元件103-109可以支持不同的指令集架构(ISA)。例如,乱序核心可以支持第一ISA,而有序核心可以支持第二ISA。该第二ISA可以是第一ISA的集合(子集或超集),或者是不同的。另外,处理元件可以具有不同的微架构。例如,第一个乱序核心支持第一微架构,而有序核心支持不同的第二微架构。注意,即使在特定类型的处理元件内,ISA和微架构也可以不同。例如,第一乱序核心可以支持第一微架构,而第二乱序核心可以支持不同的微架构。指令是特定ISA“固有”的,因为它们是ISA的一部分。固有指令在特定的微架构上执行而无需外部更改(例如,转换)。

在一些实施方式中,一个或多个处理元件集成在单个管芯上,例如,作为片上系统(SoC)。这样的实施方式可以例如从改进的通信延迟、制造/成本、减少的引脚数量、平台小型化等方面受益。在其他实施方式中,处理元件被封装在一起,从而实现上面提到的SoC的一个或多个益处而无需在单个管芯上。这些实施方式可以进一步例如从针对每个处理元件类型优化的不同处理技术、用于增加产量的更小管芯尺寸、集成专有知识产权块等方面受益。在一些传统的多封装限制中,与添加的不同设备通信可能是具有挑战性的。本文讨论的多协议链路通过向用户、操作系统(“OS”)等呈现用于不同类型的设备的公共接口来最小化或减轻该挑战。

在一些实施方式中,异构调度器101在存储在计算机可读介质(例如,存储器)中的软件中实现,用于在处理器核心(例如OOO核心107)上执行。在这些实施方式中,异构调度器101被称为软件异构调度器。该软件可以实现二进制转换器,即时(“JIT”)编译器,OS 117以调度线程的执行,线程包括代码片段、模式匹配器、其中的模块部件或其组合。

在一些实施方式中,异构调度器101在硬件中实现为电路和/或由电路执行的有限状态机。在这些实施方式中,异构调度器101被称为硬件异构调度器。

从编程(例如,OS 117、仿真层、监管程序、安全监视器等)的观点来看,每种类型的处理元件103-109利用共享存储器地址空间115。在一些实施方式中,共享存储器地址空间115可选地包括两种类型的存储器,存储器211和存储器213,如图2所示。在这样的实施方式中,可以以各种方式区分存储器的类型,包括但不限于:存储器位置的差异(例如,位于不同的插口上等),对应的接口标准的差异(例如,DDR4、DDR5等),功率要求的差异和/或所使用的底层存储器技术的差异(例如,高带宽存储器(HBM)、同步DRAM等)。

共享存储器地址空间115可由每种类型的处理元件访问。然而,在一些实施例中,可以优选地将不同类型的存储器分配给不同的处理元件,例如,基于工作负载需求。例如,在一些实施方式中,平台固件接口(例如,BIOS或UEFI)或存储器储存设备包括用于指示平台中可用的存储器资源的类型和/或针对某些地址范围或存储器类型的处理元件亲和性(affinity)的字段。

异构调度器101在分析线程时利用该信息来确定在给定时间点应该在何处执行线程。通常,线程管理机制查看其可用的全部信息,以便就如何管理现有线程做出明智的决定。这可能以多种方式表现出来。例如,在对物理上更接近处理元件的地址范围具有亲和性的特定处理元件上执行的线程可以相对于在正常情况下将在处理元件上执行的线程被给予优先处理。

另一个示例是将受益于特定存储器类型(例如,DRAM的更快版本)的线程可以使其数据物理地移动到该存储器类型,并且将代码中的存储器引用调整为指向共享地址空间的该部分。例如,虽然SIMD核心205上的线程可以使用第二存储器类型213,但是当加速器209处于活动状态并且需要该存储器类型213(或者至少需要分配给SIMD核心205的线程的部分)时,该线程可以从该使用中移开。

示例性场景是存储器在物理上更接近一个处理元件(相比其他处理元件)时的情况。常见的情况是加速器直接连接到与核心不同的存储器类型。

在这些示例中,通常是OS发起数据移动。然而,没有什么能阻止较低级别(例如异构调度器)自己或者在另一个部件(例如,OS)的帮助下执行该功能。是否刷新先前处理元件的数据并且使页表条目无效取决于实施方式和进行数据移动的惩罚。如果数据不太可能立即使用,则简单地从储存器复制而不是将数据从一种存储器类型移动到另一种存储器类型可能更为可行。

图117(A)-(B)示出了共享存储器中的线程的移动的示例。在该示例中,两种类型的存储器共享地址空间,这两种类型的存储器分别在该空间内具有其自己的地址范围。在117(A)中,共享存储器11715包括第一类型的存储器11701和第二类型的存储器11707。第一类型的存储器11701具有第一地址范围11703,并且在该范围内是专用于线程1 11705的地址。存储器类型11707具有第二地址范围11709。

在线程1 11705的执行期间的某个时刻,异构调度器做出移动线程111705的决定,使得第二线程11711使用先前分配给线程1 11705的第一类型的存储器11701中的地址。这在图117(B)中被示出。在该示例中,线程1 11705被重新分配到第二类型的存储器11707中并且被给予要使用的新地址集;然而不一定是这种情况。注意,存储器类型之间的差异可以是物理的或空间的(例如,基于到PE的距离)。

图118示出了可以由异构调度器执行的用于线程移动的示例性方法。在11801处,引导第一线程使用共享存储器空间中的第一类型存储器在诸如核心或加速器的第一处理元件(“PE”)上执行。例如,在图117(A)中这是线程1。

在稍后的某个时刻,在11803处接收执行第二线程的请求。例如,应用程序、OS等请求执行硬件线程。

在11805处确定第二线程应该使用共享地址空间中的第一类型的存储器在第二PE上执行。例如,第二线程将在直接耦合到第一类型的存储器的加速器上运行,并且该执行(包括释放第一线程正在使用的存储器)比让第二线程使用第二类型的存储器更有效。

在一些实施例中,在11807处第一线程的数据从第一类型的存储器移动到第二类型的存储器。如果简单地停止执行第一线程的执行并在其位置启动另一个线程更有效,则不一定发生这种情况。

在11809处,使与第一线程相关联的转换后备缓冲器(TLB)条目无效。另外,在大多数实施例中,执行数据的刷新。

在11811处,第二线程被引导到第二PE,并且被分配先前分配给第一线程的第一类型的存储器中的地址范围。

图3示出了异构调度器301的示例性实施方式。在一些实例中,调度器301是运行时系统的一部分。如图所示,程序阶段检测器313接收代码片段,并识别代码片段的一个或多个特征,以确定相应的程序执行阶段是否最佳地表征为串行、数据并行或线程并行。下面详细说明如何确定这一点的示例。如关于图1详细描述的,代码片段可以是任何数量的源代码表示的形式。

对于反复出现的代码片段,模式匹配器311识别该“热”代码,并且在一些实例中,还识别指示与代码片段相关联的工作负载可能更适合于在不同处理元件上进行处理的相应特性。例如,下面在图20的上下文中阐述与模式匹配器311及其操作有关的进一步细节。

选择器309至少部分地基于处理元件的特性和由功率管理器307提供的热和/或功率信息,来选择目标处理元件以执行所接收的代码片段的本机表示。选择目标处理元件可以简化为选择对于代码片段而言最适合的目标处理元件(即,工作负载特性和处理元件能力之间的匹配),但也可以考虑系统的当前功耗级别(例如,可以由功率管理器307提供)、处理元件的可用性、从一种类型的存储器移动到另一种类型的存储器的数据量(以及这样做的相关惩罚)等。在一些实施例中,选择器309是在硬件电路中实现或由硬件电路执行的有限状态机。

在一些实施例中,选择器309还选择用于与目标处理元件通信的相应链路协议。例如,在一些实施方式中,处理元件利用能够在系统结构或点对点互连上动态地复用或封装多个协议的相应公共链路接口。例如,在某些实施方式中,所支持的协议包括:1)生产者/消费者、发现、配置、中断(PDCI)协议,以实现设备发现、设备配置、错误报告、中断、DMA样式数据传输和各种服务,如可以在一个或多个专有或行业标准中指定的(例如,PCI Express规范或等同替代);2)缓存代理一致性(CAC)协议,使设备能够向处理元件发出一致的读写请求;以及3)存储器访问(MA)协议,以使处理元件能够访问另一个处理元件的本地存储器。选择器309基于要传送到处理元件的请求的类型在这些协议之间做出选择。例如,生产者/消费者、发现、配置或中断请求使用PDCI协议,缓存一致性请求使用CAC协议,本地存储器访问请求使用MA协议。

在一些实施方式中,线程包括用于指示阶段类型的标记,因此不使用阶段检测器。在一些实施方式中,线程包括对处理元件类型、链接协议和/或存储器类型的提示或显式请求。在这些实施方式中,选择器309在其选择过程中利用该信息。例如,选择器309的选择可以被线程和/或用户覆盖。

根据实施方式,异构调度器可以包括一个或多个转换器以处理所接收的代码片段并为目标处理元件生成相应的本机编码。例如,异构调度器可以包括转换器,用于将第一类型的机器代码转换为第二类型的机器代码;和/或即时编译器,用于将中间表示转换为目标处理元件的本地格式。替代地或另外,异构调度器可以包括模式匹配器,用于识别反复出现的代码片段(即,“热”代码)并缓存代码片段或相应的微操作的一个或多个本机编码。这些可选部件中的每一个在图3中示出。具体地,异构调度器301包括转换器303和即时编译器305。当异构调度器301对目标代码或中间表示进行操作时,即时编译器305被调用以将所接收的代码片段转换为一个或多个目标处理元件103、105、107、109的本地格式。当异构调度器301对机器代码(二进制)进行操作时,二进制转换器303将所接收的代码片段转换为一个或多个目标处理元件的本地机器代码(例如,当从一个指令集转换到另一个指令集时)。在替代实施例中,异构调度器301可以省略这些部件中的一个或多个。

例如,在一些实施例中,不包括二进制转换器。这可能导致编程复杂性增加,因为程序需要考虑潜在可用的加速器、核心等,而不是让调度器处理这个问题。例如,程序可能需要包括用于不同格式的例程的代码。然而,在一些实施例中,当不存在二进制转换器时,存在JIT编译器,其接受更高级别的代码,并且JIT编译器执行必要的转换。当存在模式匹配器时,仍然可以检测到热代码以找到应该在特定处理元件上运行的代码。

例如,在一些实施例中,不包括JIT编译器。这也可能导致编程复杂性增加,因为程序需要首先被编译成特定ISA的机器代码,而不是让调度器处理这个问题。然而,在一些实施例中,当存在二进制转换器且没有JIT编译器时,调度器可以在ISA之间进行转换,如下所述。当存在模式匹配器时,仍然可以检测到热代码以找到应该在特定处理元件上运行的代码。

例如,在一些实施例中,不包括模式匹配器。这也可能导致效率降低,因为可能已移动的代码更有可能停留在用于正在运行的特定任务的较低效核心上。

在一些实施例中,不存在二进制转换器、JIT编译器或模式匹配器。在这些实施例中,在线程/处理元件分配/迁移中仅利用移动线程的阶段检测或显式请求。

再次参考图1-3,异构调度器101可以用硬件(例如,电路)、软件(例如,可执行程序代码)或其任何组合来实现。图114示出了硬件异构调度器电路及其与存储器的交互的示例。异构调度器可以以许多不同的方式制造,包括但不限于:作为基于现场可编程门阵列(FPGA)或基于专用集成电路(ASIC)的状态机;作为耦合到存储器的嵌入式微控制器(存储器中存储有软件以提供本文详述的功能)、包括其他子部件的逻辑电路(例如,数据危险检测电路等);和/或作为由乱序核心执行的软件(例如,状态机)、由标量核心执行的软件(例如,状态机)、由SIMD核心执行的软件(例如,状态机)或其组合。在所示示例中,异构调度器是电路11401,其包括用于执行各种功能的一个或多个部件。在一些实施例中,该电路11401是处理器核心11419的一部分,然而,它可以是芯片组的一部分。

线程/处理元件(PE)跟踪器11403维护在系统和每个PE中执行的每个线程的状态(例如,PE的可用性、其当前功耗等)。例如,跟踪器11403在诸如表格的数据结构中维护活动、空闲或非活动的状态。

在一些实施例中,模式匹配器11405识别“热”代码、加速器代码和/或请求PE分配的代码。稍后将提供有关此匹配的更多详细信息。

PE信息11409存储关于什么PE(及其类型)在系统中并且可以由OS调度等的信息。

虽然以上详述为异构调度器电路11401内的分离部件,但是部件可以组合和/或移动到异构调度器电路11401之外。

耦合到异构调度器电路11401的存储器11413可以包括用于(由核心和/或异构调度器电路11401)执行提供附加功能的软件。例如,可以使用软件模式匹配器11417,其识别“热”代码、加速器代码和/或请求PE分配的代码。例如,软件模式匹配器11417将代码序列与存储在存储器中的预定模式集进行比较。存储器还可以存储转换器以将代码从一个指令集转换为另一个指令集(例如从一个指令集转换为基于加速器的指令或基元(primitives))。

这些部件馈送信息给选择器11411,该选择器11411做出关于以下项的选择:执行线程的PE、使用什么链路协议、如果在该PE上已经有线程在执行则应该发生什么迁移等等。在一些实施例中,选择器11411是在硬件电路中实现或由硬件电路执行的有限状态机。

例如在一些实施方式中,存储器11413还可以包括一个或多个转换器11415(例如,二进制、JIT编译器等)被存储在存储器中以将线程代码转换为用于所选PE的不同格式。

图115示出了软件异构调度器的示例。软件异构调度器可以以许多不同的方式制造,包括但不限于:作为基于现场可编程门阵列(FPGA)或基于专用集成电路(ASIC)的状态机;作为耦合到存储器的嵌入式微控制器(存储器中存储有软件以提供本文详述的功能),包括其他子部件的逻辑电路(例如,数据危险检测电路等);和/或作为由乱序核心执行的软件(例如,状态机)、由标量核心执行的软件(例如,状态机)、由SIMD核心执行的软件(例如,状态机)或其组合。在所示示例中,软件异构调度器被存储在存储器11413中。这样,耦合到处理器核心11419的存储器11413包括用于(由核心)执行以调度线程的软件。在一些实施例中,软件异构调度器是OS的一部分。

取决于实施方式,核心中的线程/处理元件(PE)跟踪器11403维护在系统和每个PE中执行的每个线程的状态(例如,PE的可用性、其当前功耗等)或者这在使用线程/PE跟踪器11521的软件中执行。例如,跟踪器在诸如表的数据结构中维护活动、空闲或非活动的状态。

在一些实施例中,模式匹配器11405识别“热”代码和/或请求PE分配的代码。稍后将提供有关此匹配的更多详细信息。

PE信息11409和/或11509存储关于什么PE在系统中并且可以由OS调度等的信息。

软件模式匹配器11417可用于识别“热”代码、加速器代码和/或请求PE分配的代码。

线程/PE跟踪器、处理元件信息和/或模式匹配被馈送到选择器11411,选择器11411做出关于以下项的选择:执行线程的PE,使用什么链路协议,如果在该PE上已经有线程在执行则应该发生什么迁移等。在一些实施例中,选择器11411是由处理器核心11419执行实现的有限状态机。

例如,在一些实施方式中,存储器11413还可以包括一个或多个转换器11415(例如,二进制,JIT编译器等)被存储在存储器中以将线程代码转换为用于所选PE的不同格式。

在操作中,OS利用异构调度器(例如,异构调度器101、301)来调度线程并使得线程被处理,其呈现执行环境的抽象。

下表总结了潜在的抽象特征(即,程序看到的内容)、潜在的设计自由度和架构优化(即,对程序员隐藏的内容)、以及在抽象中提供特定特征的潜在益处或原因。

在一些示例性实施方式中,异构调度器结合其他硬件和软件资源呈现完整编程模型,其运行所有内容并支持所有编程技术(例如,编译器、内在函数(intrinsics)、汇编、库、JIT、卸载(offload)、设备)。其他示例性实施方式呈现符合由其他处理器开发公司(例如ARM Holdings,Ltd.、MIPS、IBM或其许可者或采用者)提供的那些的替代执行环境。

图119是被配置为呈现如上详述的抽象执行环境的处理器的框图。在该示例中,处理器11901包括几个不同的核心类型,诸如图1中详细描述的。每个(宽)SIMD核心11903包括支持密集算术基元的融合乘法累加/加法(FMA)电路、其自己的缓存(例如,L1和L2)、专用执行电路、和用于线程状态的储存器。

每个延迟优化的(OOO)核心11913包括融合乘法累加/加法(FMA)电路、其自己的缓存(例如,L1和L2)、以及乱序执行电路。

每个标量核心11905包括融合乘法累加/加法(FMA)电路、其自己的缓存(例如,L1和L2)、专用执行,并且存储线程状态。通常,标量核心11905支持足够的线程以覆盖存储器延迟。在一些实施方式中,与标量核心11905的数量相比,SIMD核心11903和延迟优化的核心11913的数量较少。

在一些实施例中,包括一个或多个加速器11905。这些加速器11905可以是固定功能的或基于FPGA的。替代地,或除了这些加速器11905之外,在一些实施例中,加速器11905在处理器外部。

处理器11901还包括由核心共享的最后级缓存(LLC)11907以及处理器中可能的任何加速器。在一些实施例中,LLC 11907包括用于快速原子(fast atomics)的电路。

一个或多个互连11915将核心和加速器彼此耦合以及与外部接口耦合。例如,在一些实施例中,网状互连耦合各种核心。

存储器控制器11909将核心和/或加速器耦合到存储器。

多个输入/输出接口(例如,PCIe,下面详述的公共链路)11911将处理器11901连接到诸如其他处理器和加速器的外部设备。

图4示出了计算机系统的系统引导和设备发现的实施例。异构调度器使用系统的知识,包括例如何种核心可用、多少存储器可用、相对于核心的存储器位置等。在一些实施例中,使用高级配置和功率接口(ACPI)来构建该知识。

在401处,计算机系统被引导(booted)。

在403处进行配置设置的查询。例如,在一些基于BIOS的系统中,当被引导时,BIOS通过查询其自己的存储体以找到驱动和其他配置设置,来测试系统并使计算机准备好进行操作。

在405处进行对插入部件的搜索。例如,BIOS搜索计算机中的任何插入部件并在存储器中设置指针(中断向量)用以访问这些例程。BIOS接受来自设备驱动程序以及用于与硬件和其他外围设备接口的应用程序的请求。

在407处,生成系统部件(例如,核心、存储器等)的数据结构。例如,BIOS通常生成硬件设备和外围设备配置信息,根据此信息,OS与所附接的设备接口。此外,ACPI为系统板定义了灵活且可扩展的硬件接口,并使计算机能够打开和关闭其外围设备以改进功率管理,尤其是在便携式设备(如笔记本电脑)中。ACPI规范包括硬件接口、软件接口(API)和数据结构,这些数据结构在被实现时支持OS指向的配置和功率管理。软件设计人员可以使用ACPI在整个计算机系统(包括硬件、操作系统和应用软件)中集成功率管理功能。此集成使OS能够确定哪些设备处于活动状态,并处理计算机子系统和外围设备的所有功率管理资源。

在409处,操作系统(OS)被加载并获得控制。例如,一旦BIOS完成其启动例程,它就会将控制传递给OS。当ACPI BIOS将对计算机的控制传递给OS时,BIOS将包含ACPI名称空间的数据结构导出到OS,该数据结构可以用图的方式表示为树。名称空间充当连接到计算机的ACPI设备的目录,并包括进一步定义或提供每个ACPI设备的状态信息的对象。树中的每个节点与设备相关联,而节点、子节点和叶子表示在由OS评估时将控制设备或将指定信息返回到OS的对象,如ACPI规范所定义的。OS或OS所访问的驱动程序可以包括列举和评估名称空间对象的函数集。当OS调用函数以返回ACPI名称空间中的对象的值时,OS被称为评估该对象。

在某些情况下,可用设备会改变。例如,添加加速器、存储器等。在图116中示出用于系统后引导设备发现的方法的实施例。例如,该方法的实施例可用于发现在引导后添加到系统的加速器。在11601处接收关于所连接的设备被加电或重置的指示。例如,端点设备被插入PCIe插槽中,或者例如由OS重置。

在11603处,结合连接的设备执行链路训练,并且初始化连接的设备。例如,执行PCIe链路训练以建立链路配置参数,例如链路宽度、通道极性和/或最大支持数据速率。在一些实施例中,(例如,在ACPI表中)存储所连接设备的能力。

当连接的设备完成初始化时,在11605,从连接的设备向系统发送就绪消息。

在11607处,设置连接的设备就绪状态位以指示设备准备好进行配置。

在11609处配置经初始化的连接的设备。在一些实施例中,设备和OS就设备的地址(例如,存储器映射的I/O(MMIO)地址)达成一致。该设备提供设备描述符,其包括以下项中的一个或多个:供应商标识号(ID)、设备ID、型号、序列号、特性、资源要求等。OS可以基于描述符数据和系统资源来确定设备的附加操作和配置参数。OS可以生成配置查询。设备可以用设备描述符进行响应。然后,OS生成配置数据并将该数据发送到设备(例如,通过PCI硬件)。这可以包括设置基地址寄存器以定义与设备相关联的地址空间。

在构建系统的知识之后,OS利用异构调度器(例如,异构调度器101、301)调度线程并使得线程被处理。异构调度器然后动态且透明地(例如,到用户和/或OS)将每个线程的代码片段映射到最合适类型的处理元件,从而可能避免为传统架构特征构建硬件的需要,以及可能避免将微架构的细节暴露给系统程序员或OS的需要。

在一些示例中,基于处理元件的能力和代码片段的执行特性来确定最合适类型的处理元件。通常,程序和相关联的线程可以具有不同的执行特性,这取决于在给定时间点处理的工作负载。示例性执行特征或执行阶段包括例如数据并行阶段、线程并行阶段和串行阶段。下表列出了这些阶段并总结了它们的特性。该表还包括示例性工作负载/操作,在处理每个阶段类型中有用的示例性硬件,以及所使用的阶段和硬件的典型目标。

在一些实施方式中,异构调度器被配置为在线程迁移和仿真之间进行选择。在每类处理元件可以处理任何类型的工作负载(有时需要仿真这样做)的配置中,基于一个或多个标准为每个程序阶段选择最合适的处理元件,标准包括例如,工作负载的延迟要求,与仿真相关的增大的执行延迟,处理元件的功率和热特性以及约束等。稍后将详细描述,在一些实施方式中,通过考虑运行的线程的数量并检测代码片段中SIMD指令或可向量化代码的存在,来完成对合适的处理元件的选择。

在处理元件之间移动线程不是没有惩罚的。例如,可能需要将数据从共享缓存移动到较低级缓存中,并且原始处理元件和接收方处理元件都将刷新它们的流水线以适应移动。因此,在一些实施方式中,异构调度器实现滞后以避免过于频繁的迁移(例如,通过为上面提及的一个或多个标准或其子集设置阈值)。在一些实施例中,通过将线程迁移限制为不超过预定义的速率(例如,每毫秒一次迁移)来实现滞后。因此,迁移速率受到限制,以避免由于代码生成、同步和数据迁移而导致的过度过载。

在一些实施例中,例如,当异构调度器未选择迁移作为特定线程的优选方法时,异构调度器在所分配的处理元件中模拟(emulate)线程的缺失功能。例如,在操作系统可用的线程总数保持不变的实施例中,当可用的硬件线程的数目(例如,在宽同步多线程核心中)被超额认订(oversubscribed)时,异构调度器可以模拟多线程。在标量或延迟核心上,线程的一个或多个SIMD指令被转换为标量指令,或者在SIMD核心上产生更多线程和/或转换指令以利用打包数据。

图5示出了基于程序阶段到三种类型的处理元件的映射的线程迁移的示例。如图所示,三种类型的处理元件包括延迟优化(例如,乱序核心、加速器等)、标量(每个指令一次处理一个数据项)和SIMD(每个指令处理多个数据元素)。通常,该映射由异构调度器基于每个线程或代码片段以对程序员和操作系统透明的方式执行。

一种实施方式使用异构调度器将工作负载的每个阶段映射到最合适类型的处理元件。理想情况下,这减轻了为传统功能构建硬件的需要,并避免暴露微架构的细节,因为异构调度器提供了支持多种代码类型的完整编程模型,代码类型例如:编译代码(机器代码)、内在函数(映射指向处理器或加速器指令的编程语言构造)、汇编代码、库、中间代码(intermediate)(基于JIT),卸载(从一种机器类型移动到另一种机器类型)和设备特定的代码。

在某些配置中,目标处理元件的默认选择是延迟优化的处理元件。

再次参考图5,最初在一个或多个延迟优化的处理元件上处理工作负载的串行执行阶段501。在检测到阶段移动时(例如,随着代码变得更为数据并行而以动态方式移动,或者在执行之前移动,例如,由在执行之前或执行期间在代码中发现的指令的类型所见的),工作负载被迁移到一个或多个SIMD处理元件以完成数据并行执行阶段503。另外,通常缓存执行调度和/或转换。此后,工作负载被迁移回一个或多个延迟优化的处理元件,或迁移到第二组一个或多个延迟优化的处理元件,以完成下一个串行执行阶段505。接下来,工作负载被迁移到一个或多个标量核心用于处理线程并行执行阶段507。然后,工作负载被迁移回一个或多个延迟优化的处理元件,以完成下一个串行执行阶段509。

虽然该说明性示例示出了返回到延迟优化的核心,但是异构调度器可以继续在一个或多个对应类型的处理元件上执行任何后续执行阶段,直到线程被终止。在一些实施方式中,处理元件利用工作队列来存储要完成的任务。因此,任务可能不会立即开始,而是当其在队列中的位置到达时被执行。

图6是例如异构调度器(例如异构调度器101)执行的示例性实施方式流程。该流程描述了处理元件(例如,核心)的选择。如图所示,异构调度器接收代码片段。在一些实施例中,已发生事件,包括但不限于:线程唤醒命令;写入页目录基址寄存器;休眠命令;线程的阶段变化;以及指示所需重新分配的一个或多个指令。

在601处,异构调度器确定代码片段中是否存在并行性(例如,是串行阶段或并行阶段中的代码片段),例如,基于检测到的数据依赖性、指令类型和/或控制流指令。例如,充满SIMD代码的线程将被视为并行。如果代码片段不适合于并行处理,则异构调度器选择一个或多个延迟敏感处理元件(例如,OOO核心)以在串行执行阶段603处理代码片段。通常,OOO核心具有(深度)推测和动态调度,并且与更简单的替代方案相比,通常具有更低的每瓦性能。

在一些实施例中,没有可用的延迟敏感处理元件,因为它们通常比标量核心消耗更多的功率和管芯空间。在这些实施例中,只有标量、SIMD和加速器核心可用。

对于并行代码片段、可并行化代码片段和/或可向量化代码片段,在605处异构调度器确定代码的并行性类型。对于线程并行代码片段,在607处,异构调度器选择线程并行处理元件(例如,多处理器标量核心)。线程并行代码片段包括可以在单独的标量核心上同时执行的独立指令序列。

当每个处理元件对不同的数据片段执行相同的任务时,出现数据并行代码。数据并行代码可以有不同的数据布局:打包和随机。在609处确定数据布局。随机数据可以被分配给SIMD处理元件,但是需要利用用于从不同的存储器位置抽取数据的收集指令613、空间计算阵列615(将计算在空间上映射到小的可编程处理元件阵列上,例如,FPGA阵列)、或标量处理元件阵列617。在611处,将打包数据分配给SIMD处理元件或使用密集算术基元的处理元件。

在一些实施例中,执行代码片段的转换以更好地适合所选择的目的地处理元件。例如,代码片段是:1)被转换以利用不同的指令集,2)被使得更多并行,3)被使得更少并行(串行化),4)被使得数据并行(例如,向量化),和/或5)被使得更少数据并行(例如,非向量化)。

在选择处理元件之后,将代码片段传送到所确定的处理元件之一以供执行。

图7示出了异构调度器的线程目的地选择的方法的示例。在一些实施例中,该方法由二进制转换器执行。在701处,接收要评估的线程或其代码片段。在一些实施例中,已发生事件,包括但不限于:线程唤醒命令;写入页目录基址寄存器;休眠命令;线程的阶段变化;以及指示所需重新分配的一个或多个指令。

在703处确定是否要将代码片段卸载到加速器。例如,是否要将代码片段发送到加速器。当代码包括标识使用加速器的期望的代码时,异构调度器可以知道这是正确的操作。该期望可以是指示代码区域可以在加速器上执行或本地执行的标识符(例如,本文描述的ABEGIN/AEND)或使用特定加速器的显式命令。

在一些实施例中,在705处执行代码片段的转换以更好地适合所选择的目的地处理元件。例如,代码片段是:1)被转换以利用不同的指令集,2)被使得更多并行,3)被使得更少并行(串行化),4)被使得数据并行(例如,向量化),和/或5)被使得更少数据并行(例如,非向量化)。

通常,经转换的线程在707处被缓存以供以后使用。在一些实施例中,二进制转换器在本地缓存经转换的线程,使得它可用于二进制转换器在将来的使用。例如,如果代码变为“热”代码(重复执行),则缓存提供用于将来使用的机制而没有转换惩罚(尽管可能存在传输成本)。

在709处将(经转换的)线程传送(例如,卸载)到目的地处理元件以进行处理。在一些实施例中,经转换的线程由接收者缓存,使得其在本地可用于将来使用。同样,如果接收方或二进制转换器确定代码为“热”代码,则此缓存将使用更少的能量来实现更快的执行。

在711处,异构调度器确定代码片段中是否存在并行性(例如,是串行阶段还是并行阶段中的代码片段),例如,基于检测到的数据依赖性、指令类型和/或控制流指令。例如,充满SIMD代码的线程将被视为并行的。如果代码片段不适合于并行处理,则异构调度器选择一个或多个延迟敏感处理元件(例如,OOO核心)以在串行执行阶段713处理代码片段。通常,OOO核心具有(深度)推测和动态调度并且因此与标量替代方案相比,可能具有更好的每瓦性能。

在一些实施例中,没有可用的延迟敏感处理元件,因为它们通常比标量核心消耗更多的功率和管芯空间。在这些实施例中,只有标量、SIMD和加速器核心可用。

对于并行代码片段、可并行化代码片段和/或可向量化代码片段,在715处异构调度器确定代码的并行性类型。对于线程并行代码片段,在717处,异构调度器选择线程并行处理元件(例如,多处理器标量核心)。线程并行代码片段包括可以在单独的标量核心上同时执行的独立指令序列。

当每个处理元件对不同的数据片段执行相同的任务时,出现数据并行代码。数据并行代码可以有不同的数据布局:打包和随机。在719处确定数据布局。随机数据可以被分配给SIMD处理元件,但是需要利用收集指令723、空间计算阵列725或标量处理元件阵列727。在721处,将打包数据分配给SIMD处理元件或使用密集算术基元的处理元件。

在一些实施例中,执行非卸载代码片段的转换以更好地适合所确定的目的地处理元件。例如,代码片段是:1)被转换以利用不同的指令集,2)被使得更多并行,3)被使得更少并行(串行化),4)被使得数据并行(例如,向量化),和/或5)被使得更少数据并行(例如,非向量化)。

在选择处理元件之后,将代码片段传送到所确定的处理元件之一以供执行。

OS看到可能可用的线程总数,而不管可访问哪些核心和加速器。在以下描述中,每个线程由称为逻辑ID的线程标识符(ID)列举。在一些实施方式中,操作系统和/或异构调度器利用用于将线程映射到特定处理元件类型(例如,核心类型)的逻辑ID、处理元件ID和该处理元件上的线程ID(例如,核心类型、核心ID、线程ID的元组)。例如,标量核心具有核心ID和一个或多个线程ID;SIMD核心具有核心ID和一个或多个线程ID;OOO核心具有核心ID和一个或多个线程ID;和/或加速器具有核心ID和一个或多个线程ID。

图8示出了对逻辑ID使用条带映射的概念。条带映射可以由异构调度器使用。在此示例中,存在8个逻辑ID和3个核心类型,每个核心类型具有一个或多个线程。通常,从逻辑ID到(核心ID,线程ID)的映射是通过除法和模来计算的,并且可以固定以保持软件线程亲和性。从逻辑ID到(核心类型)的映射由异构调度器灵活地执行,以适应OS可访问的未来新核心类型。

图9示出了对逻辑ID使用条带映射的示例。在示例中,逻辑ID 1、4和5映射到第一核心类型,所有其他逻辑ID映射到第二核心类型。没有使用第三核心类型。

在一些实施方式中,进行核心类型的分组。例如,“核心组”元组可以由一个OOO元组和其逻辑ID映射到相同OOO元组的所有标量、SIMD和加速器核心元组组成。图10示出了核心组的示例。通常,在同一核心组内执行串行阶段检测和线程迁移。

图11示出了利用二进制转换器切换机制的系统中的线程执行方法的示例。在1101处,线程正在核心上执行。核心可以是本文详述的任何类型,包括加速器。

在线程执行期间的某个时间点,在1103处发生潜在的核心重新分配事件。示例性核心重新分配事件包括但不限于:线程唤醒命令;写入页目录基址寄存器;休眠命令;线程的阶段变化;以及指示对不同核心的所需重新分配的一个或多个指令。

在1105处,处理事件并且确定是否存在核心分配的改变。以下详述的是与处理一个特定核心分配有关的示例性方法。

在一些实施例中,核心(重)分配受到一个或多个限制因素的影响,例如迁移速率限制和功耗限制。每个核心类型、核心ID和线程ID地跟踪迁移速率限制。一旦将线程分配给目标(Core类型,核心ID,线程ID),二进制转换器就启动并维护定时器。在定时器到期之前,不会将其他线程迁移到同一目标。因此,虽然线程可能会在定时器到期之前从其当前核心迁移走,但反之则不然。

如所详述的,随着将更多核心类型(包括加速器)添加到计算系统(管芯上或管芯外),功耗限制可能具有越来越多的关注。在一些实施例中,计算所有核心上的所有正在运行的线程所消耗的瞬时功率。当计算的功耗超过阈值时,仅将新线程分配给诸如SIMD、标量和专用加速器核心的较低功率核心,并且将一个或多个线程从OOO核心强制迁移到较低功率核心。注意,在一些实施方式中,功耗限制优先于迁移速率限制。

图12示出了对加速器的热代码的核心分配的示例性方法。在1203处,确定代码为“热”。代码的热部分可以指代基于考虑因素(例如功率、性能、热量、其他已知的处理器度量,或其组合)与另一核心相比更适合在一个核心上执行的代码的一部分。可以使用任何数量的技术进行该确定。例如,可以利用动态二进制优化器来监控线程的执行。可以基于在程序执行期间记录静态代码的动态执行频率的计数器值来检测热代码。在一个核心是OOO核心而另一核心是有序核心的实施例中,代码的热部分可以指代更适合在串行核心上执行的程序代码的热点,其可能具有用于执行高度重复的段的更多可用资源。通常,可以优化具有高重复模式的代码段,以便在有序核心上更有效地执行。本质上,在此示例中,冷代码(低重复率)被分发到本地OOO核心,而热代码(高重复率)被分发到软件管理的有序核心。可以静态地、动态地或者动静态组合地识别代码的热部分。在第一种情况下,编译器或用户可以确定一段程序代码是热代码。在一个实施例中,核心中的解码逻辑被适配为从程序代码解码热代码标识符指令,其用于识别程序代码的热部分。这种指令的提取或解码可触发核心上的热代码段的转换和/或执行。在另一示例中,代码执行是配置文件执行(profiledexecution),并且基于配置文件(profile)的特性-与执行相关联的功率和/或性能度量-可以将程序代码的区域标识为热代码。类似于硬件的操作,可以在一个核心上执行监控代码,以执行对在另一个核心上执行的程序代码的监控/剖析(profiling)。注意,这种监控代码可以是保存在核心内的储存结构中的代码,或者保存在包括处理器的系统中的代码。例如,监控代码可以是保存在核心的储存结构中的微代码或其他代码。作为又一个示例,热代码的静态识别被作为提示。但是程序代码执行的动态剖析能够忽略将代码区域静态识别为热代码区域;这种类型的静态识别通常被称为动态剖析在确定哪个核心适合于代码分发时可以考虑的编译器或用户提示。此外,正如动态剖析的本质一样,将代码区域识别为热代码区域并不会限制将该代码段始终识别为热代码段。在转换和/或优化之后,执行代码段的经转换版本。

在1203处选择适当的加速器。二进制转换器、虚拟机监控器或操作系统基于可用的加速器和期望的性能进行该选择。在许多情况下,加速器更适合以比更大更通用的核心更好的每瓦特性能来执行热代码。

在1205处,将热代码传送到所选择的加速器。该传输使用如本文详述的适当连接类型。

最后,在1207处热代码由所选择的加速器接收并执行。在执行时,可以评估热代码以分配给不同的核心。

图13示出了用于唤醒或写入页目录基址寄存器事件的潜在核心分配的示例性方法。例如,这说明了确定代码片段的阶段。在1301处,检测到唤醒事件或页目录基址寄存器(例如,任务切换)事件。例如,针对由暂停线程或等待状态退出接收的中断,发生唤醒事件。对页目录基址寄存器的写入可以指示串行阶段的开始或停止。通常,该检测发生在执行二进制转换器的核心上。

在1303处对与唤醒或经历任务切换的线程共享相同页表基指针(base pointer)的核心的数量进行计数。在一些实施方式中,使用表将逻辑ID映射到特定异构核心。该表由逻辑ID索引。该表的每个条目包含指示逻辑ID当前是在运行还是暂停的标志,指示优选SIMD还是标量核心的标志,页表基地址(例如,CR3),指示逻辑ID当前映射到的核心的类型的值,及用于限制迁移速率的计数器。

属于同一进程的线程共享相同的地址空间、页表和页目录基址寄存器值。

在1305处确定计数的核心的数量是否大于1。该计数确定线程是处于串行还是并行阶段。当计数为1时,经历该事件的线程处于串行阶段1311。因此,串行阶段线程是在同一核心组中的所有线程中具有唯一页目录基址寄存器值的线程。图14示出了串行阶段线程的示例。如图所示,进程具有一个或多个线程,并且每个进程具有其自己的分配地址。

在经历事件的线程未被分配给OOO核心时,将其迁移到OOO核心并且在1313或1315处将OOO核心上的现有线程迁移到SIMD或标量核心。在经历事件的线程被分配给OOO核心时,其在大多数情况下都保留在那里。

当计数大于1时,经历事件的线程处于并行阶段并且在1309处确定并行阶段的类型。在1313处,在经历事件的线程处于数据并行阶段时,如果该线程未被分配给SIMD核心,则将其分配给SIMD核心,否则如果该线程已经在SIMD核心上,则其保留在SIMD核心上。

在1313处,在经历事件的线程处于数据并行阶段时,如果该线程未被分配给SIMD核心,则将其分配给SIMD核心,否则如果该线程已经在SIMD核心上,则其保留在SIMD核心上。

在1315处,在经历事件的线程处于线程并行阶段时,如果该线程未被分配给标量核心,则将其分配给一个标量核心,否则如果该线程已经在标量核心上,则其保留在标量核心上。

另外,在一些实施方式中,为线程的逻辑ID设置指示线程正在运行的标志。

图15示出了响应于休眠命令事件针对线程的潜在核心分配的示例性方法。例如,这说明了确定代码片段的阶段。在1501处,检测到影响线程的休眠事件。例如,发生了中止、等待进入和超时、或暂停命令。通常,该检测发生在执行二进制转换器的核心上。

在一些实施例中,在1503处针对线程的逻辑ID清除指示线程正在运行的标志。

在1505处,对与休眠线程共享相同页表基指针的核心的线程数进行计数。在一些实施方式中,使用表将逻辑ID映射到特定异构核心。该表由逻辑ID索引。该表的每个条目包含指示逻辑ID当前是在运行还是暂停的标志,指示优选SIMD还是标量核心的标志,页表基地址(例如,CR3),指示逻辑ID当前映射到的核心的类型的值,及用于限制迁移速率的计数器。注意来自该组的第一个运行线程(具有任何页表基指针)。

在1507处确定系统中的OOO核心是否空闲。空闲OOO核心不具有正在执行的OS线程。

在1509处,当页表基指针恰好由核心组中的一个线程共享时,则该共享线程从SIMD或标量核心移动到OOO核心。当页表基指针由多于一个线程共享时,则前面提到的该组的第一个运行线程在1511处从SIMD或标量核心被线程迁移到OOO核心,为唤醒的线程腾出空间(在第一个运行线程的位置处执行)。

图16示出了响应于阶段变化事件针对线程的潜在核心分配的示例性方法。例如,这说明了确定代码片段的阶段。在1601处,检测到潜在的阶段变化事件。通常,该检测发生在执行二进制转换器的核心上。

在1603处确定是否线程的逻辑ID在标量核心上运行并且存在SIMD指令。如果不存在这样的SIMD指令,则线程继续照常执行。然而,当在标量核心上运行的线程中存在SIMD指令时,则在1605处将线程迁移到SIMD核心。

在1607处确定是否线程的逻辑ID在SIMD核心上运行并且SIMD指令不存在。如果存在SIMD指令,则线程继续照常执行。然而,当在SIMD核心上运行的线程中不存在SIMD指令时,则在1609处将线程迁移到标量核心。

如在整个说明书中所指出的,可从二进制转换器访问的加速器可以提供更有效的执行(包括更节能的执行)。然而,能够针对每个可用的加速器进行编程可能是困难的(如果不是不可能的话)任务。

本文详细描述了使用描述指令来明确地标记基于潜在加速器执行线程的一部分的开始和结束的实施例。当没有可用的加速器时,在不使用加速器的情况下执行描述指令之间的代码。在一些实施方式中,这些指令之间的代码可以放宽其在上运行的核心的一些语义。

图17示出描述加速区域的代码的示例。该区域的第一指令是加速开始(ABEGIN)指令1701。在一些实施例中,ABEGIN指令允许进入关于非加速器核心的放宽执行(子)模式。例如,在一些实施方式中,ABEGIN指令允许程序员或编译器在指令的字段中指示子模式的哪些特征与标准模式不同。示例性特征包括但不限于以下项中的一个或多个:忽略自修改代码(SMC),弱化存储器一致性模型限制(例如,放宽存储排序要求),改变浮点语义,改变性能监控(perfmon),改变架构标志使用等。在一些实施方式中,SMC是对当前在处理器中缓存的代码段中的存储器位置的写入,导致相关联的缓存行(或多个行)无效。如果写入影响预取指令,则预取队列无效。后一检查基于指令的线性地址。在目标指令已被解码并驻留在跟踪缓存中的情况下,代码段中的指令的写入或探听使整个跟踪缓存无效。通过在转换后备缓冲器中转换SMC检测电路可以忽略SMC。例如,可以通过改变一个或多个寄存器或表(例如存储器类型范围寄存器或页属性表)中的设置来改变存储器一致性模型限制。例如,当改变浮点语义时,通过使用控制这些电路的行为的一个或多个控制寄存器(例如,设置浮点单元(FPU)控制字寄存器)来改变浮点执行电路执行浮点计算的方式。可以改变的浮点语义包括但不限于舍入模式,如何处理异常掩码和状态标志,清零,设置非常规值,和精度(例如,单、双和扩展)控制。另外,在一些实施例中,ABEGIN指令允许明确的加速器类型偏好,使得如果优选类型的加速器可用,则将选择该优选类型的加速器。

非加速器代码1703在ABEGIN指令1701之后。该代码对于系统的处理器核心而言是本地的。在最坏的情况下,如果没有可用的加速器,或者不支持ABEGIN,则此代码将按原样在核心上执行。然而,在一些实施方式中,子模式用于执行。

通过包含加速结束(AEND)指令1705,在处理器核心上对执行进行门控,直到加速器看起来已完成其执行。实际上,ABEGIN和AEND的使用允许程序员选择加入/退出使用加速器和/或放宽的执行模式。

图18示出了在硬件处理器核心中使用ABEGIN的执行方法的实施例。在1801处,提取线程的ABEGIN指令。如前所述,ABEGIN指令通常包括用于定义不同执行(子)模式的一个或多个字段。

在1803处,使用解码电路对提取的ABEGIN指令进行解码。在一些实施例中,ABEGIN指令被解码为微操作。

在1805处,经解码的ABEGIN指令由执行电路执行,以使线程进入不同的模式(可以由ABEGIN指令的一个或多个字段明确定义),用于在ABEGIN指令之后但在AEND指令之前的指令。根据加速器的可用性和选择,这种不同的执行模式可以在加速器上或在现有核心上。在一些实施例中,加速器选择由异构调度器执行。

在1807处,随后的非AEND指令以不同的执行模式执行。当加速器被用于执行时,指令可首先由二进制转换器转换为不同的指令集。

图19示出了在硬件处理器核心中使用AEND的执行方法的实施例。在1901处,提取AEND指令。

在1903处,使用解码电路对提取的AEND指令进行解码。在一些实施例中,将AEND解码为微操作。

在1905处,经解码的AEND指令由执行电路执行以从ABEGIN指令先前设置的不同执行模式恢复。这种不同的执行模式可以在加速器上或在现有核心上,这取决于加速器可用性和选择。

在1807处,随后的非AEND指令以原始执行模式执行。当加速器被用于执行时,指令可首先由二进制转换器转换为不同的指令集。

图124示出了当不支持ABEGIN/AEND时的执行示例。在12401处,提取ABEGIN指令。在12403处确定不支持ABEGIN。例如,CPUID指示不存在支持。

当不存在支持时,在12405处通常执行空操作(nop),其不改变与线程相关联的上下文。由于执行模式没有变化,因此在不支持的ABEGIN之后的指令在12407处照常执行。

在一些实施例中,使用至少模式匹配来实现ABEGIN/AEND的等效使用。该模式匹配可以基于硬件、软件和/或两者。图20示出了使用模式匹配提供ABEGIN/AEND等效的系统。所示系统包括调度器2015(例如,如上详述的异构调度器),其包括存储在存储器2005中的转换器2001(例如,二进制转换器、JIT等)。核心电路2007执行调度器2015。调度器2015接收线程2019,线程2019可能有也可能没有明确的ABEGIN/AEND指令。

调度器2015管理基于软件的模式匹配器2003,在卸载期间执行陷阱(trap)和上下文切换,管理用户空间保存区域(稍后详述),并生成或转换为加速器代码2011。模式匹配器2003识别存储在存储器中的(预定义的)代码序列,这些代码序列被发现在接收的线程2019中,其可以受益于加速器使用和/或放宽的执行状态,但是没有使用ABEGIN/AEND来描述。通常,模式本身被存储在转换器2001中,但至少可以由模式匹配器2003访问。选择器2019的功能如前所详述的。

调度器2015还可以提供性能监控特征。例如,如果代码没有完美的模式匹配,则调度器2015认识到代码可能仍然需要放宽要求以更为有效并且相应地调整与线程相关联的操作模式。上面已经详细描述了操作模式的关系。

调度器2015还执行以下操作中的一个或多个:使核心在ABEGIN/AEND区域中循环,使加速器循环处于活动或停止状态,对ABEGIN调用进行计数,延迟加速器的排队(同步处理),以及监控存储器/缓存统计信息。在一些实施例中,二进制转换器2001包括用于解释加速器代码的加速器特定代码,其可用于识别瓶颈。加速器执行该经转换的代码。

在一些实施例中,核心电路2007包括硬件模式匹配器2009,以使用存储的模式2017识别接收的线程2019中的(预定义的)代码序列。通常,该模式匹配器2009与软件模式匹配器2003相比是轻量的,并寻找简单表达区域(例如rep movs)。所识别的代码序列可以通过调度器2015转换以用于加速器,和/或可以导致线程的操作模式的放宽。

耦合到系统的是一个或多个加速器2013,其接收加速器代码2011以执行。

图21示出了暴露于模式识别的未加速描述线程的执行方法的实施例。该方法由包括至少一种类型的模式匹配器的系统执行。

在一些实施例中,在2101处执行线程。通常,该线程在非加速器核心上执行。执行线程的指令被馈送到模式匹配器中。但是,线程的指令可以在任何执行之前被馈送到模式匹配器中。

在2103处,识别(检测)线程内的模式。例如,基于软件的模式匹配器或硬件模式匹配器电路找到通常与可用加速器相关联的模式。

在2105处,所识别的模式被转换用于可用加速器。例如,二进制转换器将模式转换为加速器代码。

在2107处将经转换的代码传送到可用加速器以供执行。

图22示出了暴露于模式识别的未加速描述线程的执行方法的实施例。该方法由包括如图20的系统中的至少一种类型的模式匹配器的系统执行。

在一些实施例中,在2201处执行线程。通常,该线程在非加速器核心上执行。执行线程的指令被馈送到模式匹配器中。但是,线程的指令可以在任何执行之前被馈送到模式匹配器中。

在2203处,识别(检测)线程内的模式。例如,基于软件的模式匹配器或硬件模式匹配器电路找到通常与可用加速器相关联的模式。

在2205处,二进制转换器调整与线程相关联的操作模式以基于所识别的模式使用放宽的要求。例如二进制转换器利用与所识别的模式相关联的设置。

如所详述的,在一些实施例中,代码的并行区域由ABEGIN和AEND指令界定。在ABEGIN/AEND块内,存在关于某些存储器加载和存储操作的独立性的保证。其他加载和存储允许潜在的依赖性。这使得实施方式能够在很少或不检查存储器依赖性的情况下并行化块。在所有情况下,允许块的串行执行,因为串行情况被包含在执行块的可能方式中。二进制转换器执行静态依赖性分析以创建并行执行的实例,并将这些实例映射到硬件。静态依赖性分析可以并行化外部、中间或内部循环的迭代。分片是依赖于实施方式的。ABEGIN/AEND的实施方式以最适于实施方式的大小提取并行性。

ABEGIN/AEND块可以包含多级嵌套循环。实施方式可以自由选择支持的并行执行量,或者回退到串行执行。ABEGIN/AEND在比SIMD指令大得多的区域上提供并行性。对于某些类型的代码,ABEGIN/AEND允许比多线程更有效的硬件实施方式。

通过使用ABEGIN/AEND,如果不满足并行化的标准,则程序员和/或编译器可以回退到由CPU核心进行传统的串行执行。当在传统的乱序CPU核心上执行时,由于放宽的存储器排序,ABEGIN/AEND减小了存储器排序缓冲区(MOB)的区域和功率要求。

在ABEGIN/AEND块内,程序员指定存储器依赖性。图23示出了不同类型的存储器依赖性2301、它们的语义2303、排序要求2305和用例2307。此外,取决于实施方式,一些语义适用于ABEGIN/AEND块内的指令。例如,在一些实施例中,允许寄存器依赖性,但是对寄存器的修改不会持续超出AEND。另外,在一些实施例中,必须在ABEGIN处进入ABEGIN/AEND块并且在AEND处退出(或基于模式识别进入类似状态),而没有进入/退出ABEGIN/AEND块的分支。最后,通常不能修改指令流。

在一些实施方式中,ABEGIN指令包括源操作数,其包括指向存储器数据块的指针。该数据存储块包括运行时利用的和核心电路用于处理ABEGIN/AEND块内的代码的许多信息。

图24示出了ABEGIN指令指向的存储器数据块的示例。如图所示,取决于实施方式,存储器数据块包括用于序列号2401、块类2403、实施方式标识符2405、保存状态区域大小2407和本地储存区域大小2409的字段。

序列号2401指示处理器在中断之前已经进行了多少(并行)计算。软件在执行ABEGIN之前将序列号2401初始化为零。ABEGIN的执行会将非零值写入序列号2401以跟踪执行进度。完成后,AEND的执行将写入零以重新初始化序列号2401以供其下次使用。

预定义块类标识符2403(即GUID)指定预定义的ABEGIN/AEND块类。例如,DMULADD和DGEMM可以预定义为块类。使用预定义的类,二进制转换器不需要分析二进制文件来执行异构硬件的映射分析。相反,转换器(例如,二进制转换器)仅通过获取输入值来执行针对该ABEGIN/AEND类的预生成转换。以ABEGIN/AEND封闭的代码仅用作用于在非专用核心上执行此类的代码。

实施方式ID字段2405指示正在使用的执行硬件的类型。ABEGIN的执行将更新该字段2405以指示正在使用的异构硬件的类型。这有助于实现将ABEGIN/AEND代码迁移到具有不同加速硬件类型或根本没有加速器的机器。此字段允许实现对已保存的上下文的可能转换以匹配目标实施方式。或者,仿真器被用于执行代码,直到代码在迁移后退出AEND,所述迁移发生在ABEGIN/AEND代码中断并迁移到不具有相同加速器类型的机器时。该字段2405还可以允许系统动态地将ABEGIN/AEND块重新分配给同一机器内的不同异构硬件,即使其在ABEGIN/AEND块执行的中间被中断。

状态保存区域字段2407指示实施方式特定的状态保存区域的大小和格式。实施方式将保证状态保存区域的实施方式特定的部分不会超过CPUID中指定的某个最大值。通常,ABEGIN指令的执行导致对ABEGIN/AEND块内将被修改的通用和打包数据寄存器的状态保存区域、相关标志和附加的实施方式特定的状态进行写入。为了便于并行执行,可以写入多个寄存器实例。

本地储存区域2409被分配为本地储存区域。要保留的储存量通常被指定为ABEGIN的立即操作数。在执行ABEGIN指令时,利用本地储存2409的地址写入特定寄存器(例如,R9)。如果存在故障,则使该寄存器指向序列号。

并行执行的每个实例接收唯一的本地储存区域2409。对于每个并行执行的实例,该地址将是不同的。在串行执行中,分配一个储存区域。本地储存区域2409提供超出架构通用和打包数据寄存器的临时储存。不应在ABEGIN/AEND块之外访问本地储存区域2409。

图25示出了被配置为使用ABEGIN/AEND语义的存储器2503的示例。未示出支持ABEGIN/AEND并利用该存储器2503的硬件(诸如本文所述的各种处理元件)。如所详述的,存储器2503包括保存状态区域2507,其包括关于要使用的寄存器的指示2501、标志2505和实施方式特定的信息2511。另外,每个并行执行实例的本地储存2509被存储在存储器2503中。

图26示出了使用ABEGIN/AEND以不同的执行模式操作的方法的示例。通常,该方法由诸如转换器和执行电路的实体的组合来执行。在一些实施例中,在进入该模式之前转换线程。

在2601处,进入不同的执行模式,例如,放宽的执行模式(使用或不使用加速器)。该模式通常从执行ABEGIN指令进入;但是,如上所述,由于模式匹配,也可以进入该模式。进入该模式包括重置序列号。

在2603处对保存状态区域进行写入。例如,写入将被修改的通用和打包数据寄存器、相关联的标志和附加的实施方式特定信息。如果块中出现错误(例如,中断),则该区域允许重新开始执行或回滚。

在2605处保留每个并行执行实例的本地储存区域。该区域的大小由上面详述的状态保存区域字段决定。

在块的执行期间,在2607处跟踪块的进度。例如,当指令成功执行并且退出时,更新块的序列号。

在2609处确定是否已到达AEND指令(例如,以确定块是否完成)。如果不是,则在2613处使用中间结果更新本地储存区域。如果可能,执行从这些结果中挑选;但是,在某些情况下,在2615处发生到ABEGIN/AEND之前的回滚。例如,如果在执行ABEGIN/AEND块期间发生异常或中断,则指令指针将指向ABEGIN指令,并且R9寄存器将指向使用中间结果更新的存储器数据块。恢复后,保存在存储器数据块中的状态将用于在正确的点恢复。另外,如果存储器数据块的初始部分(直到并包括状态保存区域)不存在或不可访问,则引发页错误。对于到本地储存区域的加载和存储,以常规方式报告页错误,即在首次访问不存在的或不可访问的页时。在某些情况下,将在重新开始时使用非加速器处理元件。

如果块成功完成,则在2611处,预留的寄存器与标志一起被恢复。在块之后仅存储器状态将不同。

图27示出了使用ABEGIN/AEND以不同的执行模式操作的方法的示例。通常,该方法由诸如二进制转换器和执行电路的实体的组合来执行。

在2701处,进入不同的执行模式,例如,放宽的执行模式(使用或不使用加速器)。该模式通常从执行ABEGIN指令进入;但是,如上所述,也可以因为模式匹配而进入该模式。进入该模式包括重置序列号。

在2703处对保存状态区域进行写入。例如,写入将被修改的通用和打包数据寄存器、相关联的标志和附加的实施方式特定信息。如果块中出现错误(例如,中断),则该区域允许重新开始执行或回滚。

在2705处保留每个并行执行实例的本地储存区域。该区域的大小由上面详述的状态保存区域字段决定。

在2706处,转换块内的代码以供执行。

在执行经转换的块期间,在2707处跟踪块的进度。例如,当指令成功执行并且退出时,更新块的序列号。

在2709处确定是否已到达AEND指令(例如,以确定块是否完成)。如果不是,则在2713处使用中间结果更新本地储存区域。如果可能,执行从这些结果中挑选;但是,在某些情况下,在2715处发生到ABEGIN/AEND之前的回滚。例如,如果在执行ABEGIN/AEND块期间发生异常或中断,则指令指针将指向ABEGIN指令,并且R9寄存器将指向使用中间结果更新的存储器数据块。恢复后,保存在存储器数据块中的状态将用于在正确的点恢复。另外,如果存储器数据块的初始部分(直到并包括状态保存区域)不存在或不可访问,则引发页错误。对于到本地储存区域的加载和存储,以常规方式报告页错误,即在首次访问不存在的或不可访问的页时。在某些情况下,将在重新开始时使用非加速器处理元件。

如果块成功完成,则在2711处,预留的寄存器与标志一起被恢复。在块之后仅存储器状态将不同。

如上所述,在一些实施方式中,公共链路(称为多协议公共链路(MCL))被用于到达设备(诸如图1和2中描述的处理元件)。在一些实施例中,这些设备被视为PCI Express(PCIe)设备。该链路上动态复用有三个或多个协议。例如,公共链路支持的协议包括:1)生产者/消费者、发现、配置、中断(PDCI)协议,以启用设备发现、设备配置、错误报告、中断、DMA样式数据传输和各种服务,如可以在一个或多个专有或行业标准中指定的(例如,PCIExpress规范或等效替代方案);2)缓存代理一致性(CAC)协议,使设备能够向处理单元发出一致的读写请求;和3)存储器访问(MA)协议,使处理元件能够访问另一个处理元件的本地存储器。虽然下面提供了这些协议的具体示例(例如,英特尔片上系统结构(IOSF),管芯内互连(IDI),可扩展存储器互连3+(SMI3+)),但是本发明的基本原理不限于任何特定的协议集。

图120是示出示例性多芯片配置12005的简化框图12000,其包括使用示例性多芯片链路(MCL)12020通信地连接的两个或多个芯片或管芯(例如,12010、12015)。虽然图120示出了使用示例性MCL 12020互连的两个(或多个)管芯的示例,但是应当理解,本文关于MCL的实施方式描述的原理和特征可以应用于连接管芯(例如,12010)和其他部件的任何互连或链路,包括连接两个或多个管芯(例如,12010、12015),将管芯(或芯片)连接到管芯外的另一个部件,将管芯连接到封装外的另一个器件或管芯(例如,12005),将管芯连接到BGA封装,在中介层上修补(POINT)的实施方式,以及其他可能的示例。

在一些情况下,较大的部件(例如,管芯12010、12015)本身可以是IC系统(例如片上系统(SoC))、多处理器芯片、或在器件上(例如,在单个管芯(例如,12010、12015)上)包括诸如核心、加速器等的多个部件(12025-12030和12040-12045)的其他部件。MCL 12020提供了从潜在的多个分立部件和系统构建复杂多变的系统的灵活性。例如,管芯12010、12015中的每一个可以由两个不同的实体制造或以其他方式提供。此外,管芯和其他部件本身可以包括互连或其他通信结构(例如,12035、12050),其为器件(例如,分别为12010、12015)内的部件(例如,12025-12030和12040-12045)之间的通信提供基础设施。各种部件和互连(例如,12035、12050)支持或使用多种不同的协议。此外,管芯(例如,12010、12015)之间的通信可以潜在地包括通过多个不同协议在管芯上的各种部件之间的事务。

多芯片链路(MCL)的实施例支持多个封装选项,多个I/O协议,以及可靠性、可用性和可服务性(RAS)特征。此外,物理层(PHY)可以包括物理电气层和逻辑层,并且可以支持更长的通道长度,包括直到并且在一些情况下超过大约45mm的通道长度。在一些实施方式中,示例性MCL可以以高数据速率操作,包括超过8-10Gb/s的数据速率。

在MCL的一个示例性实施方式中,PHY电气层改进了传统的多通道互连解决方案(例如,多通道DRAM I/O),扩展了数据速率和通道配置,例如,通过多个特征,包括例如调节的中轨终端、低功率有源串扰消除、电路冗余、每位占空比校正和偏斜消除、线路编码和发射机均衡以及可能的其他示例。

在MCL的一个示例性实施方式中,实现PHY逻辑层,使得其进一步帮助(例如,电气层特征)扩展数据速率和通道配置,同时还使互连能够跨电气层路由多个协议。这样的实施方式提供并定义模块化公共物理层,该物理层是协议不可知的并且被构造为与潜在的任何现有或未来的互连协议一起工作。

转到图121,示出了简化框图12100,其表示包括多芯片链路(MCL)的示例性实施方式的系统的至少一部分。可以使用物理电连接(例如,实现为通路的线路)将第一器件12105(例如,包括一个或多个子部件的第一管芯)与第二器件12110(例如,包括一个或多个其他子部件的第二管芯)连接来实现MCL。在图12100的高级表示中所示的特定示例中,所有信号(在通道12115、12120中的)可以是单向的,并且可以为数据信号提供通路以具有上游和下游数据传输。尽管图121的框图12100将第一部件12105指代为上游部件并将第二部件12110指代为下游部件,并且将用于发送数据的MCL的物理通路指代为下游通道12115并将用于接收数据的通路(从部件12110)指代为上游通道12120,但应当理解,器件12105、12110之间的MCL可以由每个器件用于在器件之间发送和接收数据。

在一个示例性实施方式中,MCL可以提供包括电MCL物理层(PHY)12125a、b(或统称为12125)和实现MCL逻辑PHY 12130a、b(或统称为12130)的可执行逻辑的物理层(PHY)。电气或物理PHY 12125提供物理连接,通过该物理连接在器件12105、12110之间传送数据。信号调节部件和逻辑可以结合物理PHY 12125实现,以建立链路的高数据速率和通道配置能力,在某些应用中,其涉及长度约为45mm或更长的紧密集群物理连接。逻辑PHY 12130包括用于促进时钟、链路状态管理(例如,用于链路层12135a,12135b)、以及用于通过MCL进行通信的潜在多个不同协议之间的协议复用的电路。

在一个示例性实施方式中,物理PHY 12125对于每个通道(例如,12115、12120)包括一组数据通路,在该数据通路上发送带内数据。在该特定示例中,在上游和下游通道12115、12120中的每一个通道中提供50个数据通路,但是可以在布局和功率约束、期望的应用、器件约束等允许的情况下使用任何其他数量的通路。每个通道还可以包括用于通道的选通或时钟信号的一个或多个专用通路,用于通道的有效信号的一个或多个专用通路,用于流信号的一个或多个专用通路,以及用于链路状态机管理或边带信号的一个或多个专用通路。物理PHY还可以包括边带链路12140,在一些示例中,边带链路12140可以是用于协调MCL连接器件12105、12110的状态转换和其他属性的双向低频控制信号链路,也可以有其他示例。

如上所述,使用MCL的实施方式来支持多个协议。实际上,可以在每个器件12105、12110处提供多个独立的事务处理层12150a、12150b。例如,每个器件12105、12110可以支持和利用两个或多个协议,例如PCI、PCIe、CAC等。CAC是一种在管芯上用于在核心、最后一级缓存(LLC)、存储器、图形和I/O控制器之间进行通信的一致性协议。还可以支持其他协议,包括以太网协议、无限带宽(Infiniband)协议和其他基于PCIe架构的协议。逻辑PHY和物理PHY的组合也可以用作管芯到管芯的互连,以将一个管芯上的SerDes PHY(PCIe、以太网、Infiniband或其他高速SerDes)连接到在另一管芯上实现的更上层,也可以有其他示例。

逻辑PHY 12130支持MCL上的这些多个协议之间的复用。例如,专用流通路可用于使编码流信号生效,该编码流信号识别哪个协议将应用于在通道的数据通路上基本同时发送的数据。此外,逻辑PHY 12130协商各种协议可以支持或请求的各种类型的链路状态转换。在一些情况下,可以使用通过通道的专用LSM_SB通路发送的LSM_SB信号以及边带链路12140来在器件12105、12110之间通信和协商链路状态转换。此外,传统互连的链路训练、错误检测、偏斜检测、偏斜消除和其他功能可以使用逻辑PHY 12130来部分地替换或控制。例如,通过每个通道中的一个或多个专用有效信号通路发送的有效信号可用于发信号通知链路活动性、检测偏斜、链路错误,并实现其他特征,也可以有其他示例。在图121的特定示例中,每个通道提供多个有效通路。例如,可以(从物理和/或逻辑上)捆绑或群集通道内的数据通路,并且可以为每个群集提供有效通路。此外,在一些情况下,可以提供多个选通通路,以便为通道中的多个数据通路群集中的每个群集提供专用选通信号,也可以有其他示例。

如上所述,逻辑PHY 12130协商和管理在由MCL连接的器件之间发送的链路控制信号。在一些实施方式中,逻辑PHY 12130包括链路层分组(LLP)生成电路12160,以通过MCL(即,带内)发送链路层控制消息。这些消息可以通过通道的数据通路发送,其中流通路识别数据是链路层到链路层消息传递,例如链路层控制数据,也可以有其他示例。使用LLP模块12160启用的链路层消息有助于分别在器件12105、12110的链路层12135a、12135b之间的链路层状态转换、功率管理、回送(loopback)、禁用、重新居中(re-centering)、加扰以及其他链路层特征的协商和执行。

转到图122,示出了简化框图12200,其示出了示例性MCL的示例性逻辑PHY。物理PHY 12205可以连接到管芯,管芯包括逻辑PHY 12210和支持MCL的链路层的附加逻辑。在该示例中,管芯还可以包括支持MCL上的多个不同协议的逻辑。例如,在图122的示例中,提供PCIe逻辑12215以及CAC逻辑12220,使得管芯可以通过连接两个管芯的相同MCL使用PCIe或CAC进行通信,也可能有许多其他示例,包括在MCL上支持除了PCIe和CAC之外的两个以上协议的示例。管芯之间支持的各种协议可以提供不同级别的服务和特征。

逻辑PHY 12210可以包括链路状态机管理逻辑12225,用于结合管芯的上层逻辑的请求(例如,通过PCIe或CAC接收)协商链路状态转换。在一些实施方式中,逻辑PHY 12210还可以包括链路测试和调试逻辑(例如,12230)。如上所述,示例性MCL可以支持通过MCL在管芯之间发送的控制信号,以促进MCL的协议不可知(protocol agnostic)、高性能和节省功率特征(以及其他示例特征)。例如,逻辑PHY 12210可以支持与通过专用数据通路发送和接收数据有关的有效信号、流信号和LSM边带信号的生成和发送以及接收和处理,例如在以上示例中描述的。

在一些实施方式中,复用(例如,12235)和解复用(例如,12240)逻辑可以被包括在逻辑PHY 12210中,或者可以以其他方式对于逻辑PHY 12210是可访问的。例如,复用逻辑(例如,12235)可以用于识别要发送到MCL上的数据(例如,体现为分组、消息等)。复用逻辑12235可以识别管理数据的协议并生成被编码以标识协议的流信号。例如,在一个示例性实施方式中,流信号可以被编码为两个十六进制符号的字节(例如,CAC:FFh;PCIe:F0h;LLP:AAh;边带:55h;等),并且可以在由所标识的协议控制的数据的相同窗口(例如,字节时间段窗口)期间被发送。类似地,解复用逻辑12240可用于解释输入流信号以解码流信号,并识别应用于在数据通路上与流信号同时接收的数据的协议。然后,解复用逻辑12240可以应用(或确保)协议特定的链路层处理,并使数据由相应的协议逻辑(例如,PCIe逻辑12215或CAC逻辑12220)处理。

逻辑PHY 12210还可以包括链路层分组逻辑12250,其可以用于处理各种链路控制功能,包括功率管理任务、回送、禁用、重新居中、加扰等。LLP逻辑12250可以促进通过MCLP的链路层到链路层消息,以及其他特征。对应于LLP信令的数据也可以由在专用流信号通路上发送的流信号识别,该专用流信号通路被编码以识别数据通路LLP数据。复用和解复用逻辑(例如,12235、12240)也可用于生成和解释对应于LLP业务的流信号,以及使这种业务由适当的管芯逻辑(例如,LLP逻辑12250)处理。同样地,MCLP的一些实施方式可以包括专用边带(例如,边带12255和支持逻辑),例如异步和/或低频边带通道,也可以有其他示例。

逻辑PHY逻辑12210还可以包括链路状态机管理逻辑,其可以生成并通过专用LSM边带通路接收(和使用)链路状态管理消息。例如,LSM边带通路可用于执行握手以推进链路训练状态,退出功率管理状态(例如,L1状态)等等。LSM边带信号可以是异步信号,因为该信号不与链路的数据、有效和流信号对齐,而是对应于信令状态转换并使链路状态机在通过链路连接的两个管芯或芯片之间对齐,也可以有其他示例。在一些示例中,提供专用LSM边带通路可以允许消除模拟前端(AFE)的传统的静噪(squelch)和接收检测电路,以及其他示例性益处。

转到图123,示出了简化框图12300,示出了用于实现MCL的逻辑的另一表示。例如,逻辑PHY 12210被提供有定义的逻辑PHY接口(LPIF)12305,多个不同协议(例如,PCIe、CAC、PDCI、MA等)12315、12320、12325和信令模式(例如,边带)中的任何一个可以通过该逻辑PHY接口与示例MCL的物理层连接。在一些实施方式中,复用和仲裁逻辑12330还可以被提供为与逻辑PHY 12210分离的层。在一个示例中,LPIF 12305可以被提供为该MuxArb层1230的任一侧上的接口。逻辑PHY 12210可以通过另一接口与物理PHY(例如,MCL PHY的模拟前端(AFE)12205)进行接口连接。

LPIF可以从上层(例如,12315、12320、12325)提取PHY(逻辑和电/模拟),使得可以在对上层透明的LPIF下实现完全不同的PHY。这可以有助于促进设计中的模块化和重用,因为在更新下层信令技术PHY时,上层可以保持完整,也可以有其他示例。此外,LPIF可以定义多个信号,使得能够进行复用/解复用、LSM管理、错误检测和处理,以及逻辑PHY的其他功能。例如,下表总结了可以为示例性LPIF定义的至少一部分信号:

如表中所示,在一些实施方式中,可以通过AlignReq/AlignAck握手来提供对齐机制。例如,当物理层进入恢复时,某些协议可能会丢失分组成帧。例如,可以校正分组的对齐,以保证链路层的正确成帧识别。物理层在进入恢复时可以使StallReq信号生效,使得当准备好传输新的对齐分组时,链路层使Stall(停止)信号生效。物理层逻辑可以对Stall和Valid(有效)进行采样,以确定分组是否对齐。例如,物理层可以继续驱动trdy以排出(drain)链路层分组,直到Stall和Valid被采样为生效信号,也可能有其他的实施方式,包括使用Valid来辅助分组对齐的其他替代实施方式。

可以为MCL上的信号定义各种容错。例如,可以为有效、流、LSM边带、低频边带、链路层分组和其他类型的信号定义容错。通过MCL的专用数据通路发送的分组、消息和其他数据的容错可以基于管理数据的特定协议。在一些实施方式中,可以提供错误检测和处理机制,诸如循环冗余校验(CRC)、重试缓冲器、以及其他可能的示例。作为示例,对于通过MCL发送的PCIe分组,32位CRC可以用于PCIe事务层分组(TLP)(具有确保的传送(例如,通过重放机制)),16位CRC可以用于PCIe链路层分组(可能被构造为有损的(例如,未应用重放的情况))。此外,对于PCIe成帧令牌,可以为令牌标识符定义特定的汉明距离(例如,汉明距离为四(4));在其他示例中,也可以使用奇偶校验和4位CRC。另一方面,对于CAC分组,可以使用16位CRC。

在一些实施方式中,为利用有效信号从低转变为高(即,从0到1)的链路层分组(LLP)定义容错(例如,以帮助确保位和符号锁定)。此外,在一个示例中,可以定义特定数量的连续相同的LLP以发送,并且可以预期对每个请求的响应,其中,请求者在响应超时之后重试,也可能有可以用作确定MCL上的LLP数据中的故障的基础的其他定义的特征。在其他示例中,可以为有效信号提供容错,例如,通过在整个时间段窗口或符号上扩展有效信号或符号(例如,通过在8个UI上将有效信号保持为高)。另外,可以通过维护流信号的编码值的汉明距离来防止流信号中的错误或故障,也可以有其他示例。

逻辑PHY的实施方式包括错误检测、错误报告和错误处理逻辑。在一些实施方式中,示例MCL的逻辑PHY可以包括逻辑,用于检测PHY层解帧错误(例如,在有效和流通路上)、边带错误(例如,与LSM状态转换有关)、LLP中的错误(例如,对于LSM状态转换至关重要)等等。可以将一些错误检测/解决方案委托给上层逻辑,例如适用于检测PCIe特定错误的PCIe逻辑,也可以有其他示例。

在解帧错误的情况下,在一些实施方式中,可以通过错误处理逻辑提供一个或多个机制。可以基于所涉及的协议来处理解帧错误。例如,在一些实施方式中,可以向链路层通知错误以触发重试。解帧还可以导致逻辑PHY解帧的重新对齐。此外,可以执行逻辑PHY的重新居中并且可以重新获得符号/窗口锁定,以及其他技术。在一些示例中,居中可以包括PHY将接收器时钟相位移动到用于检测输入数据的最佳点。在这种情况下,“最佳”可以指的是对噪声和时钟抖动而言具有最大容限的地方。重新居中可以包括简化的居中功能,例如,当PHY从低功率状态唤醒时执行这些功能,也可以有其他示例。

其他类型的错误可能涉及其他错误处理技术。例如,可以通过相应状态(例如,LSM)的超时机制来捕获在边带中检测到的错误。可以记录错误,然后链路状态机可以转换为重置。LSM可以保持重置状态,直到从软件接收到重新开始命令。在另一个示例中,LLP错误(例如链路控制分组错误)可以用超时机制来处理,如果没有接收到对LLP序列的确认,则该超时机制可以重新开始LLP序列。

在一些实施例中,上述协议中的每一个是PCIe的变体。PCIe设备使用与总线相关联的公共地址空间进行通信。该地址空间是总线地址空间或PCIe地址空间。在一些实施例中,PCIe设备使用可以与PCIe地址空间不同的内部地址空间中的地址。

PCIe规范定义了一种机制,通过该机制,PCIe设备可以将其本地存储器(或其一部分)暴露给总线,从而使得连接到总线的CPU或其他设备能够直接访问其存储器。通常,为每个PCIe设备分配PCIe地址空间中的专用区域,该PCIe地址空间被称为PCI基地址寄存器(BAR)。此外,设备暴露的地址被映射到PCI BAR中的相应地址。

在一些实施例中,PCIe设备(例如,HCA)使用输入/输出存储器映射单元(IOMMU)在其内部地址和PCIe总线地址之间进行转换。在其他实施例中,PCIe设备可以使用PCI地址转换服务(ATS)来执行地址转换和解析。在一些实施例中,诸如进程地址空间ID(PASID)标签之类的标签被用于指定要转换为属于特定进程的虚拟地址空间的地址。

图28示出了一种实施方式的附加细节。如同在上述实施方式中,该实施方式包括具有加速器存储器2850的加速器2801具有通过多协议链路2800耦合到具有主机存储器2860的主机处理器2802。如上所述,加速器存储器2850可以使用与主机存储器2860不同的存储器技术(例如,加速器存储器可以是HBM或堆叠DRAM,而主机存储器可以是SDRAM)。

示出多路复用器2811和2812以突出以下事实:多协议链路2800是动态多路复用总线,其支持PCDI、CAC和MA协议(例如,SMI3+)业务,其中每个业务可以被路由到加速器2801和主机处理器2802内的不同功能部件。作为示例而非限制,这些协议可以包括IOSF、IDI和SMI3+。在一种实施方式中,加速器2801的PCIe逻辑2820包括本地TLB 2822,用于缓存虚拟到物理地址转换,以供在执行命令时由一个或多个加速器核心2830使用。如上所述,虚拟存储器空间分布在加速器存储器2850和主机存储器2860之间。类似地,主机处理器2802上的PCIe逻辑包括I/O存储器管理单元(IOMMU)2810,用于管理PCIe I/O设备2806以及在一种实施方式中的加速器2801的存储器访问。如加速器上的PCIe逻辑2820和主处理器上的PCIe逻辑2808中所示,使用PCDI协议进行通信,以执行诸如设备发现、寄存器访问、设备配置和初始化、中断处理、DMA操作和地址转换服务(ATS)之类的功能。如上所述,主处理器2802上的IOMMU 2810可以作为这些功能的控制和协调的中心点来操作。

在一种实施方式中,加速器核心2830包括执行加速器所需功能的处理引擎(元件)。另外,加速器核心2830可以包括用于本地缓存存储在主机存储器2860中的页的主机存储器缓存2834和用于缓存存储在加速器存储器2850中的页的加速器存储器缓存2832。在一种实施方式中,加速器核心2830经由CAC协议与主机处理器2802的一致性和缓存逻辑2807通信以确保在加速器2801和主机处理器2802之间共享的缓存行保持一致。

加速器2801的偏移/一致性逻辑2840实现本文描述的各种设备/主机偏移技术(例如,以页级粒度),以确保数据一致性,同时减少多协议链路2800上的不必要通信。如图所示,偏移/一致性逻辑2840使用MA存储器事务(例如,SMI3+)与主机处理器2802的一致性和缓存逻辑2807通信。一致性和缓存逻辑2807负责维护存储在其LLC 2809、主机存储器2860、加速器存储器2850和缓存2832、2834以及核心2805的各个缓存中的数据的一致性。

总之,加速器2801的一种实施方式对于主机处理器2802上执行的软件呈现为PCIe设备,通过PDCI协议(实际上是为多路复用总线重新格式化的PCIe协议)访问。加速器2801可以参与使用加速器设备TLB和标准PCIe地址转换服务(ATS)的共享虚拟存储器。加速器也可以被视为一致性/存储器代理。某些能力(例如,下面描述的ENQCMD、MOVDIR)在PDCI上可用(例如,用于工作提交),而加速器可以使用CAC来缓存加速器处和某些偏移转换流中的主机数据。从主机访问加速器存储器(或来自加速器的主机偏移访问)可以使用所描述的MA协议。

如图29中所示,在一种实施方式中,加速器包括PCI配置寄存器2902和MMIO寄存器2906,其可以被编程为提供对设备后端资源2905的访问。在一种实施方式中,MMIO寄存器2906的基地址由PCI配置空间中的一组基地址寄存器(BAR)2901指定。与先前的实施方式不同,此处描述的数据流加速器(DSA)的一种实施方式不实现多个通道或PCI功能,因此设备中每个寄存器只有一个实例。但是,单个平台中可以有多于一个DSA设备。

实施方式可以提供此处未描述的附加性能或调试寄存器。任何此类寄存器都应视为实施方式特定的。

PCI配置空间访问作为对齐的1、2或4字节访问来执行。有关访问PCI配置空间中未实现的寄存器和保留位的规则,参阅PCI Express基本规范。

对BAR0区域(能力、配置和状态寄存器)的MMIO空间访问作为对齐的1、2、4或8字节访问来执行。8字节访问应仅用于8字节寄存器。软件不应读取或写入未实现的寄存器。使用ENQCMD、ENQCMDS或MOVDIR64B指令(下面详细描述),应作为64字节访问执行对BMI 2和BAR4区域的MMIO空间访问。应使用ENQCMD或ENQCMDS访问配置为共享的工作队列(SWQ),并且必须使用MOVDIR64B来访问配置为专用的工作队列(DWQ)。

DSA PCI配置空间的一种实施方式实现三个64位BAR 2901。设备控制寄存器(BAR0)是64位BAR,其包含设备控制寄存器的物理基地址。这些寄存器提供有关设备能力、配置和启用设备的控件以及设备状态的信息。BAR0区域的大小取决于中断消息储存2904的大小。大小为32KB加上中断消息储存条目2904的数量乘以16,向上舍入到下一个2的幂。例如,如果设备支持1024个中断消息储存条目2904,中断消息储存为16KB,BAR0的大小为64KB。

BAR2是64位BAR,其包含特权和非特权入口的物理基地址。每个入口的大小为64字节,并位于单独的4KB页上。这允许使用CPU页表将入口独立映射到不同的地址空间。入口用于向设备提交描述符。特权入口由内核模式软件使用,非特权入口由用户模式软件使用。非特权入口的数量与支持的工作队列数量相同。特权入口的数量是工作队列数量(WQ)×(MSI-X-table-size-1)。用于提交描述符的入口的地址允许设备确定将描述符放入哪个工作队列(WQ),入口是特权还是非特权的,以及哪个MSI-X表条目可以用于完成中断。例如,如果设备支持8个WQ,则给定描述符的WQ是(入口地址>>12)&0x7。如果入口地址>>15为0,则入口为非特权的;否则它是特权的,并且用于完成中断的MSI-X 2903表索引是入口地址>>15。位5:0必须为0。忽略位11:6;因此,可以以相同的效果使用页上的任何64字节对齐的地址。

使用非特权入口的描述符提交受制于WQ的占用阈值,如使用工作队列配置(WQCFG)寄存器配置的。使用特权入口的描述符提交不受制于该阈值。必须使用ENQCMD或ENQCMDS提交对SWQ的描述符提交。忽略对SWQ入口的任何其他写操作。必须使用64字节写操作提交对DWQ的描述符提交。软件使用MOVDIR64B,以保证无损的64字节写入。到禁用或专用WQ入口的ENQCMD或ENQCMDS返回重试。忽略对DWQ入口的任何其他写操作。对BAR2地址空间的任何读操作都返回全1。应使用特权入口提交内核模式描述符,以便接收完成中断。如果使用非特权入口提交内核模式描述符,则不能请求完成中断。可以使用特权入口或非特权入口提交用户模式描述符。

BAR2区域中的入口的数量是设备支持的WQ的数量乘以MSI-X 2903表大小。MSI-X表大小通常是WQ的数量加1。因此,例如,如果设备支持8个WQ,则BAR2的有用大小将是8×9×4KB=288KB。BAR2的总大小将向上舍入到下一个2的幂,即512KB。

BAR4是64位BAR,其包含访客入口的物理基地址。每个访客入口的大小为64字节,且位于单独的4KB页中。这允许使用CPU扩展页表(EPT)将入口独立地映射到不同的地址空间。如果GENCAP中的中断消息储存支持字段为0,则不实现此BAR。

访客内核模式软件可以使用访客入口来向设备提交描述符。访客入口的数量是中断消息储存中的条目数乘以支持的WQ数量。用于提交描述符的访客入口的地址允许设备确定描述符的WQ以及用于为描述符完成生成完成中断的中断消息储存条目(如果是内核模式描述符,并且如果在描述符中设置了请求完成中断标志)。例如,如果设备支持8个WQ,则给定描述符的WQ为(访客入口地址>>12)&0x7,用于完成中断的中断表条目索引为访客入口地址>>15。

在一种实施方式中,MSI-X是DSA提供的唯一PCIe中断能力,并且DSA不实现传统PCI中断或MSI。该寄存器结构的详细信息在PCI Express规范中。

在一种实施方式中,三个PCI Express能力控制地址转换。只支持这些能力的某些值组合,如表A所示。在通用控制寄存器(GENCTRL)中的使能位被设置为1时检查这些值。

表A

如果在启用设备时由软件改变了这些能力中的任何一个,则设备可以暂停并且在软件错误寄存器中报告错误。

在一种实施方式中,软件配置PASID能力以控制设备是否使用PASID来执行地址转换。如果禁用PASID,则仅可以使用物理地址。如果启用PASID,则可以使用虚拟或物理地址,取决于IOMMU配置。如果启用PASID,则应启用地址转换服务(ATS)和页请求服务(PRS)。

在一种实施方式中,软件配置ATS能力以控制设备是否应该在执行存储器访问之前转换地址。如果在IOMMU 2810中启用了地址转换,则必须在设备中启用ATS以获得可接受的系统性能。如果在IOMMU 2810中未启用地址转换,则必须禁用ATS。如果禁用ATS,则仅可以使用物理地址,并且使用未经转换的访问执行所有存储器访问。如果启用了PASID,则必须启用ATS。

在一种实施方式中,软件配置PRS能力以控制设备在地址转换失败时是否可以请求页。如果启用了PASID,则必须启用PRS,如果禁用PASID,则必须禁用PRS。

一些实施方式利用在一个或多个处理器核心、加速器设备和/或其他类型的处理设备(例如,I/O设备)之间无缝共享的虚拟存储器空间。特别地,一种实施方式利用共享虚拟存储器(SVM)架构,其中在核心、加速器设备和/或其他处理设备之间共享相同的虚拟存储器空间。另外,一些实施方式包括使用公共虚拟存储器空间寻址的异构形式的物理系统存储器。异构形式的物理系统存储器可以使用不同的物理接口来与DSA架构连接。例如,加速器设备可以直接耦合到本地加速器存储器,例如高带宽存储器(HBM),并且每个核心可以直接耦合到主机物理存储器,例如动态随机存取存储器(DRAM)。在此示例中,共享虚拟存储器(SVM)映射到HBM和DRAM的组合物理存储器,以便加速器、处理器核心和/或其他处理设备可以使用一致的虚拟存储器地址集来访问HBM和DRAM。

以下详细描述这些和其他特征加速器。通过简要概述,不同的实施方式可以包括以下基础结构特征中的一个或多个:

一种实施方式改进了具有直接连接的存储器(例如堆叠的DRAM或HBM)的加速器的性能,并且简化了利用具有直接连接的存储器的加速器的应用程序的应用程序开发。该实施方式允许将加速器附接的存储器映射为系统存储器的一部分,并使用共享虚拟存储器(SVM)技术(例如当前IOMMU实施方式中使用的)进行访问,而不会遇到与完整系统缓存一致性相关的典型性能缺陷。

在无需繁重的缓存一致性开销的情况下作为系统存储器的一部分访问加速器附接的存储器的能力为加速器卸载提供了有益的操作环境。作为系统地址映射的一部分访问存储器的能力允许主机软件设置操作数和访问计算结果,而无需传统I/O DMA数据复制的开销。这种传统的复制涉及驱动程序调用,中断和存储器映射I/O(MMIO)访问,这些相对于简单的存储器访问而言都是低效的。同时,在没有缓存一致性开销的情况下访问加速器附接的存储器的能力对于卸载计算的执行时间可能是至关重要的。例如,在有大量流写入存储器业务的情况下,缓存一致性开销可能将加速器看到的有效写入带宽减半。操作数设置的效率、结果访问的效率和加速器计算的效率都在确定加速器卸载的工作效果中起作用。如果卸载工作的成本(例如,设置操作数;获得结果)太高,则卸载可能根本不会得到回报,或者可能将加速器仅局限于非常大的工作。加速器执行计算的效率可能有相同的效果。

一种实施方式根据启动存储器访问的实体(例如,加速器、核心等)和被访问的存储器(例如,主机存储器或加速器存储器)应用不同的存储器访问和一致性技术。这些技术通常被称为“一致性偏移”机制,其为加速器附接的存储器提供两组缓存一致性流,一组优化用于对其附接存储器的高效加速器访问,第二组优化用于对加速器附接的存储器的主机访问以及对加速器附接的存储器的共享加速器/主机访问。此外,它包括两种用于在这些流之间切换的技术,一种由应用软件驱动,另一种由自主硬件提示驱动。在两组一致性流中,硬件保持完整的缓存一致性。

如图30中总体上所示,一种实施方式适用于包括加速器3001和具有处理器核心和I/O电路3003的一个或多个计算机处理器芯片的计算机系统,其中加速器3001通过多协议链路3010耦合到处理器。在一种实施方式中,多协议链路3010是支持多个不同协议的动态复用链路,包括但不限于上面详述的协议。然而,应该注意,本发明的基本原理不限于任何特定的协议集。另外,注意,取决于实施方式,加速器3001和核心I/O 3003可以集成在相同的半导体芯片或不同的半导体芯片上。

在所示实施方式中,加速器存储器总线3012将加速器3001耦合到加速器存储器3005,并且单独的主机存储器总线3011将核心I/O 3003耦合到主机存储器3007。如上所述,加速器存储器3005可以包括高带宽存储器(HBM)或堆叠DRAM(本文描述了其中的一些示例),并且主机存储器3007可以包括DRAM,诸如双倍数据速率同步动态随机存取存储器(例如,DDR3 SDRAM、DDR4 SDRAM等)。然而,本发明的基本原理不限于任何特定类型的存储器或存储器协议。

在一种实施方式中,加速器3001和在处理器芯片3003内的处理核心上运行的“主机”软件都使用两个不同的协议流集合(称为“主机偏移”流和“设备偏移”流)来访问加速器存储器3005。如下所述,一种实施方式支持用于调制和/或选择用于特定存储器访问的协议流的多个选项。

一致性偏移流部分地在加速器3001与一个处理器芯片3003之间的多协议链路3010上的两个协议层上实现:CAC协议层和MA协议层。在一种实施方式中,通过以下方式启用一致性偏移流:(a)以新方式使用CAC协议中的现有操作码,(b)向现有MA标准添加新操作码,和(c)向多协议链路3001添加对MA协议的支持(先前链路仅包括CAC和PCDI)。注意,多协议链路不仅限于支持CAC和MA;在一种实施方式中,仅需要支持至少那些协议。

如本文所使用的,如图30所示,“主机偏移”流是通过加速器3001所附接的处理器芯片3003中的标准一致性控制器3009将所有请求汇集到(funnel)加速器存储器3005的流集合,所述请求包括来自加速器本身的请求。这使得加速器3001采用迂回路径来访问其自己的存储器,但允许来自加速器3001和处理器核心I/O 3003的访问使用处理器的标准一致性控制器3009被保持一致。在一种实施方式中,流使用CAC操作码通过多协议链路向处理器的一致性控制器3009发出请求,方式与处理器核心3009向一致性控制器3009发出请求的方式相同或相似。例如,处理器芯片的一致性控制器3009可以向所有对等处理器核心芯片(例如,3003)和代表加速器的内部处理器代理发出由来自加速器3001的请求产生的UPI和CAC一致性消息(例如,探听),就像它们对来自处理器核心3003的请求一样。以这种方式,在加速器3001和处理器核心I/O 3003访问的数据之间保持一致性。

在一种实施方式中,一致性控制器3009还通过多协议链路3010有条件地向加速器的存储器控制器3006发出存储器访问消息。这些消息类似于一致性控制器3009发送到其处理器管芯本地的存储器控制器的消息,并且包括允许数据直接返回到加速器3001内部的代理的新操作码,而不是强制数据返回到多协议链路3010的处理器的一致性控制器3009,然后通过多协议链路3010作为CAC响应返回到加速器3001。

在图30中所示的“主机偏移”模式的一种实施方式中,来自处理器核心3003的针对加速器附接存储器3005的所有请求被直接发送到处理器一致性控制器3009,就像它们针对正常主机存储器3007一样。一致性控制器3009可以应用它们的标准缓存一致性算法并发送它们的标准缓存一致性消息,就像它们对来自加速器3001的访问所做的一样,并且就像它们对访问正常主机存储器3007所做的一样。一致性控制器3009还有条件地针对这类请求、通过多协议链路3010发送MA命令,尽管在这种情况下,MA流通过多协议链路3010返回数据。

如图31所示,“设备偏移”流是允许加速器3001访问其本地附接的存储器3005而无需咨询主处理器的缓存一致性控制器3007的流。具体而言,这些流允许加速器3001通过存储器控制器3006访问其本地附接的存储器而不通过多协议链路3010发送请求。

在“设备偏移”模式中,来自处理器核心I/O 3003的请求是根据上面对“主机偏移”的描述发出的,但是在它们的流的MA部分中以不同方式完成。当处于“设备偏移”时,完成对加速器附接的存储器3005的处理器请求,如同它们被发布为“未缓存”请求一样。采用这种“未缓存”约定,以便受制于设备偏移流的数据永远不会被缓存在处理器的缓存层级结构中。正是这个事实允许加速器3001访问其存储器3005中的设备偏移数据,而无需咨询处理器上的缓存一致性控制器3009。

在一种实施方式中,对“未缓存的”处理器核心3003访问流的支持是利用处理器的CAC总线上的全局观察、一次使用(“GO-UO”)响应来实现的。该响应将一条数据返回到处理器核心3003,并指示处理器仅使用数据的值一次。这可以防止数据的缓存并满足“未缓存”流的需要。在具有不支持GO-UO响应的核心的系统中,可以使用多协议链路3010的MA层上和处理器核心3003CAC总线上的多消息响应序列来实现“未缓存”流。

具体地,当发现处理器核心以加速器3001处的“设备偏移”页为目标时,加速器设置某种状态以阻止从加速器到目标缓存行的未来请求,并在多协议链路3010的MA层上发送特定“设备偏移命中”响应。响应于该MA消息,处理器的缓存一致性控制器3009将数据返回到请求处理器核心3003,并且在数据返回后立即跟发探听无效消息。当处理器核心3003确认探听无效完成时,缓存一致性控制器3009在多协议链路3010的MA层上将另一特定MA“设备偏移阻断完成”消息发送回加速器3001。该完成消息导致加速器3001清除上述阻断状态。

图107示出了使用偏移的实施例。在一种实施方式中,设备和主机偏移流之间的选择由偏移跟踪器数据结构驱动,该数据结构可以在加速器存储器3005中作为偏移表10707来维护。该偏移表10707可以是页-粒度结构(即,以存储器页的粒度来控制),其包括针对每个加速器附接的存储器页的1或2位。偏移表10707可以在加速器附接的存储器3005的被盗存储器范围中实现,在加速器中具有或不具有偏移缓存10703(例如,用于缓存偏移表10707的频繁/最近使用的条目)。可替换地,整个偏移表10707可以在加速器3001内维护。

在一种实施方式中,在实际访问加速器存储器之前访问与对加速器附接的存储器3005的每次访问相关联的偏移表条目,从而导致以下操作:

·来自加速器3001的在设备偏移中找到其页的本地请求被直接转发到加速器存储器3005。

·来自加速器3001的在主机偏移中找到其页的本地请求作为CAC请求通过多协议链路3010被转发到处理器3003。

·来自处理器3003的在设备偏移中找到其页的MA请求使用上述“未缓存”流完成请求。

·来自处理器3003的在主机偏移中找到其页的MA请求像正常的存储器读取一样完成请求。

页的偏移状态可以通过以下机制来改变:基于软件的机制、硬件辅助的基于软件的机制、或者针对有限的一组情况的纯粹基于硬件的机制。

用于改变偏移状态的一种机制采用API调用(例如,OpenCL),其又调用加速器的设备驱动程序,该驱动程序又向加速器3001发送消息(或将命令描述符排队),从而引导其改变偏移状态,并且对于某些转换在主机中执行缓存刷新操作。从主机偏移转换到设备偏移需要缓存刷新操作,但对于相反的转换不需要缓存刷新操作。

在一些情况下,软件难以确定何时进行偏移转换API调用以及识别需要偏移转换的页。在这种情况下,加速器可以实现偏移转换“提示”机制,其中它检测到对偏移转换的需要并向其驱动程序发送指示进行偏移转换的消息。提示机制可能像响应偏移表查找的机制一样简单,该机制在加速器访问主机偏移页或主机访问设备偏移页时触发,并通过中断向加速器驱动程序发信号通知事件。

注意,一些实施方式可能需要第二偏移状态位以启用偏移转换状态值。这允许系统在这些页处于偏移改变的过程中时继续访问存储器页(即,当部分刷新缓存时,必须抑制由于后续请求引起的增量缓存污染(incremental cache pollution)。)

图32中示出了根据一种实施方式的示例性过程。该过程可以在本文描述的系统和处理器架构上实现,但不限于任何特定的系统或处理器架构。

在3201处,将特定页集合放置在设备偏移中。如上所述,这可以通过在偏移表中更新这些页的条目以指示这些页处于设备偏移中(例如,通过设置与每个页相关联的位)来实现。在一种实施方式中,一旦设置为设备偏移,则保证页不被缓存在主机缓存存储器中。在3202处,从设备存储器分配页(例如,软件通过启动驱动程序/API调用来分配页)。

在3203处,将操作数从处理器核心推送到所分配的页。在一次植入中,这通过使用API调用的软件来完成,以将操作数页翻转到主机偏移(例如,通过OpenCL API调用)。不需要数据复制或缓存刷新,并且操作数数据可能在此阶段在主机缓存层级结构中的某个任意位置结束。

在3204处,加速器设备使用操作数来生成结果。例如,它可以直接从其本地存储器(例如,上面讨论的3005)执行命令和处理数据。在一种实施方式中,软件使用OpenCL API将操作数页翻转回设备偏移(例如,更新偏移表)。作为API调用的结果,工作描述符被提交给设备(例如,通过如下所述的专用工作队列上的共享)。工作描述符可以指示设备刷新来自主机缓存的操作数页,从而导致缓存刷新(例如,使用CAC协议上的CLFLUSH来执行)。在一种实施方式中,加速器在没有与主机相关的一致性开销的情况下执行并将数据转存到结果页。

在3205处,从分配的页中提取结果。例如,在一种实施方式中,软件进行一个或多个API调用(例如,通过OpenCL API)以将结果页翻转到主机偏移。此操作可能会导致某些偏移状态发生更改,但不会导致任何一致性或缓存刷新操作。然后,主机处理器核心可以根据需要访问、缓存和共享结果数据。最后,在3206处,释放所分配的页(例如,通过软件)。

图33中示出了从一个或多个I/O设备释放操作数的类似过程。在3301处,将特定页集合置于设备偏移中。如上所述,这可以通过在偏移表中更新这些页的条目以指示这些页处于设备偏移(例如,通过设置与每个页相关联的位)来完成。在一种实施方式中,一旦设置为设备偏移,则保证页不被缓存在主机缓存存储器中。在3302处,从设备存储器分配页(例如,软件通过启动驱动程序/API调用来分配页)。

在3303处,将操作数从I/O代理推送到分配的页。在一次植入中,这通过软件向I/O代理提出DMA请求和I/O代理使用非分配储存写入数据来完成。在一种实施方式中,数据从不分配到主机缓存层级结构中,并且目标页保持在设备偏移中。

在3304处,加速器设备使用操作数来生成结果。例如,软件可以向加速器设备提交工作;不需要页转换(即,页保持在设备偏移中)。在一种实施方式中,加速器设备在没有与主机相关的一致性开销的情况下执行,并且加速器将数据转存到结果页。

在3305处,I/O代理从所分配的页中提取结果(例如,在软件的指导下)。例如,软件可以向I/O代理提出DMA请求。由于源页保留在设备偏移中,因此不需要页转换。在一种实施方式中,I/O桥使用RdCurr(读取当前)请求从结果页抓取数据的不可缓存副本。

在一些实施方式中,工作队列(WQ)保持由软件提交的“描述符”,用于实现服务质量(QoS)和公平性策略的仲裁器,用于处理描述符的处理引擎,地址转换和缓存接口,以及存储器读/写接口。描述符定义要完成的工作范围。如图34所示,在一种实施方式中,存在两种不同类型的工作队列:专用工作队列3400和共享工作队列3401。专用工作队列3400存储单个应用程序3413的描述符,而共享工作队列3401存储由多个应用程序3410-3412提交的描述符。硬件接口/仲裁器3402根据指定的仲裁策略(例如,基于每个应用程序3410-3413的处理要求和QoS/公平性策略)将描述符从工作队列3400-3401分派到加速器处理引擎3405。

图108A-108b示出了与基于工作队列的实施方式一起使用的存储器映射I/O(MMIO)空间寄存器。版本寄存器10807报告设备支持的该架构规范的版本。

一般能力寄存器(GENCAP)10808指定设备的一般能力,例如最大传输大小、最大批次大小等。表B列出了可以在GENCAP寄存器中指定的各种参数和值。

表B

在一种实施方式中,工作队列能力寄存器(WQCAP)10810指定工作队列的能力,例如对专用和/或共享操作模式的支持、引擎的数量、工作队列的数量。下表C列出了可以配置的各种参数和值。

表C

在一种实施方式中,操作能力寄存器(OPCAP)10811是用于指定设备支持的操作类型的位掩码。每个位对应于具有与位位置相同的代码的操作类型。例如,该寄存器的第0位对应于无操作操作(代码0)。如果支持该操作,则对该位进行置位,如果不支持该操作,则清除该位。

表D

在一种实施方式中,一般配置寄存器(GENCFG)10812指定虚拟通道(VC)引导标签。见下表E.

表E

在一种实施方式中,一般控制寄存器(GENCTRL)10813指示是否针对硬件或软件错误生成中断。见下表F。

表F

在一种实施方式中,设备启用寄存器(ENABLE)存储错误代码、关于设备是否被启用的指示符、以及设备重置值。有关详细信息,请参阅下表G。

表G

在一种实施方式中,中断原因寄存器(INTCAUSE)存储指示中断原因的值。见下表H。

表H

在一种实施方式中,命令寄存器(CMD)10814用于提交排出WQ、排出PASID和排出All命令。中止字段指示所请求的操作是排出还是中止。在写入该寄存器之前,软件可以确保先前通过该寄存器提交的任何命令都已完成。在写入该寄存器之前,如果请求完成记录,则软件可以配置命令配置寄存器以及命令完成记录地址寄存器。

排出All命令排出或中止所有WQ和所有引擎中的所有未完成描述符。排出PASID命令排出或中止在所有WQ和所有引擎中使用指定PASID的描述符。排出WQ排出或中止指定WQ中的所有描述符。根据实施方式,除了需要等待的描述符之外,任何排出命令都可以等待其他描述符的完成。

如果中止字段是1,则软件请求放弃受影响的描述符。但是,硬件仍可能完成其中的部分或全部。如果描述符被放弃,则不会写入完成记录,也不会为该描述符生成完成中断。可能发生一些或所有其他存储器访问。

通过生成完成中断(如果请求)并通过清除该寄存器的状态字段来指示命令的完成。在发信号通知完成时,所有受影响的描述符都已完成或被放弃,并且将不会由于任何受影响的描述符而生成任何进一步的地址转换、存储器读取、存储器写入或中断。见下表I。

表I

在一种实施方式中,软件错误状态寄存器(SWERROR)10815存储多种不同类型的错误,例如:提交描述符时的错误;转换描述符中的完成记录地址的错误;在描述符中的完成记录地址有效标志为0的情况下,验证描述符的错误;在描述符中的完成记录地址有效标志为0的情况下,处理描述符时的错误(例如页错误)。请参见下表J。

表J

在一种实施方式中,硬件错误状态寄存器(HWERROR)10816以与软件错误状态寄存器类似的方式(参见上文)。

在一种实施方式中,组配置寄存器(GRPCFG)10817存储每个工作队列/引擎组的配置数据(参见图36-37)。特别是,组配置表是BAR0中的寄存器阵列,控制工作队列到引擎的映射。存在与引擎相同数量的组,但软件可以配置所需的组数。每个活动组包含一个或多个工作队列和一个或多个引擎。任何未使用的组必须同时具有等于0的WQs字段和Engines字段。提交给组中任何WQ的描述符可由组中的任何引擎处理。每个活动工作队列必须位于单个组中。活动工作队列是对应WQCFG寄存器的WQ大小字段为非零值的工作队列。任何不在组中的引擎都处于非活动状态。

每个GRPCFG寄存器10817可以被划分为三个子寄存器,每个子寄存器是一个或多个32位字(参见表K-M)。在启用设备时,这些寄存器可以是只读的。如果WQCAP的工作队列配置支持字段为0,这些寄存器也是只读的。

在一种实施方式中,对于每个组G,0≤G<引擎数量,BAR0中的子寄存器的偏移如下:

表K

表L

表M

在一种实施方式中,工作队列配置寄存器(WQCFG)10818存储指定每个工作队列的操作的数据。WQ配置表是BAR0中的16字节寄存器的阵列。WQ配置寄存器的数量与WQCAP中的WQ字段数量匹配。

将每个16字节WQCFG寄存器分成四个32位子寄存器,其也可以使用对齐的64位读取或写入操作来读取或写入。

在启用设备或WQCAP的工作队列配置支持字段为0时,每个WQCFG-A子寄存器是只读的。

除非WQCAP的工作队列配置支持字段为0,否则每个WQCFG-B可在任何时间写入。如果WQ阈值字段在启用WQ时包含大于WQ大小的值,则WQ不被启用且WQ错误代码被设置为4。如果在启用WQ时以大于WQ大小的值写入WQ阈值字段,则禁用WQ,并将WQ错误代码设置为4。

在启用WQ时每个WQCFG-C子寄存器是只读的。它可以在将WQ启用设置为1之前或同时被写入。如果WQCAP的工作队列配置支持字段为0,则以下字段始终是只读的:WQ模式,WQ错误阻断启用和WQ优先。即使WQCAP的工作队列配置支持字段为0,未启用WQ时,WQCFG-C的以下字段也是可写入的:WQ PASID和WQ U/S。

每个WQCFG-D子寄存器在任何时候都是可写入的。但是,在未启用设备时,将WQ启用设置为1会出错。

在将WQ启用设置为1时,WQ被启用和WQ错误代码字段都被清除。随后,WQ被启用或WQ错误代码将被设置为非零值,指示是否成功启用WQ。

所有WQCFG寄存器的WQ大小字段的总和不得大于GENCAP中的总WQ大小字段。在启用设备时检查该约束。无法启用WQ大小字段为0的WQ,并忽略这些WQCFG寄存器的所有其他字段。启用设备时,WQ大小字段为只读。有关每个子寄存器的数据,参见表N。

表N

在一种实施方式中,工作队列占用率中断控制寄存器10819(每个工作队列(WQ)一个)允许软件在工作队列占用率下降到指定阈值时请求中断。当WQ的WQ占用率中断启用为1且当前WQ占用率等于或小于WQ占用率限值时,可以执行以下操作:

1.清除WQ占用率中断启用字段。

2.将中断原因寄存器的第3位设置为1。

3.如果在步骤2之前中断原因寄存器的第3位为0,则使用MSI-X表条目0生成中断。

4.如果寄存器被写入启用=1且限值≥当前WQ占用率,则立即生成中断。因此,如果寄存器被写入启用=1且限值≥WQ大小,则始终立即生成中断。

表O

在一种实施方式中,工作队列状态寄存器(每个WQ一个)10820指定当前在每个WQ中的条目的数量。无论何时向队列提交或从队列中分派描述符,都可能改变该数量,因此无法依赖它来确定WQ中是否有空间。

在一种实施方式中,MSI-X条目10821存储MSI-X表数据。偏移和条目数在MSI-X能力中。建议的条目数是WQ数量加2。

在一种实施方式中,MSI-X待决位数组10822存储偏移和条目数在MSI-X能力中。

在一种实施方式中,中断消息储存条目10823以表结构存储中断消息。该表的格式类似于PCIe定义的MSI-X表的格式,但大小不限于2048个条目。然而,该表的大小可以在不同的DSA实施方式之间变化,并且在一些实施方式中可以少于2048个条目。在一种实施方式中,条目的数量在一般能力寄存器的中断消息储存大小字段中。如果中断消息储存支持能力为0,则此表不存在。为了使DSA支持大量虚拟机或容器,支持的表大小需要很大。

在一种实施方式中,IMS中的每个条目的格式如下表P中阐明:

表P

图35示出了数据流加速器(DSA)设备的一个实施方式,该DSA设备包括接收通过I/O结构接口3501(例如,如上所述的多协议链路2800)提交的描述符的多个工作队列3511-3512。DSA使用I/O结构接口3501接收来自客户端的下游工作请求(例如处理器核心,对等输入/输出(IO)代理(例如网络接口控制器(NIC))和/或软件链接卸载请求))以及上游读、写和地址转换操作。所示实施方式包括仲裁器3513,仲裁器3513在工作队列之间进行仲裁并将工作描述符分派给多个引擎3550中的一个。仲裁器3513和工作队列3511-1012的操作可以通过工作队列配置寄存器3500来配置。例如,仲裁器3513可以被配置为实现各种QoS和/或公平性策略,用于将描述符从每个工作队列3511-1012分派到每个引擎3550。

在一种实施方式中,在工作队列3511-3512中排队的一些描述符是批次描述符3515,其包含/标识一批工作描述符。仲裁器3513将批次描述符转发到批处理单元3516,批处理单元3516通过使用通过转换缓存3520(处理器上可能的其他地址转换服务)转换的地址从存储器读取描述符数组3518来处理批次描述符。一旦识别出物理地址,数据读/写电路3540就从存储器中读取该批次描述符。

第二仲裁器3519在批处理单元3516提供的批次工作描述符3518和从工作队列3511-3512取回的单个工作描述符3514之间进行仲裁,并将工作描述符输出到工作描述符处理单元3530。在一种实施方式中,工作描述符处理单元3530具有以下阶段:读取存储器(通过数据R/W单元3540),对数据执行所请求的操作,生成输出数据和写入输出数据(通过数据R/W单元3540),完成记录,并中断消息。

在一种实施方式中,工作队列配置允许软件将每个WQ(通过WQ配置寄存器3500)配置为使用非发布的ENQCMD/S指令接收描述符的共享工作队列(SWQ)或使用发布的MOVDIR64B指令接收描述符的专用工作队列(DWQ)。如上面关于图34所述,DWQ可以处理从单个应用程序提交的工作描述符和批次描述符,而SWQ可以在多个应用程序之间共享。WQ配置寄存器3500还允许软件控制哪些WQ 3511-3512馈送到哪个加速器引擎3550以及WQ 3511-3512馈送每个引擎的相对优先级。例如,可以指定有序的优先级集合(例如,高、中、低;1、2、3等),并且描述符从较高优先级工作队列的分派通常可以在从较低优先级工作队列的分派之前或比从较低优先级工作队列的分派更频繁。例如,对于被标识为高优先级和低优先级的两个工作队列,对于每10个要分派的描述符,可以从高优先级工作队列分派10个描述符中的8个,而从低优先级工作队列分派10个描述符中的2个。可以使用各种其他技术来实现工作队列3511-3512之间的不同优先级。

在一种实施方式中,数据流加速器(DSA)与PCI Express配置机制软件兼容,并在其配置映射寄存器集中实现PCI头和扩展空间。配置寄存器可以通过根复合体中的CFC/CF8或MMCFG进行编程。所有内部寄存器也可通过JTAG或SMBus接口访问。

在一种实施方式中,DSA设备使用存储器映射的寄存器来控制其操作。能力、配置和工作提交寄存器(入口)可通过BAR0、BAR2和BAR4寄存器定义的MMIO区域访问(如下所述)。每个入口可以位于单独的4K页上,以便它们可以使用处理器页表独立地映射到不同的地址空间(客户端)。

如上所述,软件通过描述符指定DSA的工作。描述符指定DSA要执行的操作类型,数据地址和状态缓冲区,立即操作数,完成属性等(描述符格式的详细信息和详细信息如下所述)。完成属性指定写入完成记录的地址,以及生成可选完成中断所需的信息。

在一种实施方式中,DSA避免在设备上维护客户端特定状态。处理描述符的所有信息都在描述符本身中。这改善了其在用户模式应用程序之间以及虚拟化系统中的不同虚拟机(或机器容器)之间的可共享性。

描述符可以包含操作和相关参数(称为工作描述符),或者它可以包含工作描述符数组(称为批次描述符)的地址。软件在存储器中准备描述符并将描述符提交给设备的工作队列(WQ)3511-3512。根据WQ的模式和客户端的权限级别,使用MOVDIR64B、ENQCMD或ENQCMDS指令将描述符提交给设备。

每个WQ 3511-3512具有固定数量的时隙,因此在重负载下可能变满。在一种实施方式中,设备提供所需的反馈以帮助软件实现流控制。设备分派来自工作队列3511-3512的描述符,并将它们提交给引擎以进行进一步处理。当引擎3550完成描述符或遇到导致中止的某些故障或错误时,它通过在主机存储器中写入完成记录、发出中断或两者来通知主机软件。

在一种实施方式中,每个工作队列可通过多个寄存器访问,每个寄存器位于设备MMIO空间的单独4KB页中。每个WQ的一个工作提交寄存器称为“非特权入口”,并映射到用户模式客户端使用的用户空间。另一个工作提交寄存器称为“特权入口”,由内核模式驱动程序使用。其余的是访客入口,并由虚拟机中的内核模式客户端使用。

如上所述,每个工作队列3511-3512可以被配置为以两种模式之一运行,专用或共享。DSA暴露工作队列能力寄存器中的能力位,以指示对专用和共享模式的支持。它还暴露工作队列配置寄存器3500中的控制,以将每个WQ配置为以其中一种模式操作。WQ的模式只能在禁用WQ时改变,即(WQCFG.Enabled=0)。WQ能力寄存器和WQ配置寄存器的其他细节如下所述。

在一种实施方式中,在共享模式中,DSA客户端使用ENQCMD或ENQCMDS指令将描述符提交到工作队列。ENQCMD和ENQCMDS使用64字节非发布写入,并在完成之前等待来自设备的响应。如果工作队列中有空间,则DSA返回“成功”(例如,发送到请求客户端/应用程序),或者如果工作队列已满,则返回“重试”。ENQCMD和ENQCMDS指令可以在零标志中返回命令提交的状态(0表示成功,1表示重试)。使用ENQCMD和ENQCMDS指令,多个客户端可以直接并同时将描述符提交到同一工作队列。由于设备提供此反馈,客户端可以辨别其描述符是否被接受。

在共享模式中,DSA可以为内核模式客户端保留通过特权入口提交的一些SWQ容量。接受通过非特权入口的工作提交,直到SWQ中的描述符数量达到为SWQ配置的阈值。接受通过特权入口的工作提交,直到SWQ满为止。通过访客入口的工作提交以与非特权入口相同的方式受阈值的限制。

如果ENQCMD或ENQCMDS指令返回“成功”,则描述符已被设备接受并排队进行处理。如果指令返回“重试”,则软件可以尝试将描述符重新提交到SWQ,或者如果它是使用非特权入口的用户模式客户端,则它可以请求内核模式驱动程序使用特权入口代表它提交描述符。这有助于避免拒绝服务并提供向前进度保证。可替换地,如果SWQ已满,则软件可以使用其他方法(例如,使用CPU来执行工作)。

客户端/应用程序由设备使用称为进程地址空间ID(PASID)的20位ID来标识。设备使用PASID来查找设备TLB 1722中的地址,并将地址转换或页请求发送到IOMMU 1710(例如,通过多协议链路2800)。在共享模式下,与每个描述符一起使用的PASID包含在描述符的PASID字段中。在一种实施方式中,ENQCMD将当前线程的PASID从特定寄存器(例如,PASIDMSR)复制到描述符中,而ENQCMDS允许监管程序模式软件将PASID复制到描述符中。

在“专用”模式中,DSA客户端可以使用MOVDIR64B指令将描述符提交给设备工作队列。MOVDIR64B使用64字节发布的写入,并且由于写入操作的发布特性,指令完成得更快。对于专用工作队列,DSA可以暴露工作队列中的时隙总数,并依赖于软件来提供流控制。软件负责跟踪提交和完成的描述符的数量,以便检测工作队列的充满状况。如果软件在工作队列中没有空间时错误地将描述符提交给专用WQ,则丢弃描述符并且可以记录错误(例如,在软件错误寄存器中)。

由于MOVDIR64B指令未像ENQCMD或ENQCMDS指令那样填充PASID,因此描述符中的PASID字段不能用于专用模式。DSA可以忽略提交给专用工作队列的描述符中的PASID字段,并使用WQ配置寄存器3500的WQ PASID字段来代替进行地址转换。在一种实施方式中,WQPASID字段在其以专用模式配置工作队列时由DSA驱动程序设置。

虽然专用模式不由多个客户端/应用程序共享单个DWQ,但是DSA设备可以被配置为具有多个DWQ,并且每个DWQ可以被独立地分配给客户端。此外,可以将DWQ配置为具有相同或不同的QoS级别,以便为不同的客户端/应用程序提供不同的性能级别。

在一种实施方式中,数据流加速器(DSA)包含两个或多个引擎3550,其处理提交给工作队列3511-1012的描述符。DSA架构的一种实施方式包括4个引擎,编号为0到3。引擎0和1各自能够利用设备的全部带宽(例如,30GB/s用于读取,30GB/s用于写入)。当然,所有引擎的组合带宽也限于设备可用的最大带宽。

在一种实施方式中,软件使用组配置寄存器将WQ 3511-3512和引擎3550配置成组。每个组包含一个或多个WQ和一个或多个引擎。DSA可以使用组中的任何引擎来处理发布到组中的任何WQ的描述符,并且每个WQ和每个引擎可以仅在一个组中。组的数量可以与引擎的数量相同,因此每个引擎可以位于单独的组中,但如果任何组包含多于一个引擎,则不需要使用所有组。

尽管DSA架构允许在配置工作队列、组和引擎方面具有很大的灵活性,但是硬件可以被仅仅设计用于特定配置。根据软件要求,可以以两种不同方式之一配置引擎0和1。一种推荐的配置是将引擎0和1放在同一组中。硬件使用任一引擎来处理来自组中任何工作队列的描述符。在此配置中,如果一个引擎由于高延迟存储器地址转换或页错误而导致停止,则另一个引擎可以继续操作并最大化整个设备的吞吐量。

图36分别示出了每个组3611和3612中的两个工作队列3621-3622和3623-3624,但是可以存在高达支持的最大WQ数量的任何数量。组中的WQ可以是具有不同优先级的共享WQ,或者是一个共享WQ和其他专用WQ,或具有相同或不同优先级的多个专用WQ。在所示的示例中,组3611由引擎0和1 3601服务,组3612由引擎2和3 3602服务。

如图37中所示,使用引擎0 3700和1 3701的另一种配置是将它们分别放置在单独的组3710和3711中。类似地,组2 3712被分配给引擎2 3702,组3被分配给引擎3 3703。此外,组0 3710包括两个工作队列3721和3722;组1 3711包括工作队列3723;工作队列2 3712包括工作队列3724;组3 3713包括工作队列3725。

当软件想要降低延迟敏感操作在其他操作后被阻止的可能性时,软件可以选择该配置。在该配置中,软件向连接到引擎1 3702的工作队列3723提交延迟敏感操作并向连接到引擎0 3700的工作队列3721-3722提交其他操作。

例如,可以使用引擎2 3702和引擎3 3703来写入诸如相变存储器的高带宽非易失性存储器。可以调整这些引擎的带宽能力以匹配这种类型存储器的预期写入带宽。对于该使用,引擎配置寄存器的第2位和第3位应设置为1,表示应将虚拟通道1(VC1)用于来自这些引擎的业务。

在没有高带宽非易失性存储器(例如,相变存储器)的平台中或当DSA设备不用于写入这种类型的存储器时,引擎2和3可以是未使用的。但是,如果提交的操作能够容忍有限的带宽,则软件可以将它们用作附加的低延迟路径。

当每个描述符到达工作队列的头部时,它可以由调度器/仲裁器3513移除并转发到该组中的一个引擎。对于批次描述符3515,其指代存储器中的工作描述符3518,引擎从存储器中取出工作描述符数组(即,使用批处理单元3516)。

在一种实施方式中,对于每个工作描述符3514,引擎3550预取完成记录地址的转换,并将该操作传递到工作描述符处理单元3530。工作描述符处理单元3530使用设备TLB1722和IOMMU 1710进行源和目的地地址转换,读取源数据,执行指定的操作,并将目标数据写回存储器。当操作完成时,引擎将完成记录写入预转换的完成地址,并在工作描述符请求时生成中断。

在一种实施方式中,DSA的多个工作队列可用于提供多级服务质量(QoS)。每个WQ的优先级可以在WQ配置寄存器3500中指定。WQ的优先级是相对于同一组中的其他WQ的(例如,对于组中单独的WQ的优先级没有任何意义)。组中的工作队列可以具有相同或不同的优先级。但是,在同一组中配置具有相同优先级的多个共享WQ没有意义,因为单个SWQ可用于相同的目的。调度器/仲裁器3513根据工作队列的优先级将工作描述符从工作队列3511-3512分派给引擎3550。

图38示出了描述符1300的一种实施方式,其包括用于指定要执行的操作的操作字段3801,多个标志3802,进程地址空间标识符(PASID)字段3803,完成记录地址字段3804,源地址字段3805,目的地址字段3806,完成中断字段3807,传输大小字段3808,以及(可能)一个或多个操作特定字段3809。在一种实施方式中,存在三个标志:完成记录地址有效,请求完成记录和请求完成中断。

公共字段包括可信字段和不可信字段。DSA设备始终信任可信字段,因为它们由主机上的CPU或特权(环0或VMM)软件填充。不受信任的字段由DSA客户端直接提供。

在一种实施方式中,可信字段包括PASID字段3803,保留字段3811和U/S(用户/监管程序)字段3810(即,从偏移0开始的4字节)。使用ENQCMD指令提交描述符时,可以忽略源描述符中的这些字段。在将描述符发送到设备之前,可以将MSR中包含的值(例如,PASIDMSR)放置在这些字段中。

在一种实施方式中,当使用ENQCMDS指令提交描述符时,源描述符中的这些字段由软件初始化。如果未启用PCI Express PASID能力,则将U/S字段3810设置为1并且将PASID字段3803设置为0。

当使用MOVDIR64B指令提交描述符时,可以忽略描述符中的这些字段。该设备代之以使用WQ配置寄存器3500的WQ U/S和WQ PASID字段。

对于批次中的任何描述符,可以忽略这些字段。批次描述符3515的相应字段用于批次中的每个描述符3518。表Q提供了每个可信字段的说明和位位置。

表Q(描述符可信字段)

下表R列出根据描述符的操作字段3801在一种实施方式中所执行的。

表R(操作类型)

下表S列出了在描述符的一种实施方式中使用的标志。

表S(标志)

在一种实施方式中,完成记录地址3804指定完成记录的地址。完成记录可以是32个字节,完成记录地址在32字节边界上对齐。如果完成记录地址有效标志为0,则保留该字段。如果请求完成记录标志为1,则在操作完成时将完成记录写入该地址。如果请求完成记录为0,则仅在出现页错误或错误时才会将完成记录写入该地址。

对于产生结果的任何操作(例如比较),完成记录地址有效和请求完成记录标志都应该是1并且完成记录地址应该是有效的。

对于使用虚拟地址的任何操作,完成记录地址应该是有效的,无论是否设置了请求完成记录标志,以便在存在页错误或错误的情况下可以写入完成记录。

为了获得最佳结果,该字段应该在所有描述符中有效,因为它允许设备向提交描述符的软件报告错误。如果该标志为0并且发生意外错误,则会将错误报告给SWERROR寄存器,并且可以不向提交请求的软件通知错误。

如果在批次描述符中设置了完成队列启用标志,则对于批次中的描述符,将忽略完成记录地址字段3804;而是使用批次描述符中的完成队列地址。

在一种实施方式中,对于从存储器读取数据的操作,源地址字段3805指定源数据的地址。对于源地址没有对齐要求。对于将数据写入存储器的操作,目的地地址字段3806指定目的地缓冲区的地址。对于目的地地址没有对齐要求。对于某些操作类型,该字段用作第二个源缓冲区的地址。

在一种实施方式中,传输大小字段3808指示要从源地址读取以执行操作的字节数。该字段的最大值可以是232-1,但允许的最大传输大小可以更小,并且必须从一般能力寄存器的最大传输大小字段确定。传输大小不应为0。对于大多数操作类型,对于传输大小没有对齐要求。操作说明中注明了例外情况。

在一种实施方式中,如果使用中断消息储存标志是1,则完成中断句柄字段3807指定要用于生成完成中断的中断消息储存条目。该字段的值应小于GENCAP中的中断消息储存大小字段的值。在一种实施方式中,在以下任何条件下保留完成中断句柄字段3807:使用中断消息储存标志为0;请求完成中断标志为0;U/S位为0;一般能力寄存器的中断消息储存支持字段为0;或者描述符是通过访客入口提交的。

如图39所示,完成记录3900的一种实施方式是存储器中的32字节结构,当操作完成或遇到错误时DSA写入该结构。完成记录地址应为32字节对齐。

该部分描述了大多数操作类型共有的完成记录的字段。如果格式与此不同,则每种操作类型的说明包括完成记录图。下面进一步说明附加的操作特定字段。即使不需要所有字段,完成记录3900也可以总是32字节。完成记录3900包含足够的信息以在由于页错误而部分完成时继续操作。

完成记录可以实现为存储器中的32字节对齐结构(由描述符3800的完成记录地址3804标识)。完成记录3900包含完成状态字段3904以指示操作是否已完成。如果操作成功完成,则完成记录可以包含操作的结果(如果有),具体取决于操作类型。如果操作未成功完成,则完成记录包含故障或错误信息。

在一种实施方式中,状态字段3904报告描述符的完成状态。软件应该将该字段初始化为0,以便它可以检测何时写入完成记录。

表T(完成记录状态代码)

上面的表T提供了用于一种实施方式的各种状态代码和相关说明。

下面的表U示出了在一种实施方式中可用的错误代码3903,包括指示错误地址是读取还是写入的第一位以及指示错误访问是用户模式还是监管程序模式访问的第二位。

表U(完成记录错误代码)

在一种实施方式中,如果该完成记录3900用于作为批次的一部分提交的描述符,则索引字段3902包含生成该完成记录的描述符的批次中的索引。对于批次描述符,该字段可以是0xff。对于不是批次的部分的任何其他描述符,可以保留该字段。

在一种实施方式中,如果由于页错误而部分地完成了操作,则字节完成字段3901包含在错误发生之前处理的源字节的数量。此计数表示的所有源字节都已完全处理,并根据操作类型的需要将结果写入目的地地址。对于某些操作类型,当操作在完成之前出于错误之外的某些原因而停止时,也可以使用该字段。如果操作完全完成,则该字段可以设置为0。

对于其输出大小不易于从该值确定的操作类型,完成记录还包含写入目的地地址的字节数。

如果由于页错误而部分地完成了操作,则该字段包含导致错误的地址。作为一般规则,所有描述符应具有有效的完成记录地址3804,并且完成记录地址有效标志应为1。此规则的一些例外情况如下所述。

在一种实施方式中,完成记录的第一个字节是状态字节。设备写入的状态值均为非零。软件应在提交描述符之前将完成记录的状态字段初始化为0,以便能够辨别设备何时写入完成记录。初始化完成记录还确保它被映射,因此设备在访问完成记录时不会遇到页错误。

请求完成记录标志向设备指示即使操作成功完成也应该写入完成记录。如果未设置该标志,则设备仅在出现错误时才写入完成记录。

可以使用以下任何方法通过软件检测描述符完成:

1.轮询完成记录,等待状态字段变为非零。

2.在完成记录地址上使用UMONITOR/UMWAIT指令(如本文所述),以阻止直到它被写入或直到超时。然后,软件应检查状态字段是否为非零,以确定操作是否已完成。

3.对于内核模式描述符,在操作完成时请求中断。

4.如果描述符在批次中,则在同一批次中的后续描述符中设置护栏标志。具有护栏的描述符或同一批次中的任何后续描述符的完成指示护栏之前的所有描述符的完成。

5.如果描述符在批次中,则启动批次的批次描述符的完成指示批次中的所有描述符的完成。

6.发出排出描述符或排出命令并等待其完成。

如果完成状态指示由于页错误导致的部分完成,则完成记录指示在遇到错误之前完成了多少处理(如果有的话),以及遇到错误处的虚拟地址。软件可以选择修复错误(通过从处理器接触错误地址)并在新描述符中重新提交工作的余下部分或用软件完成余下的工作。描述符列表和完成记录地址上的错误以不同方式处理,在下面更详细地描述。

DSA的一种实施方式仅支持消息信号通知的中断。DSA提供两种类型的中断消息储存:(a)MSI-X表,通过MSI-X能力列举,存储主机驱动程序使用的中断消息;(b)设备特定的中断消息储存(IMS)表,存储访客驱动程序使用的中断消息。

在一种实施方式中,可以为三种类型的事件生成中断:(1)完成内核模式描述符;(2)完成排出或中止指令;(3)软件或硬件错误寄存器中发布的错误。对于每种类型的事件,都有一个单独的中断启用。使用MSI-X表中的条目0生成由于错误和中止/排出命令完成而导致的中断。可以通过软件读取中断原因寄存器以确定中断的原因。

对于内核模式描述符(例如,U/S字段为1的描述符)的完成,所使用的中断消息取决于描述符的提交方式和描述符中的使用中断消息储存标志。

经由特权入口提交的内核模式描述符的完成中断消息通常是MSI-X表中的条目,由入口地址确定。但是,如果GENCAP中的中断消息储存支持字段为1,则通过特权入口提交的描述符可以通过在描述符中设置使用中断消息储存标志来覆盖此行为。在这种情况下,描述符中的完成中断句柄字段用作中断消息储存的索引。

通过访客入口提交的内核模式描述符的完成中断消息是中断消息储存中的条目,由入口地址确定。

通过由内核或VMM软件配置的中断重映射和发布硬件处理由DSA生成的中断。

表V

如上所述,DSA支持一次提交多个描述符。批次描述符包含主机存储器中工作描述符数组的地址以及数组中元素的数量。工作描述符数组称为“批次”。批次描述符的使用允许DSA客户端使用单个ENQCMD、ENQCMDS或MOVDIR64B指令提交多个工作描述符,并可能提高整体吞吐量。DSA对批次中的工作描述符数量实施限制。限制在一般能力寄存器的最大批次大小字段中指示。

批次描述符以与其他工作描述符相同的方式提交到工作队列。当设备处理批次描述符时,设备从存储器中读取工作描述符数组,然后处理每个工作描述符。工作描述符不一定按顺序处理。

批次描述符的PASID 3803和U/S标志用于批次中的所有描述符。忽略批次中描述符中的PASID和U/S字段3810。批次中的每个工作描述符可以指定完成记录地址3804,就像直接提交的工作描述符一样。可替换地,批次描述符可以指定“完成队列”地址,其中来自批次的所有工作描述符的完成记录由设备写入。在这种情况下,忽略批次中描述符中的完成记录地址字段3804。完成队列应该比描述符计数多一个条目,因此对于批次中的每个描述符,完成记录有空间用于批次描述符加一。完成记录按描述符完成的顺序生成,这可能与它们在描述符数组中出现的顺序不同。每个完成记录包括生成该完成记录的批次中的描述符的索引。索引0xff用于批次描述符本身。索引0用于除批次描述符之外的直接提交的描述符。批次中的某些描述符可以不生成完成记录,如果它们没有请求完成记录并且它们成功完成。在这种情况下,写入完成队列的完成记录的数量可能小于批次中的描述符的数量。批次描述符的完成记录(如果请求)在批次中所有描述符的完成记录之后写入完成队列。

如果批次描述符未指定完成队列,则在完成批次中的所有描述符之后,将批次描述符的完成记录(如果请求)写入其自己的完成记录地址。批次描述符的完成记录包含批次中的任何描述符是否以不等于成功的状态完成的指示。在批次中的所有描述符都已成功完成通常情况下,这允许软件仅查看批次描述符的完成记录。

根据需要,批次中的一个或多个工作描述符也可以请求完成中断。批次描述符的完成记录(如果请求)在批次中所有描述符的完成记录和完成中断之后写入。批次描述符的完成中断(如果请求)在批次描述符的完成记录之后被生成,就像任何其他描述符一样。

批次描述符可以不包括在批次中。不支持嵌套或链接的描述符数组。

默认情况下,DSA在执行工作描述符时不保证任何排序。可以按照设备认为适合于最大化吞吐量的任何顺序分派和完成描述符。因此,如果需要排序,软件必须明确地排序;例如,软件可以提交描述符,等待来自描述符的完成记录或中断以确保完成,然后提交下一个描述符。

软件还可以指定由批次描述符指定的批次中的描述符的排序。每个工作描述符都有一个护栏标志。设置时,护栏保证不会开始处理该描述符,直到完成同一批次中的先前描述符。这允许具有护栏的描述符使用由同一批次中的先前描述符生成的数据。

描述符的完成在操作生成的所有写入全局可观察之后;在目的地回读之后,如果请求;在完成记录的写入全局可观察之后,如果需要;并且在生成完成中断之后,如果请求。

如果批次中的任何描述符以不等于成功的状态完成,例如如果由于页错误而部分完成,则放弃具有护栏标志等于1的后续描述符以及批次中的任何后续描述符。用于提交批次的批次描述符的完成记录表示已完成的描述符数量。部分完成并生成完成记录的任何描述符都计数为已完成。只有被放弃的描述符被认为没有完成。

护栏还确保完成记录和中断的排序。例如,具有护栏和请求完成终端设置的No-op描述符将导致在批次中的所有在前描述符完成之后生成中断(并且如果需要,它们的完成记录已被写入)。完成记录写入总是排序在由相同工作描述符产生的数据写入后面,并且完成中断(如果请求)总是排序在相同工作描述符的完成记录写入后面。

排出是一种描述符,其允许客户端等待属于其自己的PASID的所有描述符完成。它可以用作整个PASID的护栏操作。当具有该PASID的所有先前描述符都已完成时,排出操作完成。排出描述符可以由软件用于请求其所有描述符的完成的单个完成记录或中断。排出是提交到常规工作队列的常规描述符。排出描述符可以不包含在批次中。(护栏标志可以在批次中用于等待批次中的在前描述符完成。)

软件必须确保在提交排出描述符之后且在其完成之前没有向设备提交具有指定PASID的描述符。如果提交了额外描述符,则未指定排出操作是否还等待额外描述符完成。这可能导致排出操作花费很长时间。即使设备不等待额外描述符完成,一些额外描述符也可能在排出操作完成之前完成。通过这种方式,排出与护栏不同,因为护栏确保在所有先前操作完成之前不会开始后续操作。

在一种实施方式中,中止/排出命令由特权软件(OS内核或VMM)通过写入中止/排出寄存器来提交。在接收到这些命令之一时,DSA等待某些描述符的完成(如下所述)。命令完成后,软件可以确信设备中未决的指定类别中没有更多描述符。

在一种实施方式中存在三种类型的排出命令:全部排出(排出ALL),排出PASID和排出WQ。每个命令都有一个中止标志,告诉设备它可以丢弃任何未完成的描述符,而不是将它们处理完成。

全部排出命令等待在全部排出命令之前提交的所有描述符的完成。全部排出命令之后提交的描述符可能在全部排出完成时正在进行中。当全部排出命令等待先前的描述符完成时,设备可以开始处理新的描述符。

排出PASID命令等待与指定的PASID相关联的所有描述符。当排出PASID命令完成时,设备中没有更多PASID的描述符。软件可以确保在提交排出PASID命令之后和其完成之前没有向设备提交具有指定PASID的描述符;否则行为未定义。

排出WQ命令等待提交给指定工作队列的所有描述符。软件可以确保在提交排出WQ命令之后和其完成之前没有向WQ提交描述符。

当暂停使用DSA的应用程序或VM时,它可能具有提交给DSA的未完成描述符。必须完成此工作,以便客户端处于一个可以在以后恢复的一致状态。OS或VMM使用排出PASID和全部排出命令等待任何未完成的描述符。排出PASID命令用于使用单个PASID的应用程序或VM。全部排出命令用于使用多个PASID的VM。

当使用DSA的应用程序退出或由操作系统(OS)终止时,OS需要确保在它可以释放或重新使用地址空间、分配的存储器和PASID之前没有未完成的描述符。为清除任何未完成的描述符,OS使用排出PASID命令,终止客户端的PASID,并将Abort标志设置为1。收到此命令后,DSA将丢弃属于指定PASID的所有描述符,而无需进一步处理。

DSA的一种实施方式提供了一种机制,用于指定用于从多个WQ分派工作的服务质量。DSA允许软件将总WQ空间划分为多个WQ。可以为每个WQ分配用于分派工作的不同优先级。在一种实施方式中,DSA调度器/仲裁器3513从WQ分派工作,使得较高优先级的WQ比较低优先级的WQ得到更多的服务。但是,DSA确保较高优先级的WQ不会使较低优先级的WQ匮乏。如上所述,可以基于实现要求采用各种优先级排序方案。

在一种实施方式中,WQ配置寄存器表用于配置WQ。软件可以配置活动WQ的数量以匹配所需的QoS级别数量。软件通过编程WQ配置寄存器表中的WQ大小和一些附加参数来配置每个WQ。这有效地将整个WQ空间划分为所需数量的WQ。未使用的WQ的大小为0。

错误可大致分为两类;1)在处理特定PASID的描述符时发生的附属错误,以及2)本质上是全局性的而不是PASID特定的非附属错误。DSA尝试尽可能避免来自一个PASID的错误破坏或影响其他PASID。PASID特定错误在相应描述符的完成记录中被报告,除非错误在完成记录本身上(例如,完成记录地址上的页错误)。

可以通过软件错误寄存器(SWERROR)向主机驱动程序报告描述符提交中的错误或描述符的完成记录中的错误。可以通过硬件错误寄存器(HWERROR)报告硬件错误。

DSA的一种实施方式在设备启用寄存器中的启用位被设置为1时执行以下检查:

·总线主控启用为1。

·PASID、ATS和PRS能力的组合是有效的。(参见6.1.3节中的表6-3)

·所有WQCFG寄存器的WQ大小字段的总和不大于总WQ大小。

·对于每个GRPCFG寄存器,WQ和引擎字段均为0或均不为零。

·WQCFG寄存器中的大小字段为非零的每个WQ都在一组中。

·WQCFG寄存器中大小字段为零的每个WQ不在任何组中。

·每个引擎在不多于一组中。

如果这些检查中的任何一个失败,则不启用设备,并且将错误代码记录在设备启用寄存器的错误代码字段中。可以以任何顺序执行这些检查。因此,一种类型的错误的指示并不意味着不再有其他错误。相同的配置错误可能在不同时间或不同版本的设备导致不同的错误代码。如果没有任何检查失败,则启用设备并将被启用字段设置为1。

在WQCFG寄存器中的WQ启用位被设置为1时,设备执行以下检查:

·设备被启用(即,设备启用寄存器中的被启用字段为1)。

·WQ大小字段不为零。

·WQ阈值不大于WQ大小字段。

·WQ模式字段选择支持的模式。即,如果WQCAP中的共享模式支持字段为0,则WQ模式为1,或者如果WQCAP中的专用模式支持字段为0,则WQ模式为0。如果共享模式支持和专用模式支持字段均为1,则允许WQ模式的任一值。

·如果GENCAP中的错误阻断支持位为0,则WQ错误阻断启用字段为0。

如果这些检查中的任何一个失败,则不启用WQ,并且将错误代码记录在WQ配置寄存器3500的WQ错误代码字段中。可以以任何顺序执行这些检查。因此,一种类型的错误的指示并不意味着不再有其他错误。相同的配置错误可能在不同时间或不同版本的设备导致不同的错误代码。如果没有任何检查失败,则启用设备并将WQ被启用段设置为1。

在一种实施方式中,DSA在接收描述符时执行以下检查:

·由用于提交描述符的寄存器地址标识的WQ是活动WQ(WQCFG寄存器中的大小字段非零)。如果此检查失败,则错误将被记录在软件错误寄存器(SWERROR)中,

·如果描述符已被提交给共享WQ,则

·其用ENQCMD或ENQCMDS被提交。如果此检查失败,则错误将记录在SWERROR中。

·如果描述符是通过非特权或访客入口提交的,则当前队列占用率不大于WQ阈值。如果此检查失败,则返回重试响应。

·如果描述符是通过特权入口提交的,则当前队列占用率小于WQ大小。如果此检查失败,则返回重试响应。

·如果描述符已提交给专用WQ,

·其用MOVDIR64B被提交。

·队列占用率小于WQ大小。

如果这些检查中的任何一个失败,则错误记录在SWERROR中。

在一种实施方式中,设备在处理时对每个描述符执行以下检查:

·操作码字段中的值对应于支持的操作。这包括检查操作在提交操作的上下文中是否有效。例如,批次中的批次描述符将被视为无效的操作代码。

·未设置保留标志。这包括GENCAP寄存器中相应的能力位为0的标志。

·未设置不支持标志。这包括保留用于某些操作的标志。例如,护栏位保留在直接排队的描述符中,而不是作为批次的一部分保留。它还包括在配置中禁用的标志,例如错误阻断标志,当WQCFG寄存器中的错误阻断启用字段为0时保留该标志。

·设置了必需的标志。例如,请求完成记录标志在比较操作的描述符中必须为1。

·保留字段为0。这包括对指定操作没有明确含义的任何字段。某些实施方式可能不检查所有保留字段,但软件应注意清除所有未使用的字段以获得最大兼容性。在批次描述符中,描述符计数字段不大于GENCAP寄存器中的最大批次大小字段。

·传输大小、源大小、最大增量记录大小、增量记录大小和最大目的地大小(适用于描述符类型)不大于GENCAP寄存器中的最大传输大小字段。

·在具有双重转换描述符的存储器复制中,两个目的地地址的位11:0相同。

·如果设置了使用中断消息储存标志,则完成中断句柄小于中断消息储存大小。

在一种实施方式中,如果不能转换完成记录地址3804,则丢弃描述符3800并将错误记录在软件错误寄存器中。否则,如果这些检查中的任何一个失败,则使用状态字段写入完成记录,指示失败的检查类型和字节完成被设置为0。如果请求,将生成完成中断。

可以以任何顺序执行这些检查。因此,完成记录中的一种类型的错误的指示并不意味着不再有其他错误。相同的无效描述符可以在不同时间或使用不同版本的设备报告不同的错误代码。

描述符中的保留字段3811可以分为三类:始终保留的字段;在某些条件下保留的字段(例如,基于能力、配置字段、提交描述符的方式,或描述符本身中其他字段的值);和基于操作类型保留的字段。下表列出了保留字段的条件。

表W(有条件保留字段检查)

表X(操作特定的保留字段检查)

如上所述,DSA支持使用物理或虚拟地址。使用与处理器核心上运行的进程共享的虚拟地址被称为共享虚拟存储器(SVM)。为了支持SVM,设备在执行地址转换时提供PASID,并处理在地址未出现转换时发生的页错误。但是,设备本身不区分虚拟和物理地址;这种区别由IOMMU 1710的编程控制。

在一种实施方式中,DSA支持地址转换服务(ATS)和页请求服务(PRS)PCI快速能力,如图28所示,图28示出了PCIe逻辑2820使用PCDI与PCIe逻辑2808通信以利用ATS。ATS描述了地址转换期间的设备行为。当描述符进入描述符处理单元时,设备2801可以请求描述符中的地址的转换。如果设备TLB 2822中有命中,则设备使用相应的主机物理地址(HPA)。如果存在未命中或许可错误,则DSA 2801的一种实施方式向IOMMU 2810发送地址转换请求以进行转换(即,跨越多协议链路2800)。然后,IOMMU 2810可以通过遍历相应的页表来定位转换,并返回包含经转换的地址和有效许可的地址转换响应。然后,设备2801将转换存储在设备TLB 2822中,并使用相应的HPA进行操作。如果IOMMU 2810无法在页表中定位转换,则它可以返回指示没有转换可用的地址转换响应。当IOMMU 2810响应指示没有转换或指示不包括操作所需的许可的有效许可时,则认为它是页错误。

DSA设备2801可能在以下之一遇到页错误:1)完成记录地址3804;2)批次描述符中的描述符列表地址;或3)源缓冲区或目的地缓冲区地址。DSA设备2801可能阻断直到解决页错误,或者提前完成描述符并且将部分完成返回给客户端。在一种实施方式中,DSA设备2801在完成记录地址3804和描述符列表地址上存在页错误时总是阻断。

当DSA遇到页错误而阻断时,它将错误报告为对IOMMU 2810的页请求服务(PRS)请求,用于由OS页错误处理程序进行服务。IOMMU 2810可以通过中断通知OS。OS验证地址,并且在成功检查时在页表中创建映射并通过IOMMU 2810返回PRS响应。

在一种实施方式中,每个描述符3800具有错误阻断标志,其指示当源或目的地缓冲区地址上发生页错误时DSA 2801应该返回部分完成还是阻断。当错误阻断标志为1并且遇到错误时,遇到错误的描述符将被阻断,直到接收到PRS响应。具有错误的描述符后面的其他操作也可能被阻断。

当错误阻断为0并且在源或目的地缓冲区地址上遇到页错误时,设备停止操作并将部分完成状态以及错误地址和进度信息一起写入完成记录。当客户端软件接收到指示部分完成的完成记录时,它可以选择在处理器上修复错误(例如,通过接触页)并提交描述剩余工作的新工作描述符。

可替换地,软件可以在处理器上完成剩余工作。一般能力寄存器(GENCAP)中的错误阻断支持字段可以表示设备支持此特征,工作队列配置寄存器中的错误阻断启用字段允许VMM或内核驱动程序控制是否允许应用程序使用该特征。

设备页错误可能代价相对高。实际上,维护设备页错误的成本可能高于维护处理器页错误的成本。即使设备在错误时执行部分工作完成而不是错误阻断,它仍然会引起开销,因为它需要软件干预来维护页错误并重新提交工作。因此,为了获得最佳性能,期望软件最小化设备页错误,同时不引起钉选(pinning)和取消钉选的开销。

批次描述符列表和源数据缓冲区通常就在将它们提交给设备之前由软件产生。因此,由于时间局部性,这些地址不太可能引起错误。但是,如果完成描述符和目的地数据缓冲区在提交到设备之前未被软件接触,则更有可能引起错误。这些错误可以通过软件在提交之前明确地“写入接触”这些页来最小化。

在设备TLB无效请求期间,如果在描述符处理单元中正在使用被无效的地址,则设备在完成无效请求之前等待引擎以该地址完成。

一些实施方式可以利用以下附加描述符类型中的一个或多个:

无操作

图40示出了示例性无操作描述符4000和无操作完成记录4001。无操作操作4005不执行DMA操作。它可以请求完成记录和/或完成中断。如果它在批次中,它可以指定护栏标志以确保在完成批次中的所有先前描述符之后完成无操作描述符。

批次

图41示出了示例性批次描述符4100和无操作完成记录4101。批次操作4108一次对多个描述符进行排队。描述符列表地址4102是要处理的连续工作描述符数组的地址。在一种实施方式中,数组中的每个描述符是64字节。描述符列表地址4102是64字节对齐的。描述符计数4103是数组中的描述符数。数组中的描述符集合称为“批次”。批次中允许的最大描述符数在GENCAP的最大批次大小字段中给出。

批次描述符中的PASID 4104和U/S标志4105用于批次中的所有描述符。忽略批次中的描述符中的PASID 4104和U/S标志字段4105。如果设置了批次描述符4100中的完成队列启用标志,则完成记录地址有效标志必须为1,并且完成队列地址字段4106包含用于批次中的所有描述符的完成队列的地址。在这种情况下,忽略批次中描述符中的完成记录地址字段4106。如果一般能力寄存器中的完成队列支持字段为0,则保留完成队列启用标志。

如果批次描述符中的完成队列启用标志为0,则批次中的每个描述符的完成记录被写入每个描述符中的完成记录地址4106。在这种情况下,如果批次描述符中的请求完成记录标志为1,则完成队列地址字段仅用作批次描述符的完成记录地址4106。

如果批次中的所有描述符成功完成,则批次完成记录4101的状态字段4110指示成功;否则,它指示一个或多个描述符以不等于成功的状态完成。完成记录的已完成描述符字段4111包含已处理的批次中的描述符总数,无论它们是否成功。如果批次中存在护栏或者在读取批次时发生页错误,则已完成描述符4111可能小于描述符计数4103。

排出

图42示出了示例性排出描述符4200和排出完成记录4201。排出操作4208等待排出描述符4200被提交到的工作队列中与PASID 4202相关联的所有未完成描述符的完成。该描述符可以在已经在使用该设备的过程的正常关闭期间使用。为了等待与PASID 4202相关联的所有描述符,软件应该向使用PASID 4202的每个工作队列提交单独的排出操作。软件应确保在提交排出描述符4201之后且在其完成之前没有具有指定PASID 4202的描述符被提交到工作队列。

排出描述符4201可以不被包括在批次中;它被视为不受支持的操作类型。排出应指定请求完成记录或请求完成中断。完成其他描述符后,将进行完成通知。

存储器移动

图43示出了示例性存储器移动描述符4300和存储器移动完成记录4301。存储器移动操作4308将存储器从源地址4302复制到目的地地址4303。复制的字节数由传输大小4304给出。对于存储器地址或传输大小没有对齐要求。如果源和目的地区域重叠,则完成存储器复制,就像将整个源缓冲区被复制到临时空间然后复制到目的地缓冲区一样。当目的地缓冲区的开头与源缓冲区的末尾重叠时,可以通过反转复制的方向来实现。

如果由于页错误而部分地完成操作,则如果从源和目的地缓冲区的起始处开始执行复制,则完成记录的方向字段4310是0,并且如果复制的方向反转,则方向字段为1。

为了在部分完成之后恢复操作,如果方向为0,则连续描述符中的源和目的地地址字段4302-4303应该被增加已完成字节,并且传输大小应该被减小已完成字节4311。如果方向为1,则传输大小4304应被减小已完成字节4311,但源和目的地地址字段4302-4303应与原始描述符中的相同。注意,如果发生后续的部分完成,则方向字段4310可能与用于第一次部分完成的不同。

填充

图44示出了示例性填充描述符4400。存储器填充操作4408用模式字段4405中的值填充目的地地址4406处的存储器。模式大小可以是8个字节。要使用较小的模式,软件必须复制描述符中的模式。写入的字节数由传输大小4407给出。传输大小不需要是模式大小的倍数。对于目的地地址或传输大小没有对齐要求。如果由于页错误而部分完成操作,则完成记录的已完成字节字段包含在发生错误之前写入目的地的字节数。

比较

图45示出了示例性比较描述符4500和比较完成记录4501。比较操作4508将源1地址4504处的存储器与源2地址4505处的存储器进行比较。比较的字节数由传输大小4506给出。对于存储器地址或传输大小4506没有对齐要求。完成记录地址有效和请求完成记录标志必须为1,完成记录地址必须有效。比较结果被写入完成记录4501的结果字段4510:值0表示两个储存区域匹配,值1表示它们不匹配。如果结果4510为1,则完成记录的已完成字节4511字段指示第一个差异的字节偏移。如果由于页错误而部分完成操作,则结果为0。如果检测到差异,则将报告差异而不是页错误。

如果操作成功并且检查结果标志为1,则根据结果和预期结果设置完成记录的状态字段4512,如下表所示。这允许具有护栏标志的同一批次中的后续描述符基于比较结果继续或停止批次的执行。

表Y

比较立即数(Immediate)

图46示出了示例性比较立即数描述符4600。比较立即数操作4608将源地址4601处的存储器与模式字段4602中的值进行比较。模式大小为8字节。为了使用较小的模式,软件必须复制描述符中的模式。比较的字节数由传输大小4603给出。传输大小不需要是模式大小的倍数。完成记录地址有效和请求完成记录标志必须为1,完成记录地址4604必须有效。比较结果将被写入完成记录的结果字段:值0表示存储器区域与模式匹配,值1表示不匹配。如果结果为1,则完成记录的已完成字节字段指示第一个差异的位置。它可以不是确切的字节位置,但保证不会超过第一个差异。如果由于页错误而部分完成操作,则结果为0。如果已检测到差异,则将报告差异而不是页错误。在一种实施方式中,比较立即数描述符的完成记录格式以及检查结果和预期结果的行为与比较描述符的相同。

创建增量记录

图47示出了示例性创建增量记录描述符4700和创建增量记录完成记录4701。创建增量记录操作4708将源1地址4705处的存储器与源2地址4702处的存储器进行比较,并生成包含更新源1以匹配源2所需信息的增量记录。比较的字节数由传输大小4703给出。传输大小受可以存储在增量记录中的最大偏移量的限制,如下所述。对于存储器地址或传输大小没有对齐要求。完成记录地址有效和请求完成记录标志必须为1,完成记录地址4704必须有效。

增量记录的最大大小由最大增量记录大小4709给出。最大增量记录大小4709应该是增量大小(10字节)的倍数并且不得大于GENCAP中的最大传输大小。增量记录的实际大小取决于源1和源2之间检测到的差异数量;它被写入完成记录的增量记录大小字段4710。如果增量记录中所需的空间超过描述符中指定的最大增量记录大小4709,则操作将以部分增量记录完成。

比较的结果被写入完成记录4701的结果字段4711。如果两个区域完全匹配,则结果为0,增量记录大小为0,并且已完成字节为0。如果两个区域不匹配,并且完整的增量集合被写入增量记录,则结果为1,增量记录大小包含找到的所有差异的总大小,并且已完成字节为0。如果两个区域不匹配,且记录所有增量所需的空间超过最大增量记录大小,则结果为2,增量记录大小4710包含写入增量记录的增量集合的大小(通常等于或几乎等于在描述符中指定的增量记录大小),并且已完成字节4712包含超出增量记录中的空间之前比较的字节数。

如果由于页错误而部分地完成操作,则结果4711为0或1,如前一段中所述,已完成字节4712包含在页错误发生之前所比较的字节数,且增量记录大小包含页错误发生之前增量记录中使用的空间。

增量记录的格式在图48中示出。增量记录包含增量数组。每个增量包含来自源2的2字节的偏移量4801和8字节数据块4802,它与源1中相应的8字节不同。增量记录的总大小是10的倍数。由于偏移量4801是16位字段,表示8字节的倍数,因此可以表示的最大偏移量为0x7FFF8,因此最大传输大小为0x80000字节(512KB)。

如果操作成功并且检查结果标志为1,则根据结果和预期结果设置完成记录的状态字段,如下表所示。这允许具有护栏标志的同一批次中的后续描述符基于增量记录创建的结果继续或停止批次的执行。忽略预期结果的位7:2。

表Z

应用增量记录

图49示出了示例性应用增量记录描述符4901。应用增量记录操作4902将增量记录应用于目的地地址4903处的存储器内容。增量记录地址4904是由以等于1的结果完成的创建增量记录操作4902创建的增量记录的地址。增量记录大小4905是增量记录的大小,如创建增量记录操作4902的完成记录中所报告的。目的地地址4903是包含与创建增量记录时源1地址处的存储器相同内容的缓冲区的地址。传输大小4906与创建增量记录时使用的传输大小相同。应用增量记录操作4902完成后,目的地地址4903处的存储器将与创建增量记录时源2地址处的存储器中的内容相匹配。对于存储器地址或传输大小没有对齐要求。

如果在应用增量记录操作4902期间遇到页错误,则完成记录的已完成字节字段包含成功应用于目的地的增量记录的字节数。如果软件选择提交另一个描述符以恢复操作,则延续(Continuation)描述符应包含与原始相同的目的地地址4903。增量记录地址4904应增加已完成字节(因此它指向第一个未应用的增量),且增量记录大小4905应减小已完成字节。

图50示出了使用创建增量记录和应用增量记录操作的一种实施方式。首先,执行创建增量记录操作5001。它读取两个源缓冲区-源1和2-并写入增量记录5010,在其完成记录5003中记录实际增量记录大小5004。应用增量记录操作5005获取由创建增量记录操作5001所写入的增量记录的内容,及其大小和源1数据的副本,并将目的地缓冲区5015更新为原始源2缓冲区的副本。创建增量记录操作包括最大增量记录大小5002。

具有双重转换(Dual cast)的存储器复制

图51示出了具有双重转换描述符5100的示例性存储器复制和具有双重转换完成记录5102的存储器复制。具有双重转换操作的存储器复制5104将存储器从源地址5105复制到目的地1地址5106和目的地2地址5107。复制的字节数由传输大小5108给出。对于源地址或传输大小没有对齐要求。两个目的地地址5106-5107的位11:0应该相同。

如果源区域与任一目的地区域重叠,则完成存储器复制,就像将整个源缓冲区复制到临时空间然后复制到目的地缓冲区一样。当目的地缓冲区的开头与源缓冲区的末尾重叠时,可以通过反转复制的方向来实现。如果源区域与两个目的地区域重叠或者如果两个目的地区域重叠,则是错误。如果由于页错误而部分地完成操作,则在向两个目的地区域写入相同数量的字节后复制操作停止,并且如果从源和目的地缓冲区的开头处开始执行复制,则完成记录的方向字段5110为0,如果复制的方向相反,则方向字段为1。

为了在部分完成之后恢复操作,如果方向5110为0,则延续描述符中的源地址字段5105和两个目的地地址字段5106-5107应该增加已完成字节5111,并且传输大小应该减小已完成字节5111。如果方向为1,则传输大小5108应减小已完成字节5111,但源5105和目的地5106-5107地址字段应与原始描述符中的相同。注意,如果发生后续的部分完成,则方向字段5110可能与用于第一次部分完成的不同。

循环冗余校验(CRC)生成

图52示出了示例性CRC生成描述符5200和CRC生成完成记录5201。CRC生成操作5204计算源地址处的存储器上的CRC。用于CRC计算的字节数由传输大小5205给出。对于存储器地址或传输大小5205没有对齐要求。完成记录地址有效和请求完成记录标志必须为1,完成记录地址5206必须有效。将计算出的CRC值写入完成记录。

如果由于页错误而部分地完成操作,则部分CRC结果与页错误信息一起写入完成记录。如果软件纠正了错误并恢复了操作,则必须将该部分结果复制到延续描述符的CRC种子字段中。否则,CRC种子字段应为0。

具有CRC生成的复制

图53示出了具有CRC生成描述符5300的示例性复制。具有CRC生成的复制操作5305将存储器从源地址5302复制到目的地地址5303,并计算复制的数据上的CRC。复制的字节数由传输大小5304给出。对于存储器地址或传输大小没有对齐要求。如果源和目的地区域重叠,则是错误。完成记录地址有效和请求完成记录标志必须为1,完成记录地址必须有效。将计算出的CRC值写入完成记录。

如果由于页错误而部分地完成操作,则将部分CRC结果与页错误信息一起写入完成记录。如果软件纠正了错误并恢复了操作,则必须将该部分结果复制到延续描述符的CRC种子字段中。否则,CRC种子字段应为0。在一种实施方式中,具有CRC生成的复制的完成记录格式与CRC生成的格式相同。

数据完整性字段(DIF)插入

图54示出了示例性DIF插入描述符5400和DIF插入完成记录5401。DIF插入操作5405将存储器从源地址5402复制到目的地地址5403,计算源数据上的数据完整性字段(DIF)并将DIF插入到输出数据。复制的源字节数由传输大小5406给出。对例如是512、520、4096或4104字节的每个源数据块执行DIF计算。传输大小应为源块大小的倍数。写入目的地的字节数是传输大小加上用于每个源块的8个字节。对于存储器地址没有对齐要求。如果源和目的地区域重叠,则是错误。如果由于页错误而部分地完成操作,则将参考标签和应用程序标签的更新值与页错误信息一起写入完成记录。如果软件纠正了错误并恢复了操作,则可以将这些字段复制到延续描述符中。

DIF条带(Strip)

图55示出了示例性DIF条带描述符5500和DIF条带完成记录5501。DIF条带操作5505将存储器从源地址5502复制到目的地地址5503,计算源数据上的数据完整性字段(DIF)并将计算的DIF与数据中包含的DIF进行比较。读取的源字节数由传输大小5506给出。对可以是512、520、4096或4104字节的每个源数据块执行DIF计算。传输大小应为源块大小的倍数加上用于每个源块的8个字节。写入目的地的字节数是传输大小减去用于每个源块的8个字节。对于存储器地址没有对齐要求。如果源和目的地区域重叠,则是错误。如果由于页错误而部分地完成操作,则将参考标签和应用程序标签的更新值与页错误信息一起写入完成记录。如果软件纠正了错误并恢复了操作,则可以将这些字段复制到延续描述符中。

DIF更新

图56示出了示例性DIF更新描述符5600和DIF更新完成记录5601。具有DIF更新的存储器移动操作5605将存储器从源地址5602复制到目的地地址5603,计算源数据上的数据完整性字段(DIF)并将计算出的DIF与数据中包含的DIF进行比较。它同时使用描述符中的目的地DIF字段计算源数据上的DIF,并将计算出的DIF插入到输出数据中。读取的源字节数由传输大小5606给出。对可以是512、520、4096或4104字节的每个源数据块执行DIF计算。传输大小5606应该是源块大小的倍数加上用于每个源块的8个字节。写入目的地的字节数与传输大小5606相同。对于存储器地址没有对齐要求。如果源和目的地区域重叠,则是错误。如果由于页错误而部分地完成操作,则将源和目的地参考标签和应用程序标签的更新值与页错误信息一起写入完成记录。如果软件纠正了错误并恢复了操作,则可以将这些字段复制到延续描述符中。

下面的表AA示出了在一种实施方式中使用的DIF标志。表BB示出了在一种实施方式中使用的源DIF标志,表CC示出了一种实施方式中的目的地DIF标志。

表AA(DIF标志)

源DIF标志

表BB(源DIF标志)

目的地DIF标志

表CC(目的地DIF标志)

在一种实施方式中,DIF结果字段报告DIF操作的状态。该字段可以仅为DIF条带和DIF更新操作而定义,并且仅当完成记录的状态字段为成功或具有错误谓词的成功时才定义。下面的表DD示出了示例性DIF结果字段代码。

表DD(DIF结果字段代码)

当表EE中所示的以下之一为真时,检测到F检测条件:

表EE

如果操作成功并且检查结果标志为1,则根据DIF结果设置完成记录的状态字段,如下表FF所示。这允许具有护栏标志的同一批次中的后续描述符基于操作的结果继续或停止批次的执行。

表FF

缓存刷新

图57示出了示例性缓存刷新描述符5700。缓存刷新操作5705刷新目的地地址处的处理器缓存。刷新的字节数由传输大小5702给出。传输大小不需要是缓存行大小的倍数。对于目的地地址或传输大小没有对齐要求。目的地区域部分覆盖的任何缓存行被刷新。

如果目的地缓存填充标志为0,则可以从缓存层级结构的每个级别使受影响的缓存行无效。如果缓存行包含缓存层级结构的任何级别的已修改数据,则数据将写回存储器。这类似于某些处理器中实现的CLFLUSH指令的行为。

如果目的地缓存填充标志是1,则经修改的缓存行被写入主存储器,但不从缓存中逐出。这类似于某些处理器中CLWB指令的行为。

本文有时使用术语加速器来指代松散耦合的代理,其可以由在主机处理器上运行的软件使用以卸载或执行任何类型的计算或I/O任务。根据加速器的类型和使用模型,这些可以是执行到存储器或储存设备的数据移动、计算、通信或这些任务的任何组合。

“松散耦合”指的是这些加速器如何被暴露和被主机软件访问。具体而言,这些不作为处理器ISA扩展而暴露,而是作为平台上的PCI-Express可列举端点设备而暴露。松散耦合允许这些代理接受来自主机软件的工作请求,并与主处理器异步操作。

“加速器”可以是可编程代理(诸如GPU/GPGPU)、固定功能代理(诸如压缩或加密引擎)、或可重新配置的代理,诸如现场可编程门阵列(FPGA)。其中一些可以用于计算卸载,而其他的(例如RDMA或主机结构接口)可以用于分组处理、通信、储存或消息传递操作。

加速器设备可以物理地集成在不同的级别,包括管芯上(即、与处理器相同的管芯)、封装上、芯片集上、母板上;或者可以是分立的PCIe附接设备。对于集成加速器,即使列举为PCI-Express端点设备,这些加速器中的一些也可以一致地附接(到管芯上一致性结构或外部一致性接口),而其他加速器可以附接到内部非一致性接口,或外部PCI-Express接口。

在概念级别,“加速器”和高性能I/O设备控制器是类似的。它们的区别在于诸如统一/共享虚拟存储器、在可分页存储器上操作的能力、用户模式工作提交、任务调度/抢占(pre-emption)以及对低延迟同步的支持等能力。因此,加速器可被视为一种新的和改进的高性能I/O设备类别。

卸载处理模型

加速器卸载处理模型大致可分为三个使用类别:

1.

2.

3.

跨卸载模型的工作分派

上述卸载处理模型中的每一个都带来其自己的工作分派挑战,如下所述。

1.

对于流传输使用,典型的工作分派模型是使用存储器驻留工作队列。具体地,设备被配置存储器中工作队列的位置和大小。硬件实现门铃(尾指针)寄存器,该寄存器在向工作队列添加新工作元素时由软件更新。硬件报告软件的当前头指针,以强制工作队列元素上的生产者-消费者流控制。对于流传输使用,典型的模型是软件通过查询缓存在软件中的头指针(通常由硬件维护在主机存储器中以避免软件对UC MMIO读取的开销)和尾指针来检查工作队列中是否有空间,将新的工作元素添加到存储器驻留的工作队列,并使用门铃寄存器写入设备来更新尾指针。

门铃写入(doorbell write)通常是对MMIO的4字节或8字节不可缓存(UC)写入。在某些处理器上,UC写入是一种串行化操作,其确保在发布UC写入(生产者-消费者使用所需)之前全局观察旧存储,但也会阻止处理器流水线中的所有较新存储发布,直到平台发布UC写入。Xeon服务器处理器上的UC写入操作的典型延迟大约为80-100nsecs的量级,在此期间所有较新存储操作都被核心阻止,从而限制了流传输卸载性能。

虽然解决在UC门铃写入之后的较新存储的串行化的一种方法是使用用于门铃写入的写入组合(WC)存储操作(由于WC弱排序),但是使用用于门铃写入的WC存储带来了一些挑战:门铃写入大小(通常为DWORD或QWORD)小于缓存行大小。由于处理器将它们保持在其写入组合缓冲器(WCB)中以用于潜在的写入组合机会,这些部分写入会引起额外的延迟,从而导致从处理器发布门铃写入的延迟。软件可以强制它们通过显式存储护栏发布,与UC门铃一样,为较新的存储产生相同的串行化。

WC映射的MMIO的另一个问题是将未预测到的和推测的读取(利用MOVNTDQA)暴露于WC映射的MMIO(具有可能具有读取副作用的寄存器)。解决这个问题对于设备而言是麻烦的,因为它需要设备在与其他UC映射的MMIO寄存器不同的页中托管WC映射的门铃寄存器。这也给虚拟化使用带来了挑战,其中VMM软件不再能够忽略访客存储器类型,并强制使用EPT页表对暴露给访客的任何设备MMIO进行UC映射。

本文描述的MOVDIRI指令解决了使用UC或WC存储进行具有这些流传输卸载使用的门铃写入的上述限制。

2.

某些类型的加速器设备被高度优化以便以最小延迟完成所请求的操作。与流传输加速器(针对吞吐量进行了优化)不同,这些加速器通常实现设备托管的工作队列(通过设备MMIO暴露),以避免从存储器托管的工作队列中获取工作元素(在某些情况下甚至是数据缓冲区)的DMA读取延迟。相反,主机软件通过直接将工作描述符(在某些情况下还包括数据)写入通过设备MMIO暴露的设备托管工作队列来提交工作。此类设备的示例包括主机结构控制器、远程DMA(RDMA)设备和诸如非易失性存储器(NVM)-Express的新储存控制器。设备托管的工作队列使用对现有ISA几乎不带来挑战。

为了避免UC写入的串行化开销,设备托管的工作队列的MMIO地址通常被映射为WC。这暴露了与用于流传输加速器的WC映射门铃相同的挑战。

此外,使用WC存储到设备托管的工作队列需要设备来防止某些处理器的写入原子性行为。例如,某些处理器仅保证写入操作原子性(atomicity)在缓存行边界内(并且对于锁定操作)高达8字节大小的写入,并且不定义任何保证的写入完成原子性。写操作原子性是其他代理观察处理器存储操作的粒度,并且是处理器指令集架构和一致性协议的属性。写入完成原子性是接收器(在存储器的情况下为存储器控制器,在MMIO的情况下为设备)观察到不可缓存的存储操作的粒度。写入完成原子性比写入操作原子性更强,并且不仅是处理器指令集架构的功能,而且是平台的功能。在没有写入完成原子性的情况下,执行N字节的不可缓存的存储操作的处理器指令可以由设备托管的工作队列作为多个(分解的)写入事务来接收。目前,设备硬件需要通过跟踪工作描述符的每个字或写入设备托管工作队列的数据来防止这种分解写入。

本文描述的MOVDIR64B指令通过以保证的64字节写入完成原子性支持64字节写入来解决上述限制。MOVDIR64B还可用于其他用途,例如写入持久性存储器(附接到存储器控制器的NVM)和通过非透明网桥(NTB)跨系统的数据复制。

3.

用于从应用程序向I/O设备提交工作的传统方法涉及对内核I/O堆叠进行系统调用,该系统调用将请求通过内核设备驱动程序路由到I/O控制器设备。虽然这种方法是可缩放的(任意数量的应用程序可以共享设备的服务),但它会导致串行化内核I/O堆叠的延迟和开销,这通常是高性能设备和加速器的性能瓶颈。

为了支持低开销工作分派,一些高性能设备支持直接环-3访问以允许直接工作分派到设备并检查工作完成。在此模型中,设备的一些资源(门铃,工作队列,完成队列等)被分配并映射到应用程序虚拟地址空间。一旦被映射,环-3软件(例如,用户模式驱动程序或库)可以直接将工作分派给加速器。对于支持共享虚拟存储器(SVM)能力的设备,内核模式驱动程序设置门铃和工作队列,以识别门铃和工作队列所映射到的应用程序进程的进程地址空间标识符(PASID)。当处理通过特定工作队列分派的工作项目时,设备使用为该工作队列配置的相应PASID,通过I/O存储器管理单元(IOMMU)进行虚拟到物理地址转换。

直接环-3工作提交的挑战之一是可缩放性问题。可以直接向加速器设备提交工作的应用程序客户端的数量取决于加速器设备支持的队列/门铃(或设备托管的工作队列)的数量。这是因为门铃或设备托管的工作队列被静态分配/映射到应用程序客户端,并且加速器设备设计支持固定数量的这些资源。一些加速器设备试图通过过度提交他们所拥有的门铃资源(通过根据应用的需要动态分离和重新连接门铃)来“解决”这种可缩放性挑战,但是通常很麻烦且难以扩展。对于支持I/O虚拟化的设备(例如单根I/O虚拟化(SR-IOV)),有限的门铃/工作队列资源受到进一步限制,因为这些资源需要在分配给不同虚拟机的不同虚拟功能(VF)之间进行划分。

对于诸如用于无锁操作的数据库的企业应用程序使用的高性能消息传递加速器(其中一些RDMA设备支持64K到1M队列对)以及对于支持在从大量客户端提交的任务之间共享加速器资源的计算加速器,缩放问题是最关键的。

本文描述的ENQCMD/S指令解决了上述缩放限制,以使无限数量的客户端能够在加速器上订阅和共享工作队列资源。

一种实施方式包括处理器核心的新类型的存储操作,包括直接存储和排队存储。

在一种实施方式中,通过本文描述的MOVDIRI和MOVDIR64B指令生成直接存储。

支持直接存储的SoC需要确保直接存储的写入完成原子性如下:

注意,一些SoC实施方式已经保证WC写入请求的写入完成原子性。具体而言,部分行WC写入(WCiL)和全行WC写入(WCiLF)已由系统代理、存储器控制器、根复合体和I/O结构按照写入完成原子性进行处理。对于这样的实施方式,处理器不需要区分直接写入与WC写入,并且直接存储和WC存储之间的行为差异在处理器核心内部。因此,对直接写入的内部或外部结构规范没有提出任何变化。

由PCI-Express端点或RCIEP接收的直接写入的处理是设备实施方式特定的。根据设备的编程接口,器件及其驱动程序可能要求总是使用直接存储指令(如MOVDIR64B)来写入其某些寄存器(例如,门铃寄存器或设备托管的工作队列寄存器)并在设备内对它们进行原子性处理。可以由设备处理对设备上的其他寄存器的写入而没有任何原子性考虑或预期。对于RCIEP,如果具有写入原子性要求的寄存器被实现以通过边带或专用线接口进行访问,则此类实施方式必须通过实施方式特定的方式确保写入原子性属性。

一种实施方式中的排队存储由本文描述的ENQCMD和ENQCMDS指令生成。排队存储的预期目标是加速器设备上的共享工作队列(SWQ)。在一种实施方式中,排队存储具有以下属性。

对于一些实施方式,一组特定的平台集成设备支持共享工作队列(SWQ)能力。这些设备可以通过内部I/O结构附接到根复合体。这些设备可能作为PCI Express根复合体集成端点(RCIEP)或虚拟根端口(VRP)后面的PCI Express端点设备暴露给主机软件。

支持具有SWQ的集成设备的平台应该将仅在内部I/O结构上的排队非发布写入请求的路由限制到这样的设备。这是为了确保排队未知端点设备不将新事务类型(排队非发布写入)视为异常的事务层分组(TLP)。

平台终止到所有其他地址(包括主存储器地址范围和所有其他存储器映射的地址范围)的排队存储,并且将正常(非错误)响应返回到具有重试完成状态的发布处理器。在此类排队存储终端上不会生成平台错误,因为非特权软件(环-3软件或VMX非根模式下的环-0软件)可以通过执行ENQCMD/S指令生成排队非发布写入事务。

根复合体实施方式应该确保将排队存储作为内部I/O结构上的单个(非分解的)非发布写入事务来处理和转发到支持SWQ的集成设备。

该部分描述了系统代理和多个系统代理处理排队存储时的一些性能考虑因素。

针对排队存储的系统代理跟踪器(TOR)条目分配的宽松排序:

为了保持存储器一致性,系统代理实施方式通常对针对一致性存储器和MMIO的对缓存行地址的请求(当分配TOR条目时)强制实施严格排序。虽然这需要支持一致性存储器访问的总排序,但排队存储的这种严格排序会带来性能问题。这是因为排队存储以设备上的共享工作队列(SWQ)为目标,因此通常会从具有相同目的地SWQ地址的多个逻辑处理器发出排队存储请求。此外,与发布到系统代理的常规存储不同,排队存储不会发布,并且会产生类似于读取的延迟。为了避免对于共享工作队列只允许一个排队存储未完成的情况,系统代理实施方式需要放宽到同一地址的排队存储请求的严格排序,而是允许到同一地址的多个处理中排队存储的TOR分配。由于逻辑处理器一次最多只能发出一个排队存储,因此系统代理/平台可以独立处理每个排队存储而无需排序顾虑。

在I/O桥代理中支持多个未完成的排队非发布写入:

I/O桥实施方式通常将下游路径中支持的非发布(读取)请求的数量限制为少量(通常为单个请求)。这是因为从处理器到MMIO的读取(主要是UC读取)对于大多数使用来说并不是性能关键的,并且支持读取的大队列深度需要缓冲区用于返回的数据,这增加了硬件成本。由于排队存储预计将正常用于对加速器设备的工作分派,因此对排队非发布写入应用此有限队列可能对性能有害。建议I/O桥实施方式支持增大的队列深度(逻辑处理器数量的某个实际比率,因为逻辑处理器一次只能有一个未完成的排队存储请求),以改善排队非发布写入带宽。与读取请求不同,排队存储不会产生数据缓冲区的硬件成本,因为排队非发布写入完成仅返回完成状态(成功v/s重试)而不返回数据。

与具有生产者-消费者排序要求(例如由PCI-Express事务排序指定)的I/O总线上的典型存储器读取和写入请求不同,排队非发布写入对I/O总线没有任何排序要求。这使得能够使用非VC0虚拟通道来发出排队非发布写入并返回相应的完成。使用非VC0通道的好处是,排队非发布的写入完成可以通过避免被排序在VC0上从设备到主机的上游发布后面而具有更好的延迟(更少的周期来保持核心)。建议实施方式仔细考虑集成设备使用情况并最小化排队非发布完成延迟。

为了处理高延迟情况下的特定流控制(诸如唤醒内部链路或锁定流上的功率管理),允许中间代理(系统代理、I/O桥等)丢弃合法的排队存储请求,并将具有重试响应的完成返回到发布核心。发布排队存储的软件无法直接查看重试响应来自中间代理还是目标,并且通常会在软件中重试(可能有一些退避)。

执行这种中间终止的实施方式必须非常小心以确保这种行为不能在共享SWQ的软件客户端之间暴露对服务攻击的任何拒绝。

图34示出了共享工作队列(SWQ)的概念,其允许多个非协作软件代理(应用程序3410-3412)利用本文描述的ENQCMD/S指令通过共享工作队列3401提交工作。

以下考虑因素适用于实现共享工作队列(SWQ)的端点设备。

在一种实施方式中,MOVDIRI指令使用直接存储操作将源操作数(第二操作数)中的双字整数移动到目的地操作数(第一操作数)。源操作数可以是通用寄存器。目的地操作数可以是32位存储器位置。在64位模式下,指令的默认操作大小为32位。MOVDIRI将目的地定义为双字或四字对齐。

可以通过使用写入组合(WC)存储器类型协议写入数据来实现直接存储。使用该协议,处理器不会将数据写入缓存层级结构,也不会将相应的缓存行从存储器中提取到缓存层级结构中。如果缓存目的地地址,则在直接存储之前将该行从缓存中写回(如果已修改)并无效。与具有非时间提示(non-temporal hint)的存储(其允许目的地的未缓存(UC)和写保护(WP)存储器类型覆盖非时间提示)不同,直接存储始终遵循WC存储器类型协议,而不管目的地地址存储器类型如何(包括UC和WP类型)。

与具有非时间提示的WC存储和存储不同,直接存储有资格从写入组合缓冲区立即逐出,因此不与较新的存储(包括直接存储)组合到相同的地址。保持在写入组合缓冲区中的较旧的WC和非临时存储可以与较新的直接存储组合到相同的地址。

因为直接存储所使用的WC协议遵循弱排序的存储器一致性模型,所以防护操作应遵循MOVDIRI指令以在需要时强制执行排序。

由MOVDIRI发布到目的地的直接存储与4字节边界对齐,并保证4字节写入完成原子性。这意味着数据在单个非分解的4字节(或8字节)写入事务中到达目的地。如果目的地没有与写入大小对齐,MOVDIRI发布的直接存储被分割并以两部分到达目的地。这种分割直接存储的每个部分都不会与较新的存储合并,但可以按任何顺序到达目的地。

图59示出了用以处理MOVDIRI指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在5901处,提取指令。例如,提取MOVDIRI。MOVDIRI指令包括操作码(并且在一些实施例中为前缀),表示目的地操作数的目的地字段,以及表示源寄存器操作数的源字段。

在5903处解码所提取的指令。例如,由诸如本文详述的解码电路解码MOVDIRI指令。

在5905处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在5907处,经解码的指令由例如本文详述的执行电路(硬件)执行,以将双字大小的数据从源寄存器操作数移动到目的地寄存器操作数而不缓存数据。

在一些实施例中,在5909处提交或退出指令。

将64字节作为具有64字节写入原子性的直接存储从源存储器地址移动到目的地存储器地址。源操作数是常规存储器操作数。目的地操作数是通用寄存器中指定的存储器位置。寄存器内容被解释为ES分段中的偏移,没有任何分段覆盖。在64位模式下,寄存器操作数宽度为64位(或32位)。在64位模式之外,寄存器宽度为32位或16位。MOVDIR64B要求目的地地址为64字节对齐。不对源操作数强制执行对齐限制。

MOVDIR64B从源存储器地址读取64字节,并对目的地地址执行64字节直接存储操作。加载操作遵循基于源地址存储器类型的常规读取排序。直接存储是通过使用写入组合(WC)存储器类型协议写入数据来实现的。使用该协议,处理器可能不会将数据写入缓存层级结构,并且可能无法将相应的缓存行从存储器提取到缓存层级结构中。如果目的地地址被缓存,则在直接存储之前将该行从缓存中写回(如果已修改)并无效。

与具有非时间提示的存储(其允许目的地的UC/WP存储器类型覆盖非时间提示)不同,直接存储可以遵循WC存储器类型协议而不管目的地地址存储器类型如何(包括UC/WP类型)。

与WC存储和具有非时间提示的存储不同,直接存储有资格从写入组合缓冲区中立即逐出,因此不与较新的存储(包括直接存储)组合到相同的地址。保持在写入组合缓冲区中的较旧的WC和非临时存储可以与较新的直接存储组合到相同的地址。

因为直接存储所使用的WC协议遵循弱排序的存储器一致性模型,所以防护操作应遵循MOVDIR64B指令以在需要时强制执行排序。

对于来自源地址的64字节加载操作没有提供原子性保证,并且处理器实施方式可以使用多个加载操作来读取64字节。MOVDIR64B发出的64字节直接存储保证了64字节的写入完成原子性。这意味着数据在单个非分解的64字节写入事务中到达目的地。

图60示出了用以处理MOVDIRI64B指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6001处,提取指令。例如,提取MOVDIRI64B。MOVDIRI64B指令包括操作码(并且在一些实施例中为前缀),表示目的地操作数的目的地字段,以及表示源寄存器操作数的源字段。

在6003处解码所提取的指令。例如,由诸如本文详述的解码电路解码MOVDIRI64B指令。

在6005处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6007处,经解码的指令由例如本文详述的执行电路(硬件)执行,以将64字节数据从源寄存器操作数移动到目的地寄存器操作数而不缓存数据。

在一些实施例中,在6009处提交或退出指令。

在一种实施方式中,ENQCMD命令使用具有从源存储器地址(第二操作数)到目的地操作数中的设备共享工作队列(SWQ)存储器地址的64字节写入原子性的非发布写入来排队64字节命令。源操作数是常规存储器操作数。目的地操作数是通用寄存器中指定的存储器地址。寄存器内容被解释为ES分段中的偏移,没有任何分段覆盖。在64位模式下,寄存器操作数宽度为64位或32位。在64位模式之外,寄存器宽度为32位或16位。ENQCMD要求目的地地址为64字节对齐。不对源操作数强制执行对齐限制。

在一种实施方式中,ENQCMD从源存储器地址读取64字节命令,格式化64字节排队存储数据,并执行存储数据到目的地地址的64字节排队存储操作。加载操作遵循基于源地址存储器类型的常规读取排序。如果从源存储器地址读取的64字节命令数据的低4字节具有非零值,或者如果PASID有效字段位为0,则可能引发一般保护错误。否则,按如下方式格式化64字节排队存储数据:

排队存储数据[511:32]=命令数据[511:32]

排队存储数据[31]=0

排队存储数据[30:20]=0

排队存储数据[19:0]=PASID MSR[19:0]

在一种实施方式中,由ENQCMD生成的64字节排队存储数据具有图58中所示的格式。命令描述符中的高60字节指定目标设备特定命令5801。可以将PRIV字段5802(位31)可以强制为0以传达由ENQCMD指令生成的排队存储的用户特权。PASID字段(位19:0)5804传送由系统软件为执行ENQCMD1的软件线程分配的进程地址空间标识(如在PASID MSR中编程的)。

排队存储操作使用非发布写入协议来写入64字节的数据。非发布写入协议可以不将数据写入缓存层级结构,并且可以不将相应的缓存行提取到缓存层级结构中。排队存储始终遵循非发布写入协议而不管目的地地址存储器类型如何(包括UC/WP类型)。

非发布写入协议可以返回完成响应以指示非发布写入的成功或重试状态。ENQCMD指令可以在零标志中返回该完成状态(0表示成功,1表示重试)。成功状态表示目标共享工作队列接受非发布写入数据(64字节)(但不一定作用于其上)。重试状态表示由于容量或其他时间原因(或由于目的地地址不是有效的共享工作队列地址),目的地地址未接受非发布写入。

在一种实施方式中,至多一个排队存储可以是来自给定逻辑处理器的未完成的。从这个意义上说,排队存储不能使另一个排队存储通过。排队存储不针对到不同地址的旧WB存储,WC和非临时存储,CLFLUSHOPT或CLWB进行排序。需要强制执行此类排序的软件必须在此类存储之后和排队存储之前使用显式存储防护。ENQCMD仅影响共享工作队列(SWQ)地址,这些地址不受其他存储的影响。

对于来自源地址的64字节加载操作没有提供原子性保证,并且处理器实施方式可以使用多个加载操作来读取64字节。ENQCMD发出的64字节排队存储保证了64字节的写入完成原子性。数据可以作为单个非分解的64字节非发布写入事务而到达目的地。

在一些实施例中,ENQCMD指令使用PASID架构MSR。

图61示出了用以处理ENCQMD指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6101处,提取指令。例如,提取ENCQMD。ENCQMD指令包括操作码(并且在一些实施例中为前缀),表示目的地存储器地址操作数的目的地字段,以及表示源存储器操作数的源字段。

在6103处解码所提取的指令。例如,由诸如本文详述的解码电路解码ENCQMD指令。

在6105处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6107处,经解码的指令由例如本文详述的执行电路(硬件)执行,以将命令(取回的数据)写入目的地存储器地址。在一些实施例中,目的地存储器地址是共享工作队列地址。

在一些实施例中,在6109处提交或退出指令。

在一种实施方式中,ENQCMDS指令使用具有从源存储器地址(第二操作数)到目的地操作数中的设备共享工作队列(SWQ)存储器地址的64字节写入原子性的非发布写入来排队64字节命令。源操作数是常规存储器操作数。目的地操作数是通用寄存器中指定的存储器地址。寄存器内容被解释为ES分段中的偏移,没有任何分段覆盖。在64位模式下,寄存器操作数宽度为64位或32位。在64位模式之外,寄存器宽度为32位或16位。ENQCMD要求目的地地址为64字节对齐。不对源操作数强制执行对齐限制。

与ENQCMD(可以从任何特权级别执行)不同,ENQCMDS是特权指令。当处理器在保护模式下运行时,CPL必须为0才能执行该指令。ENQCMDS从源存储器地址读取64字节命令,并使用该数据执行到目的地地址的64字节的排队存储操作。加载操作遵循基于源地址存储器类型的常规读取排序。按如下方式格式化64字节的排队存储数据。

排队存储数据[511:32]=命令数据[511:32]

排队存储数据[31]=命令数据[31]

排队存储数据[30:20]=0

排队存储数据[19:0]=命令数据[19:0]

由ENQCMDS生成的64字节排队存储数据可以具有与ENQCMD相同的格式。在一种实施方式中,ENQCMDS具有图62中所示的格式。

命令描述符中的高60字节指定目标设备特定命令6201。PRIV字段(位31)6202由源操作数地址处的命令数据中的位31指定以传达对ENQCMDS指令生成的排队存储的用户(0)或监管程序(1)特权。PASID字段(位19:0)6204传达在源操作数地址1的命令数据中传送位19:0中指定的进程地址空间标识。

在一种实施方式中,排队存储操作使用非发布写入协议来写入64字节的数据。非发布写入协议不将数据写入缓存层级结构,也不会将相应的缓存行提取到缓存层级结构中。排队存储始终遵循非发布写入协议而不管目的地地址存储器类型(包括UC/WP类型)如何。

非发布写入协议可以返回完成响应以指示非发布写入的成功或重试状态。ENQCMD指令可以在零标志中返回该完成状态(0表示成功,1表示重试)。成功状态表示目标共享工作队列接受非发布写入数据(64字节)(但不一定作用于其上)。重试状态表示由于容量或其他时间原因(或由于目的地地址不是有效的共享工作队列地址),目的地地址未接受非发布写入。

至多一个排队存储(ENQCMD或ENQCMDS)可以是来自给定逻辑处理器的未完成的。从这个意义上说,排队存储不能使另一个排队存储通过。排队存储可以不针对到不同地址的旧WB存储,WC和非临时存储,CLFLUSHOPT或CLWB进行排序。需要强制执行此类排序的软件必须在此类存储之后和排队存储之前使用显式存储防护。

ENQCMDS仅影响共享工作队列(SWQ)地址,这些地址不受其他存储的影响。

对于来自源地址的64字节加载操作没有提供原子性保证,并且处理器实施方式可以使用多个加载操作来读取64字节。ENQCMDS发出的64字节排队存储保证了64字节的写入完成原子性(即,作为单个非分解的64字节非发布写入事务到达目的地)。

图63示出了用以处理ENCQMDs指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6301处,提取指令。例如,提取ENCQMDs。ENCQMDs指令包括操作码(在一些实施例中为前缀),表示目的地存储器地址操作数的目的地字段,以及表示源存储器操作数的源字段。

在6303处解码所提取的指令。例如,由诸如本文详述的解码电路解码ENCQMDs指令。

在6305处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6307处,在特权模式下,由例如本文详述的执行电路(硬件)执行经解码的指令,以将命令(取回的数据)写入目的地存储器地址。在一些实施例中,目的地存储器地址是共享工作队列地址。

在一些实施例中,在6309处提交或退出指令。

一种实施方式利用两个指令来确保加速器和主机处理器之间的有效同步:UMONITOR和UMWAIT。简而言之,UMONITOR指令使用源寄存器中指定的地址来配备(arm)地址监控硬件,UMWAIT指令指示处理器在监控地址范围的同时进入实施方式相关的优化状态。

UMONITOR指令使用r32/r64源寄存器中指定的地址来配备地址监控硬件(监控硬件针对存储操作而检查的地址范围可以通过使用CPUID监控叶子函数来确定)。到指定的地址范围内的地址的存储触发监控硬件。监控硬件的状态被UMWAIT使用。

以下操作数编码用于UMONITOR指令的一种实施方式:

r32/r64源寄存器的内容是有效地址(在64位模式中,使用r64)。默认情况下,DS分段用于创建受监控的线性地址。可以使用分段覆盖。地址范围必须使用回写类型的存储器。只有回写存储器才能保证正确触发监控硬件。

UMONITOR指令被排序为关于其他存储器事务的加载操作。该指令受到权限检查和与字节加载相关的错误的影响。与加载类似,UMONITOR在页表中设置A位但不设置D位。

UMONITOR和UMWAIT可以以任何特权级别执行。在非64位模式和64位模式下,指令的操作是相同的。

UMONITOR不与传统MWAIT指令互操作。如果在执行MWAIT之前并且在传统MONITOR指令的最近执行之后执行UMONITOR,则MWAIT可能不进入优化状态。执行将在MWAIT之后的指令处恢复。

当在事务区域内使用时,UMONITOR指令导致事务中止。

UMONITOR使用源寄存器的内容作为有效地址来设置监控器硬件的地址范围,并将监控器硬件置于待命(armed)状态。到指定地址范围的存储将触发监控器硬件。

图64示出了用以处理UMONITOR指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6401处,提取指令。例如,提取UMONITOR。UMONITOR指令包括操作码(在一些实施例中为前缀)和显式源寄存器操作数。

在6403处解码所提取的指令。例如,由诸如本文详述的解码电路解码UMONITOR指令。

在6405处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6407处,经解码的指令由例如本文详述的执行电路(硬件)执行,以配备监控硬件用于到由取回的源寄存器数据定义的地址的存储。

在一些实施例中,在6409处提交或退出指令。

UMWAIT指示处理器在监控地址范围的同时进入实施方式相关的优化状态。优化状态可以是轻量功率/性能优化状态或改进的功率/性能优化状态。两种状态之间的选择由显式输入寄存器位[0]源操作数控制。

UMWAIT可以以任何特权级别执行。该指令的操作在非64位模式和64位模式下是相同的。

输入寄存器可以包含诸如处理器应该进入的优选优化状态的信息,如下表所述。除位0以外的位被保留,如果非零,将导致#GP。

表MM

当时间戳计数器达到或超过隐式64位输入值时(如果监控硬件未提前触发),指令唤醒。

在执行UMWAIT指令之前,操作系统可以指定其允许处理器暂停其操作的最大延迟,其中该操作可以包括两个功率/性能优化状态中的任一个。它可以通过将TSC-quanta值写入以下32位MSR来实现:

UMWAIT_CONTROL[31:2]-确定TSC-quanta中处理器可以驻留在C0.1或C0.2中的最大时间。零值表示OS对处理器没有限制。最大时间值是32位值,其中高30位来自该字段,低两位假定为零。

UMWAIT_CONTROL[1]-保留。

UMWAIT_CONTROL[0]-OS不允许C0.2。值1表示所有C0.2请求都恢复为C0.1

在一种实施方式中,如果执行UMWAIT指令的处理器由于操作系统时限的期满而唤醒,则指令设置进位标志;否则,该标志被清除。

当在事务区域内使用时,UMWAIT指令导致事务中止。

在一种实施方式中,UMWAIT指令与UMONITOR指令一起操作。这两条指令允许定义等待(UMONITOR)的地址和实施方式相关的优化操作,以便在等待地址(UMWAIT)处开始。UMWAIT的执行是对处理器的提示,它可以在等待到由UMONITOR配备的地址范围的事件或存储操作时进入实施方式相关的优化状态。

以下可以使处理器退出实施方式相关的优化状态:到由UMONITOR指令配备的地址范围的存储,不可屏蔽中断(NMI)或系统管理中断(SMI),调试异常,机器检查异常,BINIT#信号,INIT#信号和RESET#信号。其他实施方式相关的事件也可能导致处理器退出实施方式相关的优化状态。

另外,外部中断可使处理器退出实施方式相关的优化状态,而不管是否禁止可屏蔽中断。

在从实施方式相关的优化状态退出之后,控制传递到UMWAIT指令之后的指令。可以在执行该指令之前传递未被屏蔽的待处理中断(包括NMI或SMI)。

与HLT指令不同,UMWAIT指令不支持在处理SMI之后在UMWAIT指令处重启。如果前面的UMONITOR指令未成功配备地址范围,或者如果在执行UMWAIT之前并且在最近执行传统MONITOR指令之后(UMWAIT不与MONITOR互操作)未执行UMONITOR,则处理器将不进入优化状态。执行将在UMWAIT之后的指令处恢复。

注意,UMWAIT用于进入编号低于C1的C0子状态,因此如果存储是由其他处理器代理发起的,或者存储是由非处理器代理发起的,则到由UMONITOR指令配备的地址范围的存储将导致处理器退出UMWAIT。

图65示出了用以处理UMWAIT指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6501处,提取指令。例如,提取UMWAIT。UMWAIT指令包括操作码(在一些实施例中为前缀)和显式源寄存器操作数。

在6503处,解码所提取的指令。例如,由诸如本文详述的解码电路解码UMWAIT指令。

在6505处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6507处,经解码的指令由例如本文详述的执行电路(硬件)执行,以使处理器(或核心)在监控地址范围时进入由显式源寄存器操作数的数据定义的实施方式相关的状态。

在一些实施例中,在6509处提交或退出指令。

TPAUSE指示处理器进入实施方式相关的优化状态。有两种这样的优化状态可供选择:轻量功率/性能优化状态和改进的功率/性能优化状态。

两者之间的选择由显式输入寄存器位[0]源操作数控制。

表OO

TPAUSE可以以任何特权级别执行。该指令的操作在非64位模式和64位模式下是相同的。

与PAUSE不同,TPAUSE指令在事务区域内使用时不会导致中止。输入寄存器包含信息,例如处理器应进入的优选优化状态,如下表所述。

除位0以外的位被保留,且如果非零,将导致#GP。

表PP

当时间戳计数器达到或超过隐式64位输入值时(如果监控硬件未提前触发),指令唤醒。在执行TPAUSE指令之前,操作系统可以指定其允许处理器在两个功率/性能优化状态中的任一个中暂停其操作的最大延迟。它可以通过将TSC-quanta值写入以下32位MSR来实现:

UMWAIT_CONTROL[31:2]-确定TSC-quanta中处理器可以驻留在C0.1或C0.2中的最大时间。零值表示OS对处理器没有限制。最大时间值是32位值,其中高30位来自该字段,低两位假定为零。

UMWAIT_CONTROL[1]-保留。

UMWAIT_CONTROL[0]-OS不允许C0.2。值1表示所有C0.2请求都恢复为C0.1

可以通过设置进位标志来指示由于OS时限的期满而导致的唤醒原因。

如果执行TPAUSE指令的处理器由于操作系统时限的期满而唤醒,则指令设置进位标志;否则,该标志被清除。

为了监控多个地址范围,可以将TPAUSE指令放置在事务区域内,该事务区域包括要监控的地址集合和随后的TPAUSE指令。事务区域允许定义等待的地址集合和实施方式相关的优化操作,以在执行TPAUSE指令时开始。在一种实施方式中,TPAUSE的执行指示处理器在等待到由读取设置定义的范围内的地址的事件或存储操作时进入实施方式相关的优化状态。

在事务存储器区域内使用TPAUSE可以限于C0.1(轻量功率/性能优化状态)。即使软件设置位[0]=0以指示其对C0.2的偏好(改进的功率/性能优化状态),处理器也可以进入C0.1。

以下可以使处理器退出实施方式相关的优化状态:到事务区域内的读取设置范围的存储,NMI或SMI,调试异常,机器检查异常,BINIT#信号,INIT#信号和RESET#信号。所有这些事件也将中止事务。

其他实施方式相关的事件可以使处理器退出实施方式相关的优化状态,并且可以导致未中止的事务区域,前进到TPAUSE之后的指令。另外,在一些实施例中外部中断使得处理器退出实施方式相关的优化状态,而不管是否禁止可屏蔽中断。应当注意,在禁止可屏蔽中断的情况下,执行将前进到TPAUSE之后的指令,而在设置中断启用标志的情况下,将中止事务区域。

图66示出了用以处理TPAUSE指令的由处理器执行的方法的实施例。例如,使用本文详述的硬件。

在6601处,提取指令。例如,提取TPAUSE。TPAUSE指令包括操作码(并且在一些实施例中为前缀)和显式源寄存器操作数。

在6603处,解码所提取的指令。例如,由诸如本文详述的解码电路解码TPAUSE指令。

在6605处,取回与经解码的指令的源操作数相关联的数据值。另外,在一些实施例中,调度指令。

在6607处,经解码的指令由例如本文详述的执行电路(硬件)执行,以使处理器(或核心)进入由显式源寄存器操作数的数据定义的实施方式特定状态。

在一些实施例中,在6609处提交或退出指令。

图67示出了使用UMWAIT和UMONITOR指令的执行的示例。

在6701处,执行UMWAIT指令以设置要监控的地址范围。

在6703处,执行UMONITOR指令以针对被监控的地址范围,使执行指令的核心进入由指令的显式源寄存器操作数的数据定义的实施方式相关的状态。

在6705处,在出现以下情况之一时退出实施方式相关的状态:到监控的地址的存储,NMI,SMI,调试异常,机器检查异常,初始化信号或重置信号。

图68示出了使用TPAUSE和UMONITOR指令的执行的示例。

在6801处,执行TPAUSE指令以设置要监控的地址范围。

在6803处,执行UMONITOR指令以针对被监控的地址范围,使执行指令的核心进入由指令的显式源寄存器操作数的数据定义的实施方式相关的状态。

在6805处,在出现以下情况之一时退出实施方式相关的状态:到监控的地址的存储,NMI,SMI,调试异常,机器检查异常,初始化信号或重置信号。

在6807处,在退出实施方式相关的状态时,中止与线程相关联的事务。

在一些实施方式中,加速器耦合到处理器核心或其他处理元件以加速某些类型的操作,诸如图形操作、机器学习操作、模式分析操作、以及(如下面详细描述的)稀疏矩阵乘法运算等等。加速器可以通过总线或其他互连(例如,点对点互连)通信地耦合到处理器/核心,或者可以与处理器集成在同一芯片上并且通过内部处理器总线/互连通信地耦合到核心。无论加速器的连接方式如何,处理器核心都可以将某些处理任务分配给包括用于有效地处理这些任务的专用电路/逻辑的加速器(例如,以指令序列或微指令的形式)。

图69示出了示例性实施方式,其中加速器6900通过缓存一致性接口6930通信地耦合到多个核心6910-6911。核心6910-6911中的每一个包括用于存储虚拟到物理地址转换的转换后备缓冲器6912-6913和用于缓存数据和指令的一个或多个缓存6914-6915(例如,L1缓存、L2缓存等)。存储器管理单元6920管理核心6910-6911对系统存储器6950的访问,系统存储器6950可以是动态随机存取存储器DRAM。诸如L3缓存的共享缓存6926可以在处理器核心6910-6911之间以及经由缓存一致性接口6930与加速器6900共享。在一种实施方式中,核心6910-1011、MMU 6920和缓存一致性接口6930被集成在单处理器芯片上。

所示加速器6900包括数据管理单元6905,其具有缓存6907和调度器6906,用于将操作调度到多个处理元件6901-6902,N。在所示实施方式中,每个处理元件具有其自己的本地存储器6903-6904,N。如下面详细描述的,每个本地存储器6903-6904,N可以实现为堆叠DRAM。

在一种实施方式中,缓存一致性接口6930提供核心6910-6911与加速器6900之间的缓存一致性连接,实际上将加速器视为核心6910-6911的对等体。例如,缓存一致性接口6930可以实现缓存一致性协议,以确保由加速器6900访问/修改并存储在加速器缓存6907和/或本地存储器6903-6904,N中的数据与存储在核心缓存6910-6911、共享缓存6926和系统存储器6950中的数据一致。例如,缓存一致性接口6930可以参与核心6910-6911和MMU6920用于检测共享缓存6926和本地缓存6914-6915内的缓存行的状态的探听机制,并且可以充当代理,响应于处理元件6901-6902,N对缓存行的访问和尝试修改而提供探听更新。此外,当通过处理元件6901-6902,N修改缓存行时,如果缓存行存储在共享缓存6926或本地缓存6914-6915中,则缓存一致性接口6930可以更新缓存行的状态。

在一种实施方式中,数据管理单元1005包括存储器管理电路,其向加速器6900提供对系统存储器6950和共享缓存6926的访问。此外,数据管理单元6905可以向缓存一致性接口6930提供更新并根据需要从缓存一致性接口6930接收更新(例如,以确定对缓存行的状态改变)。在所示实施方式中,数据管理单元6905包括调度器6906,用于调度要由处理元件6901-6902执行的指令/操作。为了执行其调度操作,调度器6906可以评估指令/操作之间的依赖性以确保以一致性顺序执行指令/操作(例如,以确保第一指令在依赖于来自第一指令的结果的第二指令之前执行)。可以在处理元件6901-6902上并行执行非相互依赖的指令/操作。

图70示出了加速器6900以及先前描述的其他部件的另一视图,包括数据管理单元6905、多个处理元件6901-N和快速片上储存器7000(例如,在一种实施方式中使用堆叠的本地DRAM实现)。在一种实施方式中,加速器6900是硬件加速器架构,并且处理元件6901-N包括用于执行矩阵*向量和向量*向量运算的电路,包括稀疏/密集矩阵的运算。特别地,处理元件6901-N可以包括用于面向列和行的矩阵处理的硬件支持,并且可以包括对于“缩放和更新”操作的微架构支持,例如在机器学习(ML)算法中使用的操作。

所描述的实施方式执行矩阵/向量运算,这些运算通过以下方式而被优化:将频繁使用的、随机访问的、可能稀疏的(例如,收集/分散)向量数据保持在快速片上储存器7000中并且将大的、不频繁使用的矩阵数据保留在片外存储器(例如,系统存储器6950)中,尽可能以流传输方式访问,并且暴露矩阵块内/矩阵块间并行性以按比例放大。

处理元件6901-N的实施方式处理稀疏矩阵、密集矩阵、稀疏向量和密集向量的不同组合。如本文所用,“稀疏”矩阵或向量是其中大多数元素为零的矩阵或向量。相反,“密集”矩阵或向量是其中大多数元素非零的矩阵或向量。可以基于零值元素的数量除以元素的总数(例如,m×n矩阵的元素总数为m×n)来定义矩阵/向量的“稀疏度”。在一种实施方式中,如果矩阵/向量的稀疏度高于指定阈值,则该矩阵/向量被认为是“稀疏的”。

由处理元件6901-N执行的一组示例性操作在图71的表格中示出。具体地,操作类型包括使用稀疏矩阵的第一乘法7100,使用密集矩阵的第二乘法7101,缩放和更新操作7102以及点积运算7103。为第一输入操作数7110和第二输入操作数7111(每个输入操作数可包括稀疏或密集矩阵/向量);输出格式7112(例如,密集向量或标量);矩阵数据格式(例如,压缩稀疏行,压缩稀疏列,面向行的等)7113;和操作标识符7114提供列。

在一些当前工作负载中发现的运行时占主导的计算模式包括矩阵乘法相对于面向行和面向列的方式的向量的变化。它们以众所周知的矩阵格式工作:压缩稀疏行(CSR)和压缩稀疏列(CSC)。图72a示出了稀疏矩阵A与向量x之间用以产生向量y的乘法的示例。图72b示出了矩阵A的CSR表示,其中每个值被存储为(值,行索引)对。例如,行0的(3,2)表示值3存储在行0的元素位置2中。图72c示出了使用(值,列索引)对的矩阵A的CSC表示。

图73a、73b和73c示出了每个计算模式的伪代码,其在下面详细描述。特别地,图73a示出了面向行的稀疏矩阵密集向量乘法(spMdV_csr);图73b示出了面向列的稀疏矩阵稀疏向量乘法(spMspC_csc);图73c示出了缩放和更新操作(scale_update)。

A.面向行的稀疏矩阵密集向量乘法(spMdV_csr)

这是众所周知的计算模式,其在诸如高性能计算的许多应用领域中是重要的。此处,对于矩阵A的每一行,执行该行与向量x的点积,并将结果存储在行索引指向的y向量元素中。该计算用于在样本集合(即矩阵的行)上进行分析的机器学习(ML)算法中。它可以用于诸如“小批次”之类的技术中。还存在ML算法仅执行稀疏向量对密集向量的点积(即,spMdV_csr循环的迭代)的情况,例如在学习算法的随机变体中。

可能影响该计算的性能的已知因素是需要在点积计算中随机访问稀疏x向量元素。对于传统的服务器系统,当x向量很大时,这将导致对存储器或最后一级缓存的不规律访问(收集)。

为了解决这个问题,处理元件的一种实施方式将矩阵A划分为列块,并且将x向量划分为多个子集(每个子集对应于A矩阵列块)。可以选择块大小,使得x向量子集可以适合芯片。因此,对它的随机访问可以局限在芯片上。

B.面向列的稀疏矩阵稀疏向量乘法(spMspV_csc)

将稀疏矩阵与稀疏向量相乘的该模式不像spMdV_csr那样众所周知。但是,它在一些ML算法中很重要。当算法处理一组特征时使用该模式,这些特征在数据集中被表示为矩阵列(因此,需要面向列的矩阵访问)。

在该计算模式中,矩阵A的每列被读取并与向量x的对应非零元素相乘。结果用于更新保持在y向量处的部分点积。在处理了与非零x向量元素相关联的所有列之后,y向量将包含最终的点积。

虽然对矩阵A的访问是有规律的(即,A的列中的流),但是对y向量访问以更新部分点积是不规律的。要访问的y元素取决于正在处理的A向量元素的行索引。为了解决这个问题,可以将矩阵A划分为行块。因此,可以将向量y划分为对应于这些块的子集。这样,当处理矩阵行块时,它只需要不规则地访问(收集/分散)其y向量子集。通过适当地选择块大小,y向量子集可以保持在片上。

C.缩放和更新(scale_update)

该模式通常由ML算法使用以将缩放因子应用于矩阵中的每个样本并将它们缩减为权重集,每个权重对应于特征(即,A中的列)。此处,x向量包含缩放因子。对于矩阵A的每一行(以CSR格式),从x向量读取该行的缩放因子,然后将其应用于该行中的A的每个元素。结果用于更新y向量的元素。处理完所有行后,y向量包含经缩减的权重。

类似于先前的计算模式,当y很大时,对y向量的不规律访问可能影响性能。将矩阵A划分为列块并且将y向量划分为与这些块对应的多个子集可以帮助将不规律访问局限在每个y子集内。

一种实施方式包括可以有效地执行上面讨论的计算模式的硬件加速器。加速器是可以与通用处理器集成的硬件IP模块。在一种实施方式中,加速器6900通过与处理器共享的互连独立地访问存储器6950以执行计算模式。它支持驻留在片外存储器中的任何任意大的矩阵数据集。

图74示出了数据管理单元6905和处理元件6901-6902的一种实施方式的处理流程。在该实施方式中,数据管理单元6905包括处理元件调度器7401、读缓冲器7402、写缓冲器7403和缩减单元7404。每个PE 6901-6902包括输入缓冲器7405-7406、乘法器7407-7408、加法器7409-7410、本地RAM 7421-7422、总和寄存器7411-7412,以及输出缓冲器7413-7414。

加速器支持上面讨论的矩阵分块方案(即,行和列分块)以支持任何任意大的矩阵数据。加速器被设计为处理矩阵数据块。每个块被进一步划分为子块,这些子块由Pe 6901-6902并行处理。

在操作中,数据管理单元6905将矩阵行或列从存储器子系统读取到其读缓冲器7402中,然后由PE调度器7401跨PE 6901-6902动态地分发以进行处理。它还将结果从其写缓冲器7403写入存储器。

每个PE 6901-6902负责处理矩阵子块。PE包含片上RAM 7421-7422以存储需要随机访问的向量(即,x或y向量的子集,如上所述)。它还包含浮点乘法累加(FMA)单元,包括乘法器7407-7408和加法器7409-7410以及输入缓冲器7405-7406内的解包逻辑,用于从输入数据中提取矩阵元素,以及总和寄存器7411-7412,用于保持累积的FMA结果。

加速器的一种实施方式实现了极高的效率,因为(1)它将不规律访问的(收集/分散)数据放置在片上PE RAM 7421-7422中,(2)它利用硬件PE调度器7401来确保很好地使用PE,(3)与通用处理器不同,加速器仅由稀疏矩阵运算所必需的硬件资源组成。总的来说,加速器有效地将提供给它的可用存储器带宽转换为性能。

可以通过以下方式来实现性能的缩放:在加速器块中采用更多PE来并行处理多个矩阵子块,和/或采用更多加速器块(每个具有一组PE)来并行处理多个矩阵块。下面考虑这些选项的组合。应调整PE和/或加速器块的数量以匹配存储器带宽。

加速器6900的一种实施方式可以通过软件库编程。这样的库在存储器中准备好矩阵数据,利用有关计算的信息(例如,计算类型,指向矩阵数据的存储器指针)在加速器6900中设置控制寄存器,并启动加速器。然后,加速器独立访问存储器中的矩阵数据,执行计算,并将结果写回存储器以供软件使用。

加速器通过将其PE设置为适当的数据路径配置来处理不同的计算模式,如图75a-b所示。特别地,图75a突出显示spMspV_csc和scale_update操作的路径(使用虚线),图75b示出了spMdV_csr操作的路径。执行每个计算模式的加速器操作详述如下。

对于spMspV_csc,初始y向量子集由DMU 6905加载到PE的RAM 7421中。然后,它从存储器读取x向量元素。对于每个x元素,DMU 6905从存储器流传输相应矩阵列的元素并将它们提供给PE 6901。每个矩阵元素包含值(A.val)和指向y元素的索引(A.idx)以从PE的RAM 7421读取。DMU 6905还提供x向量元素(x.val),其通过乘法累加(FMA)单元与A.val相乘。结果用于更新A.idx指向的PE RAM中的y元素。注意,即使我们的工作负载没有使用,加速器也支持通过处理所有矩阵列而不是仅仅一个子集(因为x是密集的)来对密集x向量进行逐列相乘(spMdV_csc)。

scale_update操作类似于spMspV_csc,只是DMU 6905读取以CSR格式而不是CSC格式表示的A矩阵的行。对于spMdV_csr,x向量子集被加载到PE的RAM 7421中。DMU 6905从存储器流传输矩阵行元素(即,{A.val,A.idx}对)。A.idx用于从RAM 7421读取适当的x向量元素,其通过FMA与A.val相乘。结果被累加到总和寄存器7412中。每当PE看到指示行结束的标记时,就将总和寄存器写入输出缓冲器,该标记由DMU 6905提供。这样,每个PE产生针对它负责的行子块的总和。为了产生该行的最终总和,由所有PE产生的子块总和由DMU中的缩减单元7404加在一起(参见图74)。最后的总和被写入输出缓冲器7413-7414,然后DMU 6905将其写入存储器。

图数据处理

在一种实施方式中,本文描述的加速器架构被配置为处理图数据。图形分析依赖于图算法来提取有关表示为图的数据之间关系的知识。图数据(来自例如社交媒体等来源)的激增导致对图形分析的强烈需求和广泛使用。因此,能够尽可能高效地进行图形分析至关重要。

为了满足这种需要,一种实施方式自动将用户定义的图算法映射到针对给定输入图算法定制的硬件加速器架构“模板”。加速器可以包括上述架构,并且可以实现为FPGA/ASIC,其可以极高效率地执行。总之,一种实施方式包括:

(1)基于广义稀疏矩阵向量乘法(GSPMV)加速器的硬件加速器架构模板。它支持任意图算法,因为已经证明图算法可以公式化为矩阵运算。

(2)将广泛使用的“以顶点为中心”的图编程抽象映射和调整到架构模板的自动方法。

存在稀疏矩阵乘法硬件加速器,但是它们不支持可定制性以允许图算法的映射。

设计框架的一种实施方式如下操作。

(1)用户遵循以顶点为中心的图编程抽象将图算法指定为“顶点程序”。由于其受欢迎程度,因此选择此抽象作为示例。顶点程序不会暴露硬件细节,因此没有硬件专业知识的用户(例如,数据科学家)可以创建它。

(2)与(1)中的图算法一起,框架的一种实施方式接受以下输入:

a.要生成的目标硬件加速器的参数(例如,片上RAM的最大量)。这些参数可以由用户提供,或者在以现有系统(例如,特定FPGA板)为目标时从现有的已知参数库获得。

b.设计优化目标(例如,最大性能,最小面积)

c.目标图数据的属性(例如,图的类型)或图数据本身。这是可选的,用于辅助自动调整。

(3)给定以上输入,框架的一种实施方式执行自动调整以确定要应用于硬件模板的自定义集以优化输入图算法,将这些参数映射到架构模板以在可合成RTL中生成加速器实例,并执行所生成的RTL相对于从输入图算法规范导出的功能和性能软件模型的功能和性能验证。

在一种实施方式中,上述加速器架构通过(1)使其成为可定制的硬件模板和(2)支持顶点程序所需的功能而被扩展为支持顶点程序的执行。基于该模板,描述了一种设计框架,用于将用户提供的顶点程序映射到硬件模板,以产生针对顶点程序优化的可合成RTL(例如,Verilog)实现实例。该框架还执行自动验证和调整,以确保生成的RTL正确和优化。此框架有多个用例。例如,所产生的可合成RTL可以部署在FPGA平台(例如,Xeon-FPGA)中以有效地执行给定的顶点程序。或者,它可以进一步细化以产生ASIC实施方式。

图可以表示为邻接矩阵,并且图处理可以公式化为稀疏矩阵运算。图76a-b示出了将图表示为邻接矩阵的示例。矩阵中的每个非零值表示图中两个节点之间的边。例如,第0行第2列中的1表示从节点A到C的边。

用于描述关于图数据的计算的最流行的模型之一是顶点编程模型。一种实施方式支持来自Graphmat软件框架的顶点编程模型变体,其将顶点程序公式化为广义稀疏矩阵向量乘法(GSPMV)。如图76c所示,顶点程序包括与图中的边/顶点相关联的数据类型(edata/vdata),在图中的顶点之间发送的消息(mdata)和临时数据(tdata)(在程序代码的顶部示出);和无状态用户定义的计算函数,使用读取和更新图数据的预定义API(如程序代码的底部所示)。

图76d示出了用于执行顶点程序的示例性程序代码。边数据表示为邻接矩阵A(如图76b中),顶点数据表示为向量y,消息表示为稀疏向量x。图76e示出了GSPMV公式化,其中SPMV中的multiply()和add()运算由用户定义的PROCESS_MSG()和REDUCE()一般化。

此处的一个观察是执行顶点程序所需的GSPMV变体执行稀疏矩阵A(即,邻接矩阵)与稀疏向量x(即,消息)的面向列的乘法以产生输出向量y(即,顶点数据)。该运算被称为col_spMspV(先前关于上述加速器描述)。

给定这些输入,框架的模板映射部件7711将输入顶点程序映射到硬件加速器架构模板,并产生为执行顶点程序7701而优化的加速器实例的RTL实施方式7705。自动调整部件7713执行自动调整7713以针对给定的设计目标优化所生成的RTL,同时满足硬件设计约束。此外,验证部件7712针对从输入导出的功能和性能模型自动验证所生成的RTL。验证测试台7706和调整报告7707与RTL一起产生。

图77中示出了用于GSPMV的架构模板的一种实施方式,其基于上述加速器架构(参见例如图74和相关文本)。图77中所示的许多部件是可定制的。在一种实施方式中,支持顶点程序执行的架构扩展如下。

如图78所示,在每个PE内部提供可定制的逻辑块以支持顶点程序所需的PROCESS_MSG(处理消息)()1910、REDUCE(缩减)()7811、APPLY(应用)7812和SEND_MSG(发送消息)()7813。另外,一种实施方式提供可定制的片上储存结构和打包/解包逻辑7805以支持用户定义的图数据(即,vdata、edata、mdata、tdata)。所示的数据管理单元6905包括PE调度器7401(用于如上所述地调度PE),用于存储活动列(x数据)的辅助缓冲器7801,读缓冲器7402,用于控制对系统存储器的访问的存储器控制器7803,以及写缓冲器7403。此外,在图78所示的实施方式中,旧的和新的vdata和tdata存储在本地PE存储器7421中。可以修改各种控制状态机以支持执行顶点程序,遵守图76d和76e中的算法指定的功能。

在图79中总结了每个加速器区块的操作。在7901处,将y向量(vdata)加载到PERAM 7421。在7902处,将x向量和列指针加载到辅助缓冲器7801。在7903处,对于每个x向量元素,在(edata)中流传输A列,PE执行PROC_MSG()7810和REDUCE()7811。在7904处,PE执行APPLY()7812。在7905,PE执行SEND_MSG()7813,产生消息,并且数据管理单元6905将它们作为x向量写入存储器中。在7906处,数据管理单元6905将存储在PE RAM 7421中的更新的y向量(vdata)写回存储器。上述技术符合图76d和76e所示的顶点程序执行算法。为了扩展性能,该架构允许增加区块中的PE数量和/或设计中的区块数量。这样,该架构可以利用图中的多级并行性(即,跨子图(跨邻接矩阵的块)或在每个子图内)。图80a中的表总结了模板的一种实施方式的可定制参数。还可以跨区块分配不对称参数以进行优化(例如,一个区块具有比另一区块更多的PE)。

调整。基于输入,框架的一种实施方式执行自动调整以确定用于定制硬件架构模板的最佳设计参数,以便针对输入顶点程序和(可选地)图数据优化它。存在许多调整考虑因素,在图80b的表中有这些考虑因素的总结。如图所示,这些包括数据的位置、图数据大小、图计算功能、图数据结构、图数据访问属性、图数据类型和图数据模式。

模板映射。在此阶段,框架采用由调整阶段确定的模板参数,并通过“填充”模板的可定制部分来生成加速器实例。可以使用现有的高级合成(HLS)工具将用户定义的计算功能(例如,图76c)从输入规范映射到适当的PE计算块。储存结构(例如,RAM、缓冲器、缓存)和存储器接口使用它们相应的设计参数来实例化。可以从数据类型规范自动生成打包/解包逻辑(例如,图76a)。还基于所提供的设计参数(例如,PE调度方案)生成控制有限状态机(FSM)的部分。

验证。在一种实施方式中,然后自动验证由模板映射产生的加速器架构实例(可合成的RTL)。为此,框架的一种实施方式导出顶点程序的功能模型,以用作“黄金”参考。生成测试台以将该黄金参考的执行与架构实例的RTL实现的仿真进行比较。该框架还通过将RTL仿真与分析性能模型和周期精确的软件仿真器进行比较来执行性能验证。它报告运行时故障并明确指出影响性能的设计瓶颈。

稀疏数据集(其值大多为零的向量或矩阵)的计算对于越来越多的商业上重要的应用是关键的,但是当在当今的CPU上运行时通常仅达到峰值性能的几个百分点。在科学计算领域,稀疏矩阵计算几十年来一直是线性求解器的关键核心。最近,机器学习和图分析的爆炸式增长使稀疏计算成为主流。稀疏矩阵计算是许多机器学习应用的核心,并构成许多图算法的核心。

稀疏矩阵计算往往是存储器带宽受限而不是计算受限的,使得CPU改变难以改善其性能。它们对每个矩阵数据元素执行很少的操作,并且在重新使用任何数据之前,经常迭代整个矩阵,使缓存低效。此外,许多稀疏矩阵算法包含大量依赖于数据的收集和分散,例如出现在稀疏矩阵向量乘法中的result[row]+=matrix[row][i].value*vector[matrix[row][i].index]运算,这些依赖于数据收集和分散很难预测并且降低预取器的有效性。

为了提供比传统微处理器更好的稀疏矩阵性能,系统必须提供比当前CPU明显更高的存储器带宽和非常节能的计算架构。增加存储器带宽可以提高性能,但DRAM访问的高能量/位成本限制了可用于处理该带宽的功率量。如果没有节能的计算架构,系统可能会发现自己无法在不超出其功率预算的情况下处理来自高带宽存储器系统的数据。

一种实施方式包括用于稀疏矩阵计算的加速器,其使用堆叠DRAM来提供稀疏矩阵算法需要的带宽结合定制计算架构来以节能的方式处理该带宽。

稀疏矩阵概述

许多应用程序创建数据集,其中绝大多数值为零。有限元方法将对象建模为点网格,其中每个点的状态是网格中其附近点的状态的函数。在数学上,这变成方程系统,表示为矩阵,其中每行描述一个点的状态,并且对于不直接影响该行所描述的点的状态的所有点,该行中的值为零。图可以表示为邻接矩阵,其中矩阵中的每个元素{i,j}给出图中顶点i和j之间的边的权重。由于大多数顶点仅连接到图中的一小部分其他顶点,因此邻接矩阵中的绝大多数元素都为零。在机器学习中,通常使用由许多样本组成的数据集来训练模型,每个样本包含一组特征(对系统或对象的状态的观察)以及该组特征的模型的期望输出。大多数样本仅包含可能特征的小子集是非常常见的,例如当特征表示文档中可能存在的不同词语时,再次创建大多数值为零的数据集。

大多数值为零的数据集被描述为“稀疏”,并且稀疏数据集极为稀疏,在其不到1%的元素中具有非零值是非常常见的。这些数据集通常表示为矩阵,使用仅指定矩阵中非零元素的值的数据结构。虽然这增加了表示每个非零元素所需的空间量,但由于必须同时指定元素的位置及其值,因此如果矩阵足够稀疏,则整体空间(存储器)节省可能很大。例如,稀疏矩阵的最直接表示之一是坐标列表(COO)表示,其中每个非零值由{行索引,列索引,值}元组指定。虽然这使得每个非零值所需的存储量增加了三倍,但如果矩阵中只有1%的元素具有非零值,则COO表示将仅占用密集表示(表示矩阵中每个元素的值的表示法)会占用的空间的3%。

图81示出了最常见的稀疏矩阵格式之一,即压缩行储存(CRS,有时缩写为CSR)格式。在CRS格式中,矩阵8100由三个数组描述:值数组8101,其包含非零元素的值;索引数组8102,其指定矩阵的行内的每个非零元素的位置;及行起始数组8103,其指定矩阵的每一行在索引和值列表中开始的位置。因此,示例矩阵的第二行的第一个非零元素可以在索引和值数组中的位置2处找到,并且由元组{0,7}描述,指示该元素出现在行内的位置0,值为7。其他常用的稀疏矩阵格式包括压缩稀疏列(CSC),它是CRS的主要考虑列的对偶(column-major dual);以及ELLPACK,它将矩阵的每一行表示为非零值及其索引的固定宽度列表,当一行具有比矩阵中最长行更少的非零元素时,使用明确的零填充。

稀疏矩阵的计算具有与其密集矩阵对应物相同的结构,但是稀疏数据的性质往往使它们比其密集矩阵对应物更为带宽密集。例如,矩阵-矩阵乘法的稀疏和密集变体都通过对于所有i,j计算Ci,j=Ai,·B,j来得到C=A·B。在密集矩阵-矩阵计算中,这导致大量数据重用,因为A的每个元素参与N个乘法-加法运算(假设N×N矩阵),B的每个元素也是如此。只要矩阵-矩阵乘法被阻止用于缓存局部性,这种重用使就得计算具有低字节/操作比并且是计算受限的。但是,在稀疏变体中,A的每个元素仅参与与B的相应行中的非零值一样多的乘法-加法运算,而B的每个元素仅参与与A的相应列中的非零元素一样多的乘法-加法。随着矩阵的稀疏性增加,字节/操作比也增加,使得许多稀疏矩阵-矩阵计算的性能受到存储器带宽的限制,尽管密集矩阵-矩阵乘法是经典的计算受限的计算之一。

四种运算构成了当今应用中见到的大部分稀疏矩阵计算:稀疏矩阵-密集向量乘法(SpMV),稀疏矩阵-稀疏向量乘法,稀疏矩阵-稀疏矩阵乘法和松弛/平滑器运算,例如用于实现高性能共轭梯度基准的Gauss-Seidel平滑器。这些运算共享两个特性,使稀疏矩阵加速器变得实用。首先,它们由向量点积控制,这使得实现可以实现所有四个重要计算的简单硬件成为可能。例如,通过获得矩阵中的每行与向量的点积来执行矩阵向量乘法,而矩阵-矩阵乘法获得一个矩阵的每行与另一个矩阵的每列的点积。其次,应用程序通常在同一矩阵上执行多次计算,例如支持向量机算法在训练模型时执行的不同向量的相同矩阵的数千次乘法。重复使用相同的矩阵使得可以实现在程序执行期间将矩阵传送到加速器或从加速器传送矩阵和/或以简化硬件任务的方式重新格式化矩阵,因为数据传送/转换的成本可以在每个矩阵的许多操作上分摊。

稀疏矩阵计算通常仅实现其运行的系统的峰值性能的几个百分点。为了证明为什么会发生这种情况,图82示出了使用CRS数据格式实现稀疏矩阵密集向量乘法所涉及的步骤8201-8204。首先,在8201处,从存储器中读出表示矩阵行的数据结构,其通常涉及易于预测和预取的一组顺序读取。其次,在8202处,矩阵行中的非零元素的索引被用于收集向量的相应元素,这需要多个数据相关的、难以预测的存储器访问(收集操作)。此外,这些存储器访问通常仅在每个被引用的缓存行中接触一个或两个字,导致当向量不适合缓存时相当大的浪费带宽。

第三,在8203处,处理器计算矩阵行的非零元素和向量的对应元素的点积。最后,在8204处,将点积的结果写入结果向量,该结果向量也被顺序存取,并且程序前进到矩阵的下一行。注意,这是计算的概念/算法视图,程序执行的确切操作顺序取决于处理器的ISA和向量宽度。

该示例示出了稀疏矩阵计算的许多重要特征。假设32位数据类型并且矩阵和向量都不适合缓存,计算输出行的第一个元素需要从DRAM读取36个字节,但只有5个计算指令(3个乘法和2个加法),具有7.2:1的字节/操作比。

然而,存储器带宽不是高性能稀疏矩阵计算的唯一挑战。如图82所示,对SpMV中的向量的访问是数据相关的并且难以预测,从而向应用暴露了向量访问的延迟。如果向量不适合缓存,则SpMV性能会对DRAM延迟以及带宽变得敏感,除非处理器提供足够的并行性以使DRAM带宽饱和,即使许多线程停止等待数据也是如此。

因此,用于稀疏矩阵计算的架构必须提供几个有效的事项。它必须提供高存储器带宽以满足稀疏计算的字节/操作需求。它还必须支持可能不适合缓存的大型向量中的高带宽收集。最后,虽然执行足够的算术运算/秒以跟上DRAM带宽本身并不是一个挑战,但架构必须以节能的方式执行这些操作和它们所需的所有存储器访问,以便保留在系统功率预算内。

一种实施方式包括加速器,其被设计为提供高稀疏矩阵性能所必需的三个特征:高存储器带宽,从大向量中的高带宽收集,以及节能计算。如图83所示,加速器的一种实施方式包括加速器逻辑管芯8305和DRAM管芯的多个堆叠8301-8304中的一个。下面更详细描述的堆叠式DRAM在低能量/位下提供高存储器带宽。例如,堆叠式DRAM预计以2.5pJ/位提供256-512GB/秒,而LPDDR4 DIMM预计仅提供68GB/秒,并且能量成本为12pJ/位。

加速器堆叠底部的加速器逻辑芯片8305被定制以满足稀疏矩阵计算的需要,并且能够消耗DRAM堆叠8301-8304提供的带宽,同时仅耗费2-4瓦的功率,能耗与堆叠带宽成正比。为保守起见,对于本应用的其余部分,假设堆叠带宽为273GB/秒(WIO3堆叠的预期带宽)。基于更高带宽堆叠的设计将包含更多并行性以便消耗存储器带宽。

图84示出了加速器逻辑芯片8305的一种实施方式,其从顶部透视图穿过DRAM管芯堆叠8301-8304而定向。朝向图的中心的堆叠DRAM通道块8405表示将逻辑芯片8305连接到DRAM 8301-8304的穿硅通孔,而存储器控制器块7410包含产生DRAM通道的控制信号的逻辑。虽然图中示出了八个DRAM通道8405,但是在加速器芯片上实现的实际通道数量将根据所使用的堆叠式DRAM而变化。正在开发的大多数堆叠DRAM技术提供四个或八个通道。

点积引擎(DPE)8420是架构的计算元件。在图84a-b中所示的特定实施方式中,每组八个DPE与向量缓存8415相关联。图85提供了DPE的高级概览,其包含两个缓冲区8505-8506,两个64位乘法-加法ALU8510和控制逻辑8500。在计算期间,芯片控制单元8500将正在处理的数据的块流传输到缓冲存储器8505-8506。一旦每个缓冲区都满了,DPE的控制逻辑就会通过缓冲区进行排序,计算它们包含的向量的点积,并将结果写出到DPE的结果锁存器8512,它以菊花链形式与另一个DPE的结果锁存器连接,以将计算结果写回堆叠DRAM 8301-8304。

在一种实施方式中,加速器逻辑芯片在约1GHz和0.65V下操作以最小化功耗(尽管可针对不同应用修改特定操作频率和电压)。基于14nm设计研究的分析表明,32-64KB缓冲区在该电压下符合此频率规格,但可能需要强ECC来防止软错误。乘法-加法单元可以以基本时钟速率的一半操作,以便满足与0.65V电源电压和浅流水线的定时。具有两个ALU为每个DPE提供一个双精度乘法-加法/周期的吞吐量。

在273GB/秒和1.066MHz的时钟速率下,DRAM堆叠8301-8304每个逻辑芯片时钟周期传送256字节的数据。假设数组索引和值至少为32位量值,则每个周期转换为32个稀疏矩阵元素(4个字节的索引+4个字节的值=8个字节/元素),要求芯片每个周期执行32次乘法-加法以保持跟上。(这用于矩阵-向量乘法并假设向量缓存中的高命中率,使得100%的堆叠DRAM带宽用于提取矩阵。)图84中所示的64个DPE提供2-4倍的所需计算吞吐量,允许芯片以峰值堆叠DRAM带宽处理数据,即使未在100%的时间内使用ALU 8510。

在一种实施方式中,向量缓存8415缓存矩阵-向量乘法中的向量的元素。这显著提高了下面描述的矩阵分块方案的效率。在一种实施方式中,每个向量缓存块包含32-64KB的缓存,在8通道架构中总容量为256-512KB。

芯片控制单元8401管理计算流程并处理与加速器中的其他堆叠以及系统中的其他插槽的通信。为了降低复杂性和功耗,点积引擎从不从存储器请求数据。相反,芯片控制单元8401管理存储器系统,启动将适当的数据块推送到每个DPE的传输。

在一种实施方式中,多堆叠加速器中的堆叠通过KTI链路8430的网络彼此通信,KTI链路8430使用图中所示的邻居连接8431实现。该芯片还提供三个额外的KTI链路,用于与多插槽系统中的其他插槽通信。在多堆叠加速器中,堆叠的封装外KTI链路8430中只有一个链路将处于活动状态。以其他堆叠上的存储器为目标的KTI事务将通过封装上KTI网络路由到适当的堆叠。

本文描述了在加速器的一种实施方式上实现稀疏矩阵-密集向量和稀疏矩阵-稀疏向量乘法的技术和硬件。这也可以扩展为支持矩阵-矩阵乘法,松弛运算和其他函数,以创建支持稀疏矩阵运算的加速器。

虽然稀疏-稀疏和稀疏-密集矩阵-向量乘法执行相同的基本算法(取矩阵中的每一行与向量的点积),但是与向量密集时相比,当向量稀疏时,如何实现该算法存在显著差异,这些总结在下表中。

在稀疏矩阵-密集向量乘法中,向量的大小是固定的并且等于矩阵中的列数。由于在科学计算中发现的许多矩阵每行平均大约10个非零元素,因此稀疏矩阵-密集向量乘法中的向量占用矩阵本身5-10%的空间并不罕见。另一方面,稀疏向量通常相当短,包含与矩阵行相似数量的非零值,这使得它们更容易在片上存储器中缓存。

在稀疏矩阵-密集向量乘法中,向量中的每个元素的位置由其索引确定,使得可以收集对应于矩阵的区域中的非零值的向量元素并且预先计算需要为矩阵将相乘的任何密集向量收集的向量元素集。然而,稀疏向量中每个元素的位置是不可预测的,并且取决于向量中非零元素的分布。这使得有必要检查稀疏向量和矩阵的非零元素以确定矩阵中的哪些非零值对应于向量中的非零值。

比较矩阵和向量中的非零元素的索引是有帮助的,因为计算稀疏矩阵-稀疏向量点积所需的指令/操作的数量是不可预测的并且取决于矩阵和向量的结构。例如,考虑取得具有单个非零元素的矩阵行和具有许多非零元素的向量的点积。如果行的非零值的索引低于向量中的任何非零值的索引,则点积只需要一个索引比较。如果行的非零值的索引高于向量中的任何非零值的索引,则计算点积需要将行的非零值的索引与向量中的每个索引进行比较。假设通过向量进行线性搜索,这是常见的做法。其他搜索(例如二进制搜索)在最坏的情况下会更快,但会在行和向量中的非零值重叠的常见情况下增加显著的开销。相反,执行稀疏矩阵-密集向量乘法所需的操作的数量是固定的,并且由矩阵中的非零值的数量确定,使得易于预测计算所需的时间量。

由于这些差异,加速器的一种实施方式使用相同的高级算法来实现稀疏矩阵-密集向量和稀疏矩阵-稀疏向量乘法,其中在向量如何在点积引擎上分布以及如何计算点积的方面存在差异。因为加速器旨在用于大型稀疏矩阵计算,所以不能假设矩阵或向量将适合片上存储器。相反,一种实施方式使用图86中概述的分块方案。

特别地,在该实施方式中,加速器将矩阵划分为固定大小的数据块8601-8602,其大小适合于片上存储器,并且将块中的行乘以向量以在前进到下一个块之前生成输出向量的块。这种方法带来两个挑战。首先,稀疏矩阵的每行中的非零数在数据集之间变化很大,在所研究的数据集中从低至1到高达46,000个。这使得为每个点积引擎分配一个或甚至固定数量的行是不切实际的。因此,一种实施方式将固定大小的矩阵数据块分配给每个点积引擎,并处理一个块包含多个矩阵行的情况以及单个行跨多个块分布的情况。

第二个挑战是从堆叠DRAM中为矩阵的每个块提取整个向量有浪费大量带宽的可能性(即,提取块中没有对应的非零值的向量元素)。这对于稀疏矩阵-密集向量乘法尤其是一个问题,其中向量可以是稀疏矩阵大小的相当大的部分。为了解决这个问题,一种实施方式为矩阵中的每个块8601-8602构造提取列表8611-8612,其列出了对应于块中的非零值的向量8610元素集,并且仅在处理块时提取那些元素。虽然也必须从堆叠DRAM中取出提取列表,但已经确定对于大多数块,提取列表将是块大小的一小部分。诸如游程长度编码之类的技术也可用于减小提取列表的大小。

因此,加速器上的矩阵向量乘法将涉及以下操作序列:

1.从DRAM堆叠提取矩阵数据块并将其分布在点积引擎上;

2.基于矩阵数据中的非零元素生成提取列表;

3.从堆叠DRAM中提取出提取列表中的每个向量元素,并将其分发给点积引擎;

4.计算块中的行与向量的点积,并将结果写出到堆叠DRAM;和

5.与计算并行地,提取下一个矩阵数据块并重复,直到处理了整个矩阵。

当加速器包含多个堆叠时,可以将矩阵的“分区”静态地分配给不同的堆叠,然后可以在每个分区上并行地执行分块算法。这种分块和广播方案的优点是所有存储器引用都来自中央控制单元,这极大地简化了片上网络的设计,因为网络不必在点积引擎和存储器控制器之间路由不可预测的请求和回复。它还通过仅对给定块所需的每个向量元素发出一个存储器请求来节省能量,而不是让各个点积引擎对它们执行其计算部分所需的向量元素发出存储器请求。最后,从有组织的索引列表中提取向量元素使得容易以最大化堆叠DRAM中的页命中以及因此最大化带宽使用的方式来调度那些提取所需的存储器请求。

在本文描述的加速器实施方式上实施稀疏矩阵-密集向量乘法的一个挑战是将从存储器流传输的向量元素与每个点积引擎的缓冲区中的矩阵元素的索引相匹配。在一种实施方式中,每个周期中向量的256个字节(32-64个元素)到达点积引擎,并且每个向量元素可以对应于点积引擎的矩阵缓冲区中的任何非零值,因为固定大小的矩阵数据块被提取到每个点积引擎的矩阵缓冲区中。

在每个周期执行许多比较在面积和功率方面将是非常昂贵的。相反,一种实施方式利用了这样的事实:许多稀疏矩阵应用程序反复将相同的矩阵与相同或不同的向量相乘,并预先计算每个点积引擎处理其矩阵块所需的提取列表的元素,使用图87中所示的格式。在基本CRS格式中,矩阵由定义每个非零值在其行内的位置的索引数组8702、包含每个非零元素的值的数组8703和表示每一行在索引和值数组中开始的位置的数组8701来描述。为此,一种实施方式添加块描述符数组8705,其标识每个点积引擎需要捕获哪些向量数据突发以便执行整体计算中的其相应部分。

如图87所示,每个块描述符由八个16位值和突发描述符列表组成。第一个16位值告诉硬件块描述符中有多少个突发描述符,而其余七个标识所有堆叠DRAM数据通道(除第一个数据通道之外)的突发描述符列表内的起始点。这些值的数量将根据堆叠DRAM提供的数据通道的数量而改变。每个突发描述符包含24位突发计数,它告诉硬件需要注意哪个数据突发;以及“需要的字”位向量,用于标识突发中包含点处理引擎所需的值的字。

一种实施方式中包括的其他数据结构是矩阵缓冲区索引(MBI)数组8704,矩阵中每个非零元素一个MBI。每个MBI给出对应于非零值的密集向量元素将存储在相关点积引擎的向量值缓冲区中的位置(参见例如图89)。当执行稀疏矩阵-密集向量乘法时,矩阵缓冲区索引而不是原始矩阵索引被加载到点积引擎的矩阵索引缓冲区8704中,并且用作用于在计算点积时查找相应向量值的地址。

图88示出了在仅具有一个堆叠DRAM数据通道和四字数据突发的系统上,这如何适用于适合单个点积引擎的缓冲区内的双行矩阵。包括行起始值8801、矩阵索引8802和矩阵值8803的原始CRS表示在图的左侧示出。由于两行在列{2,5,6}和{2,4,5}中具有非零元素,因此需要向量的元素2、4、5和6来计算点积。块描述符反映了这一点,表示第一个四字突发的字2(向量的元素2)和第二个四字突发的字0、1和2(向量的元素4-6)是必需的。由于向量的元素2是点积引擎所需的向量的第一个字,因此它将进入向量值缓冲区中的位置0。向量的元素4将进入位置1,依此类推。

矩阵缓冲区索引阵列数据8804保持向量值缓冲区内硬件将找到对应于矩阵中的非零元素的值的位置。由于矩阵索引数组中的第一个条目值为“2”,因此矩阵缓冲区索引数组中的第一个条目获得值“0”,对应于向量的元素2将被存储在向量值缓冲区中的位置。类似地,在矩阵索引数组中出现“4”的任何地方,矩阵缓冲区索引中将出现“1”,矩阵索引数组中的每个“5”在矩阵缓冲区索引中将具有对应的“2”,并且矩阵索引数组中的每个“6”将对应于矩阵缓冲区索引中的“3”。

当矩阵被加载到加速器上时,本发明的一种实施方式执行支持从密集向量中快速收集所需的预先计算,利用多堆叠加速器的总带宽远大于用于将数据从CPU传输到加速器的KTI链路的带宽的事实。该预先计算的信息将保存矩阵所需的存储器量增大高达75%,这取决于映射到点积引擎上的矩阵块内出现相同矩阵索引的多个副本的频繁程度。但是,因为当执行矩阵向量乘法时,提取16位矩阵缓冲区索引数组而不是矩阵索引数组,所以从堆叠DRAM中提取的数据量通常小于原始CRS表示中的数据量,特别是对于使用64位索引的矩阵。

图89示出了使用该格式的点积引擎中的硬件的一种实施方式。为了执行矩阵向量乘法,将构成块的矩阵的块复制到矩阵索引缓冲区8903和矩阵值缓冲区8905(复制矩阵缓冲区索引而不是原始矩阵索引),将相关块描述符复制到块描述符缓冲区8902。然后,提取列表被用于从密集向量加载所需元素并将它们广播到点积引擎。每个点积引擎对每个数据通道上通过的向量数据的突发数进行计数。当给定数据通道上的计数与突发描述符中指定的值匹配时,匹配逻辑8920捕获指定的字并将它们存储在其向量值缓冲区8904中。

图90示出了进行该捕获的匹配逻辑8920单元的内容。当计数器与突发描述符中的值匹配时,锁存器9005捕获数据通道线上的值。移位器9006从突发9001中提取所需的字9002,并将它们路由到行缓冲区9007中的正确位置,行缓冲区9007的大小与向量值缓冲区中的行匹配。当突发计数9001等于内部计数器9004时,产生加载信号。当行缓冲区填满时,将其存储在向量值缓冲区9004中(通过多路复用器9008)。以这种方式将来自多个突发的字组合成行减少了向量值缓冲区需要支持的写入/周期数,从而缩减了其大小。

一旦在向量值缓冲区中捕获了向量的所有所需元素,则点积引擎使用ALU 8910计算所需的点积。控制逻辑8901依次逐步通过矩阵索引缓冲区8903和矩阵值缓冲区8904,每个周期一个元素。矩阵索引缓冲区8903的输出在下一个周期用作向量值缓冲区8904的读地址,而矩阵值缓冲区8904的输出被锁存,使得它与来自向量值缓冲区8904的对应值同时到达ALU 8910。例如,使用来自图88的矩阵,在点积计算的第一周期,硬件将从矩阵索引缓冲区8903中读出矩阵缓冲区索引“0”以及从矩阵值缓冲区8905中读出值“13”。在第二周期,来自矩阵索引缓冲区8903的值“0”用作向量值缓冲区8904的地址,提取向量元素的值“2”,其然后在周期3上乘以“13”。

行起始位向量8901中的值告知硬件矩阵的行何时结束并且新的一行何时开始。当硬件到达行的末尾时,它将该行的累加点积放在其输出锁存器8911中,并开始累加下一行的点积。每个点积引擎的点积锁存器以菊花链形式连接,组合输出向量以进行回写。

在稀疏矩阵-稀疏向量乘法中,向量往往占用比稀疏矩阵-密集向量乘法少得多的存储器,但是,因为它是稀疏的,所以不可能直接提取对应于给定索引的向量元素。相反,必须搜索向量,使得仅将每个点积引擎所需的元素路由到点积引擎是不切实际的,并且使得计算分配给每个点积引擎的矩阵数据的点积所需的时间量不可预测。因此,稀疏矩阵-稀疏向量乘法的提取列表仅指定矩阵块中最低和最高非零元素的索引,并且这些点之间的向量的所有非零元素必须被广播到点积引擎。

图91示出了支持稀疏矩阵-稀疏向量乘法的点积引擎设计的细节。为了处理矩阵数据块,点积引擎的矩阵块的索引(不是稀疏-密集乘法中使用的矩阵缓冲区索引)和值被写入矩阵索引和值缓冲区,处理块所需的向量区域的索引和值也是如此。然后,点积引擎控制逻辑9140顺序通过索引缓冲区9102-9103,索引缓冲区9102-9103将4个索引的块输出到4×4比较器9120。4×4比较器9120将来自向量9102的每个索引与来自矩阵9103的每个索引进行比较,并将任何匹配的缓冲区地址输出到匹配索引队列9130。匹配索引队列9130的输出驱动矩阵值缓冲区9105和向量值缓冲区9104的读取地址输入,矩阵值缓冲区9105和向量值缓冲区9104将对应于匹配的值输出到乘法-加法ALU 9110。该硬件允许点积引擎只要匹配的索引队列9130具有空的空间,就每个周期消耗至少四个并且多达八个索引,当索引匹配很少时减少处理数据块所需的时间量。

与稀疏矩阵-密集向量点积引擎一样,行起始的位向量9101标识矩阵缓冲区9102-9103中开始矩阵的新行的条目。当遇到这样的条目时,控制逻辑9140重置到向量索引缓冲区9102的开头并开始从它们的最低值检查向量索引,将它们与矩阵索引缓冲区9103的输出进行比较。类似地,如果到达向量的末尾时,控制逻辑9140前进到矩阵索引缓冲区9103中的下一行的开头并重置到向量索引缓冲区9102的开头。“完成”输出在点积引擎完成处理数据块或向量区域并准备前进到下一个时通知芯片控制单元。为了简化加速器的一种实施方式,控制逻辑9140将不会前进到下一个块/区域,直到所有点积引擎都已完成处理。

在许多情况下,向量缓冲区将足够大以容纳处理块所需的所有稀疏向量。在一种实施方式中,取决于使用32位还是64位值,提供1,024或2,048个向量元素的缓冲空间。

当向量的所需元素不适合向量缓冲区时,可以使用多通过(multipass)方法。控制逻辑9140将向量的完整缓冲区广播到每个点积引擎,其将开始迭代通过其矩阵缓冲区中的行。当点积引擎在到达行的末尾之前到达向量缓冲区的末尾时,它将在当前行位置位向量9111中设置一个位以指示在到达向量的下一个区域时它应该继续处理该行的位置,将保存它在矩阵值缓冲区9105对应于行的开始的位置已累加的部分点积,除非行的开始的索引值高于到目前为止已经处理的任何向量索引,并将前进到下一行。在处理了矩阵缓冲区中的所有行之后,点积引擎将使其完成信号生效以请求向量的下一个区域,并将重复该过程直到读取整个向量。

图92示出了使用特定值的示例。在计算开始时,矩阵的四元素块已被写入矩阵缓冲区9103、9105,并且向量的四元素区域已被写入向量缓冲区9102、9104。行起始9101和当前行位置位向量9106都具有值“1010”,表示点积引擎的矩阵块包含两行,其中一行从矩阵缓冲区中的第一个元素开始,其中一行从第三个元素开始。

当处理第一区域时,块中的第一行在索引3处发现索引匹配,计算矩阵和向量缓冲区的对应元素的乘积(4×1=4)并将该值写入到矩阵值缓冲区9105对应于行的起始的位置。第二行在索引1处发现一个索引匹配,计算向量和矩阵的对应元素的乘积,并将结果(6)在对应于其起始的位置处写入矩阵值缓冲区9105。当前行位置位向量的状态变为“0101”,表示已经处理了每行的第一个元素,并且应该用第二个元素继续计算。点积引擎然后使其完成行生效以用信号表示它已准备好用于向量的另一个区域。

当点积引擎处理向量的第二区域时,它发现行1在索引4处具有索引匹配,计算矩阵和向量的对应值的乘积(5×2=10),将该值添加到处理第一个向量区域后保存的部分点积,并输出结果(14)。第二行在索引7处发现匹配,并输出结果38,如图所示。以这种方式保存部分点积和计算状态避免了处理矩阵中不可能在向量的后面区域中匹配索引(因为向量按索引按升序排序)的元素的冗余工作,而不需要部分乘积的大量额外储存。

图93示出了如何组合稀疏-密集和稀疏-稀疏的点积引擎以产生可以处理两种类型的计算的点积引擎。鉴于两种设计之间的相似性,唯一需要的变化是实例化稀疏-密集点积引擎的匹配逻辑9311和稀疏-稀疏点积引擎的比较器9320和匹配索引队列9330,以及多路复用器9350(确定哪些模块驱动读取地址并写入缓冲区9104-9105的数据输入)和多路复用器9351(选择是否将矩阵值缓冲区的输出或矩阵值缓冲区的锁存输出发送到乘法-加法ALU 9110)的集合。在一种实施方式中,这些多路复用器由控制单元9140中的配置位控制,该配置位在矩阵向量乘法的开始处被设置并且在整个操作期间保持相同的配置。

单个加速器堆叠将在稀疏矩阵运算上提供与服务器CPU相当的性能,使其成为智能电话、平板电脑和其他移动设备的有吸引力的加速器。例如,存在用于机器学习应用的许多提议,它们在一个或多个服务器上训练模型,然后在移动设备上部署这些模型以处理输入数据流。由于模型往往比用于训练它们的数据集小得多,所以单个加速器堆叠的有限容量小于这些应用中的限制,而加速器的性能和功率效率将允许移动设备处理比在它们的主CPU上可行的模型复杂得多的模型。非移动系统的加速器将结合多个堆叠,以提供极高的带宽和性能。

图94a和94b中示出了多堆叠实施方式的两种实施方式。这两种实施方式都将几个加速器堆叠集成到与当前服务器CPU引脚兼容的封装上。图94a示出了具有12个加速器堆叠9401-9412的插口替换实施方式,图94b示出了具有处理器/核心集9430(例如,低核心计数Xeon)和8个堆叠9421-9424的多芯片封装(MCP)实施方式。图94a中的12个加速器堆叠被放置在阵列中,该阵列适配在当前封装中使用的39mm×39mm散热器下面,而图94b中的实施方式在相同的占用空间内包含八个堆叠和处理器/核心集。在一种实施方式中,用于堆叠的物理尺寸是8GB WIO3堆叠的尺寸。其他DRAM技术可能具有不同的尺寸,这可能会改变适合封装的堆叠数量。

这两种实施方式都通过KTI链路在CPU和加速器之间提供低延迟的基于存储器的通信。Xeon实施方式的插口替换设计替换多插口系统中的一个或多个CPU,并提供96GB的容量和3.2TB/s的堆叠DRAM带宽。预计功耗为90W,完全在Xeon插口的功率预算范围内。MCP方法提供64GB的容量和2.2TB/s的带宽,同时在加速器中消耗60W功率。假设每个插口的功率预算为150W,这为CPU留下90W的功率,足以支持中程Xeon CPU。如果详细的封装设计允许为封装中的逻辑提供更多的空间,则可以使用额外的堆叠或更强大的CPU,尽管这需要诸如针对Xeon+FPGA混合部件研究的核心停放技术的机制以保持总功耗在插口的功率预算范围内。

可以在不需要硅中介层或其他复杂的集成技术的情况下实现这两种设计。当前封装中使用的有机衬底允许每cm管芯周长大约300个信号,足以支持堆叠间KTI网络和封装外KTI链路。堆叠式DRAM设计通常可以在冷却成为问题之前支持消耗~10W功率的逻辑芯片,这远远超过了提供256GB/秒带宽的堆叠的2W逻辑管芯功率的估计。最后,多芯片封装需要在芯片之间留出1-2mm的空间用于布线,这与当前设计一致。

还可以在PCIe卡上和/或使用基于DDR4-T的加速器实现实施方式。假设PCIe卡的300W功率限制允许该卡支持40个加速器堆叠,以实现总容量为320GB,带宽为11TB/sec。但是,PCIe通道的长延迟和有限带宽将基于PCIe的加速器限制用于只需要与CPU进行不频繁交互的大问题。

可替换地,加速器堆叠可用于实现基于DDR-T DIMM的加速器9501-9516,如图95所示。DDR-T是一种存储器接口,设计为与DDR4插口和母板兼容。使用与DDR4相同的引脚输出和连接器格式,DDR-T提供基于事务的接口9500,允许使用具有不同时序特性的存储器件。在该实施方式中,加速器堆叠9501-9516在不用于执行计算时用作简单存储器。

DDR-T DIMM为16个(或者如果使用卡的两侧,则为32个)加速器堆叠提供足够的空间,提供126-256GB的存储容量和4-8TB/sec的总带宽。然而,这样的系统将消耗120-240瓦的功率,远远超过DDR4-DIMM消耗的~10W。这将需要主动冷却,这很难适配母板上分配给每个DIMM的有限空间。尽管如此,基于DDR-T的加速器可能对用户不愿意放弃用于加速的任何CPU性能并且愿意付出定制母板设计的代价的应用具有吸引力,该定制母板设计包括用于风扇或者其他冷却系统的加速器DIMM之间的足够空间。

在一种实施方式中,多堆叠加速器中的堆叠将是分离的不同的KTI节点,并且将由系统软件作为单独的设备来管理。系统固件将根据存在的加速器堆叠数量在引导时静态确定多堆叠加速器内的路由表,这应该唯一地确定拓扑。

在一种实施方式中,由于加速器抽象层(AAL)软件适用于基于插口的加速器,因此将使用加速器抽象层(AAL)软件来实现到加速器的低级接口。加速器可以实现如核心缓存接口规范(CCI)所描述的缓存代理,将堆叠的DRAM视为主机系统无法访问的加速器的专用(非一致性)存储器(即,缓存代理+专用缓存存储器配置,如CA+PCM)。CCI规范要求为每个加速器授予驱动程序用来控制加速器的单独的配置/状态寄存器(CSR)地址空间。根据该规范,每个加速器将通过设备状态存储器(DSM)将其状态传送给主机,DSM是固定存储器区域,被映射到主机存储器,用于指示加速器的状态。因此,在12堆叠系统中,将有12个不同的DSM区域由单个统一驱动程序代理管理。这些机制可用于为每个堆叠创建命令缓冲区。命令缓冲区是映射到系统存储器的固定存储器区域,实现为由AAL驱动程序管理的循环队列。驱动程序将命令写入每个堆叠的命令缓冲区,每个堆叠都使用来自其专用命令缓冲区中的项目。因此,在该实施方式中,命令的产生和使用将是分离的。

作为示例,考虑由连接到主机CPU的单个加速器堆叠组成的系统。用户编写代码以执行以下计算:wn+1=wn-αAwn,其中A是矩阵,wx是向量。软件框架和AAL驱动程序将此代码分解为以下命令序列:

TRANSMIT-将一系列分区(wn+1,wn,α,A)加载到专用缓存存储器中

MULTIPLY-乘以一系列分区(tmp=wn*α*A)

SUBTRACT-减去一系列分区(wn+1=wn-tmp)

RECEIVE-将一系列分区存储到包含结果(wn+1)的主机存储器

这些命令对“分区”进行操作,分区例如是位于主机或专用缓存存储器中的粗粒度(大约16MB-512MB)数据单元。分区旨在易于映射到MapReduce或Spark分布式计算系统使用的数据块上,以便利用加速器促进分布式计算的加速。AAL驱动程序负责创建分区到主机存储器区域或加速器堆叠的静态一对一映射。加速器堆叠各自将其分配的分区分别映射到其专用缓存存储器(PCM)地址空间。分区由分区索引(是唯一标识符)加上(对于位于主机存储器中的分区)相应的存储器区域和数据格式来描述。位于PCM中的分区由中央控制单元管理,中央控制单元确定分区的PCM地址区域。

在一种实施方式中,为了初始化加速器的PCM,主机指示加速器从主机存储器加载数据。TRANSMIT操作使加速器读取主机存储器并将读取的数据存储到加速器的PCM中。要传输的数据由{分区索引,主机存储器区域,数据格式}元组的序列描述。为了避免主机驱动程序进行数据编组的开销,加速器可以实现系统协议2(SPL2)共享虚拟存储器(SVM)。

每个元组中的数据格式描述了存储器中的分区的布局。加速器将支持的格式示例包括压缩稀疏行(CSR)和多维密集数组。对于上面的示例,A可以是CSR格式,而wn可以是数组格式。命令规范包括必要的信息和主机存储器地址,以指示加速器将TRANSMIT操作引用的所有分区加载到PCM中。

每个操作可以以分区序列的形式引用少量操作数。例如,MULTIPLY操作使加速器读取堆叠式DRAM并执行矩阵向量乘法。因此,在该示例中具有四个操作数:目的地向量tmp,乘数A,被乘数wn和标量α。目的地向量tmp被累加到由驱动程序指定的分区序列中,作为包含该操作的命令的一部分。如果需要,该命令将指示加速器初始化分区序列。

RECEIVE操作使加速器读取PCM并写入主机存储器。该操作可以实现为所有其他操作上的可选字段,可能融合命令以执行诸如MULTIPLY的操作,具有将结果存储到主机存储器的指令。RECEIVE操作的目的地操作数在芯片上累加,然后流传输到主机存储器中的分区中,其在分派命令之前必须由驱动程序固定(除非加速器实现SPL2 SVM)。

命令分派流程

在一种实施方式中,在将命令插入到堆叠的命令缓冲区之后,驱动程序将生成CSR写入以向堆叠通知要使用的新命令。驱动程序的CSR写入由加速器堆叠的中央控制单元使用,这使得控制单元生成对命令缓冲区的一系列读取以读取由驱动程序分派给堆叠的命令。当加速器堆叠完成命令时,它会将状态位写入其DSM。AAL驱动程序轮询或监控这些状态位以确定命令的完成。到DSM的TRANSMIT或MULTIPLY操作的输出是指示完成的状态位。对于RECEIVE操作,到DSM的输出是状态位和写入主机存储器的一系列分区。驱动程序负责识别加速器要写入的存储器区域。堆叠上的控制单元负责生成对堆叠DRAM的一系列读取操作以及对主机存储器中的目的地分区的相应写入。

软件启用

在一种实施方式中,用户通过调用例程库来与加速器交互,以将数据移动到加速器上,执行稀疏矩阵计算等。该库的API可以尽可能类似于现有的稀疏矩阵库,以减少修改现有应用程序以利用加速器所需的工作量。基于库的接口的另一个优点是它隐藏了加速器及其数据格式的细节,允许程序通过在运行时动态链接库的正确版本来利用不同的实施方式。还可以实现库以从如Spark的分布式计算环境调用加速器。

可以通过将设计划分为模块(存储器,ALU等)并从类似结构的14nm设计收集数据来估计加速器堆叠的面积和功耗。为了缩放到10nm工艺,可以假设面积减少50%,同时Cdyn减少25%,泄漏功率减少20%。面积估计包括所有片上存储器和ALU。假设导线在逻辑/存储器上方延伸。功率估算包括ALU和存储器的运行中能量,存储器的泄漏功率以及主要网络上的线缆功率。在14nm和10nm工艺中,假设基本时钟速率为1GHz,电源电压为0.65V。如上所述,ALU可以以基本时钟速率的一半的速率运行,并且在功率预测中考虑了这一点。当加速器执行计算时,预期KTI链路和堆叠间网络处于空闲或几乎空闲,因此未包括在功率估计中。一种实施方式跟踪这些网络上的活动,并将它们包括在功率估计中。

估算预测如本文所述的加速器将在14nm工艺中占据17mm

堆叠式DRAM是一种存储器技术,顾名思义,其垂直堆叠多个DRAM管芯,以便提供比诸如DDR4 DIMM的传统DRAM模块更高的带宽,与计算管芯更紧密的物理集成,以及更低的能量/位。图97中的表格比较了七种DRAM技术:非堆叠DDR4和LPDDR4,Pico模块,JEDEC标准高带宽(HBM

堆叠式DRAM有两种变型:管芯上和管芯旁。如图98a所示,管芯上堆叠8301-8304使用穿硅通孔直接连接到逻辑管芯或SoC 8305。相比之下,图98b中所示的管芯旁堆叠8301-8304放置在硅中介层或桥9802上的逻辑/SoC管芯8305旁边,DRAM和逻辑管芯之间的连接穿过中介层9802和界面层9801延伸。管芯上DRAM堆叠的优点在于允许比管芯旁堆叠更小的封装,但是缺点是难以将多于一个堆叠连接到逻辑管芯,限制了它们可以为每个管芯提供的存储量。相反,硅中介层9802的使用允许逻辑管芯与多个管芯旁堆叠通信,尽管在面积方面有一些成本。

DRAM的两个重要特征是每堆叠的带宽和每位的能量,因为它们定义了适合封装的带宽和消耗该带宽所需的功率。这些特性使得WIO3、ITRI和DiRAM成为如本文所述的用于加速器的最有前景的技术,因为Pico模块不提供足够的带宽并且HBM

在这三种技术中,DiRAM具有最高的带宽和容量以及最低的延迟,使其极具吸引力。WIO3是另一个有前途的选择,假设它成为JEDEC标准,并提供良好的带宽和容量。ITRI存储器具有三者中最低的能量/位,允许更多带宽以适合给定的功率预算。它还具有低延迟,其类似SRAM的接口将降低加速器存储器控制器的复杂性。但是,ITRI RAM具有三者中最低的容量,因为它的设计为了性能而牺牲了容量。

本文描述的加速器被设计为处理基于核心稀疏矩阵向量乘法(SpMV)基元构造的数据分析和机器学习算法。虽然SpMV通常主导这些算法的运行时间,但是也需要其他操作来实现它们。

作为示例,考虑图99中所示的广度优先搜索(BFS)列表。在这个示例中,大部分工作由第4行的SpMV执行;然而,还有向量向量减法(第8行),内积运算(第9行)和数据并行映射运算(第6行)。向量减法和内积是相对直接的运算,在向量ISA中通常得到支持,并且几乎不需要解释。

相反,数据并行映射操作有趣得多,因为它将可编程性引入概念上逐元素的操作。BFS示例演示了一种实施方式的映射功能提供的可编程性。特别地,BFS中的Lambda函数(参见图99中的第6行)用于跟踪首次访问顶点的时间。这是在一种实施方式中通过将两个数组和一个标量传递给Lambda函数来完成的。传递给Lambda函数的第一个数组是SpMV操作的输出,并反映哪些顶点当前可达。第二个数组对于每个顶点都有一个条目,其值是首次看到顶点的迭代次数,如果尚未到达顶点则为0。传递给Lambda函数的标量就是循环迭代计数器。在一种实施方式中,Lambda函数被编译成一系列标量运算,其对输入向量的每个元素执行以生成输出向量。

图99中示出了BFS的操作序列的中间表示(IR)。BFS Lambda IR展示了几个有趣的特征。保证生成的Lambda代码只有单个基本块。一种实施方式阻止Lambda函数中的迭代构造并执行if转换以避免控制流。该约束显著降低了用于执行Lambda的计算结构的复杂性,因为它不需要支持一般控制流。

所有存储器操作在基本块的开始处执行(图99的第2到4行)。当转换为汇编时,存储器操作被提升到codelet的前导码中(第2行到第5行)。

对使用利用Lambda函数的加速器实现的基准进行统计评估。记录指令的数量,寄存器的总数和负载的总数,以量化各种感兴趣的Lambda函数的“复杂性”。此外,关键路径长度反映了每个Lambda函数中最长的依赖指令链。当指令数明显长于关键路径时,指令级并行技术是提高性能的适用解决方案。对于给定的map调用或reduce调用,某些加载是不变的(Lambda函数的所有执行都将加载相同的值)。这种情况称为“Lambda不变加载”,并执行分析以检测它。

基于分析的结果,需要相对小的指令存储器和用于支持Lambda函数的执行的寄存器文件。增加并发性(多个Lambda函数的交错执行)的技术增加了寄存器文件的大小和复杂性;但是,基线设计可能具有少至16个条目。此外,如果还提供单一位谓词寄存器文件用于比较和条件移动操作,则2R1W寄存器文件应足以用于所有操作。

如下所述,将在收集引擎中执行Lambda不变加载,使得它们仅在每次调用Lambda函数时执行一次。这些加载返回的值将传递给处理元件,以便可以根据需要将它们读入Lambda数据路径的本地寄存器文件。

在一种实施方式中,在收集引擎和处理器元件(PE)(例如,如上所述的点积引擎)之间划分Lambda函数的执行以利用每个单元的不同能力。Lambda函数有三种类型的变量:常数、标量和向量。常数是其值可以在编译时确定的变量。标量变量对应于上面描述的Lambda不变加载,并且是其值在Lambda函数的调用之间变化但在给定Lambda函数操作的所有元素上保持不变的变量。向量变量是Lambda函数处理的数据数组,将函数中的指令应用于向量变量中的每个元素。

在一种实施方式中,Lambda函数由描述符数据结构指定,该描述符数据结构包含实现该函数的代码,该函数引用的任何常数以及指向其输入和输出变量的指针。为了执行Lambda函数,顶级控制器向一个或多个收集引擎发送命令,该命令指定Lambda函数的描述符以及收集引擎及其关联PE要处理的函数向量变量的部分的起始和结束索引。

当收集引擎接收到执行Lambda函数的命令时,它从存储器中提取函数的描述符并将该描述符传递给其关联的PE,直到它到达描述符的最后部分,该部分包含函数的标量变量的地址。然后,它从存储器中提取函数的每个标量变量,用其值替换描述符中每个变量的地址,并将修改后的描述符传递给PE。

当PE从其收集引擎接收到函数描述符的开始时,它将函数的向量输入的地址复制到控制寄存器中,并且PE的提取硬件开始将向量输入的页加载到PE的本地缓冲区中。然后,它解码实施Lambda函数的每个指令,并将结果存储在小的解码指令缓冲区中。然后,PE等待函数的标量变量的值从其收集引擎到达,并且等待函数的每个向量变量的第一页从存储器到达。一旦函数的变量到达,PE就开始将Lambda函数应用于其输入向量范围内的每个元素,依赖于PE的提取和回写硬件来提取输入数据的页并根据需要写回输出值的页。当PE到达其分配的数据范围的末尾时,它向顶级控制器发出信号,表明它已完成并准备开始另一个操作。

图100示出了根据一种实施方式的用于指定Lambda函数的描述符的格式。特别地,图100示出了存储器10001中的Lambda描述符格式和传递给PE 10002的Lambda格式描述符。除了指令之外,描述符中的所有字段都是64位值。指令是32位值,将两个指令打包为一个64位字。描述符被组织为使得标量变量最后出现,允许收集引擎在从存储器中提取标量变量之前将除标量变量之外的所有变量传递给PE。这使得PE可以解码函数的指令并在等待收集引擎提取标量变量时开始提取其向量变量。当Lambda函数分布在多个收集引擎/PE对上时,通过向量缓存提取Lambda函数的描述符和标量变量,以消除冗余DRAM访问。如图所示,存储器10001中的Lambda描述符格式可以包括在收集引擎提取传递给PE10002的Lambda描述符格式的标量变量10004的值时指向标量变量10003的指针。

在一种实施方式中,每个描述符的第一个字是报头,其指定描述符中每个字的含义。如图101所示,报头字的低六字节指定Lambda函数的向量变量的数量10101,常数变量的数量10102,向量和标量输出的数量10103-10104,函数中的指令的数量10105,以及函数中的标量变量的数量10106(排序以匹配描述符中每种类型的数据出现的位置)。报头字的第七个字节指定循环开始指令10107在函数代码内的位置(即,硬件应该在第一次之后开始每次迭代的指令)。字中的高位字节未使用10108。其余字包含函数指令,常数,输入和输出地址,按图中所示的排序。

不需要对收集引擎数据路径的改变来支持Lambda函数,因为可以通过修改控制逻辑来支持所有必要的操作。当收集引擎从存储器中提取Lambda描述符时,它会将描述符的行复制到向量元素行缓冲区和列描述符缓冲区两者中。不包含标量变量地址的描述符行将被未经修改地传递给PE,而那些包含标量变量地址的描述符行将保留在行缓冲区中,直到标量变量的值从存储器中提取并插入行缓冲区中代替它们的地址。现有的收集和挂起回复缓冲区硬件可以支持此操作而无需更改。

对处理元件的改变以支持Lambda函数

在一种实施方式中,为了支持Lambda函数,将单独的数据路径添加到PE,如图102所示,图102示出了上述矩阵值缓冲区9105、矩阵索引缓冲区9103和向量值缓冲区9104。虽然PE的缓冲区保持不变,但它们的名称已更改为输入缓冲区1、输入缓冲区2和输入缓冲区3,以反映其在当前实施方式中的更一般用途。SpMV数据路径9110也与基础架构保持不变。虽然可以将SpMV实现为Lambda函数,但构建专用硬件10201可降低功率并提高SpMV的性能。来自SpMV数据路径9110和Lambda数据路径10201的结果被发送到输出缓冲区10202并最终发送到系统存储器。

图103示出了Lambda数据路径的一种实施方式的细节,其包括谓词寄存器文件10301、寄存器文件10302、解码逻辑10303、解码指令缓冲区10305,并且以实现负载存储ISA的有序执行流水线10304为中心。如果单一问题执行流水线无法提供足够的性能,可以利用Lambda操作中固有的数据并行性并对执行流水线进行向量化以并行处理多个向量元素,这应该是比在各个Lambda函数中利用ILP更为节能的改善并行性的方法。执行流水线从16-32条目寄存器文件10302读取其输入并将结果写回16-32条目寄存器文件10302,每个寄存器64位。硬件不区分整数寄存器和浮点寄存器,任何寄存器都可以保存任何类型的数据。谓词寄存器文件10301保存比较操作的输出,其用于预测指令执行。在一种实施方式中,Lambda数据路径10304不支持分支指令,因此任何条件执行必须通过谓词指令来完成。

在每个Lambda函数的开始处,收集引擎将函数的指令放置在输入缓冲区3 9104(向量值缓冲区)中。然后,解码逻辑10303按顺序对每个指令进行解码,将结果放置在32条目解码指令缓冲区10305中。这节省了在loop1的每次迭代中重复解码每个指令的能量成本。

Lambda数据路径包含四个特殊控制寄存器10306。索引计数器寄存器保存Lambda数据路径当前正在处理的向量元素的索引,并且在Lambda的每次迭代结束时自动递增。最后一个索引寄存器保存预期PE要处理的最后一个向量元素的索引。循环开始寄存器保存Lambda函数的重复部分中第一个指令在解码指令缓冲区中的位置,而循环结束寄存器保存Lambda函数中最后一条指令的位置。

Lambda函数的执行以解码指令缓冲区中的第一个指令开始,并且继续进行直到流水线到达循环结束寄存器指向的指令。此时,流水线将索引计数器寄存器的值与最后一个索引寄存器的值进行比较,如果索引计数器小于最后一个索引,则将隐式分支返回到循环开始寄存器指向的指令。由于索引计数器寄存器仅在每次迭代结束时递增,因此可以提前完成此检查以避免流水线中的气泡。

该方案使得包括仅需要在Lambda函数的第一次迭代上执行的“前导”指令变得容易。例如,具有两个标量和一个常数输入的Lambda函数可能以三个加载指令开始,以将这些输入的值提取到寄存器文件中,并将循环开始寄存器设置为指向解码指令缓冲区中的第四个指令,以便只读取输入一次而不是在函数的每次迭代中都读取。

在一种实施方式中,Lambda数据路径执行类似于许多RISC处理器的加载存储ISA。Lambda数据路径加载和存储PE的SRAM缓冲区中的指令引用位置。SRAM缓冲区和DRAM之间的所有数据传输都由PE的提取和写回硬件管理。Lambda数据路径支持两种类型的加载指令:标量和元素。标量加载提取一个SRAM缓冲区中的指定位置的内容并将其放入寄存器中。预计Lambda函数中的大多数标量加载指令都将出现在函数的前导码中,尽管寄存器压力有时可能需要将标量负载放入循环体中。

元素加载提取Lambda函数的输入向量的元素。PE将为每个缓冲区保留一个计算指针,指针指向映射到该缓冲区的第一个输入向量的当前元素。元素加载指定目标缓冲区和从计算指针的偏移量。当执行元素指令时,硬件将指定的偏移量加到计算指针对相应缓冲区的大小进行模计算的值,并将该位置的数据加载到寄存器中。元素存储指令是类似的,但是将数据写入PE输出缓冲区10202中的适当地址。

该方法允许用PE的现有提取硬件支持多个输入和输出向量。输入向量按照Lambda函数描述符指定的顺序在输入缓冲区1 9105和2 9103之间交替,并且提取硬件一次将每个向量的整个页读入缓冲区。

作为示例,考虑具有三个输入向量A、B和C的函数。输入向量A将被映射到PE的输入缓冲区1 9105,偏移量为0。输入B将被映射到输入缓冲区2 9103,偏移量同样为0。输入C将被映射到输入缓冲区1 9105,偏移量为256(假设Tezzaron样式的256字节页)。PE的提取硬件将输入A和C的页交织到输入缓冲区1 9105中,而输入缓冲区2 9103将用输入B的页填充。Lambda函数的每次迭代将通过执行从缓冲区1 9105的偏移量为0的元素加载来提取输入A的适当元素,利用从缓冲区2 9103的偏移量为0的元素加载来提取输入B的适当元素,利用从缓冲区1 9105的偏移量为256的元素加载来提取其输入C的元素。在每次迭代结束时,硬件将递增计算指针以前进到每个输入向量的下一个元素。当计算指针到达页的末尾时,硬件将它递增(页大小*(映射到页的向量输入的数目-1))字节以使其前进到缓冲区的第一输入向量的下一页的第一个元素。类似的方案将用于处理生成多个输出向量的Lambda函数。

如图104所示,在一种实施方式中,8位专用于操作码10401。剩余的24位在单个目的地10402和3个输入操作数10403-10405之间划分,这导致6位寄存器指定符。由于控制流指令未在一种实施方式中使用,并且常数源自辅助寄存器文件,因此不需要位分配技巧来适合指令字中大的立即数。在一种实施方式中,所有指令都适合于图104中呈现的指令编码。图105中示出了一个特定指令集的编码。

在一种实施方式中,比较指令使用比较谓词。在图106的表中列出了示例性比较谓词的编码。

如上所述,在某些情况下,对于给定任务使用加速器是有利的。然而,可能存在不可行和/或不利的情况。例如,加速器不可用,数据移动到加速器导致过大的惩罚,加速器的速度小于处理器核心等。因此,在一些实施方式中,附加指令可以为某些任务提供性能和/或能量效率。

图109中示出了矩阵乘法的示例。矩阵乘法是C[rowsA,colsB]+=A[rowsA,comm]*B[comm,colsB]。如本文关于MADD(乘法加法指令)所使用的,通过设置colsB=1来定义矩阵*向量乘法指令。该指令采用矩阵输入A,向量输入B,并产生向量输出C。在512位向量的上下文中,rowsA=8用于双精度,16用于单精度。

大多数CPU通过在一维向量上操作的SIMD指令执行密集矩阵乘法。本文详述的是扩展SIMD方法以包括大小为8*4、8*8和更大的二维矩阵(区块)的指令(和底层硬件)。通过使用该指令,可以将小矩阵与向量相乘,并将结果添加到目的地向量。所有操作都在一条指令中执行,分摊通过大量乘法加法提取指令和数据的能量成本。另外,一些实施方式利用二叉树来执行求和(缩减)和/或包括嵌入到乘法器阵列中的寄存器文件以将输入矩阵保持为寄存器的集合。

关于矩阵乘法,MADD指令的实施例的执行计算:

for(i=0;i

for(k=0;k

C[i]+=A[i,k]*B[k];

通常,“A”操作数存储在八个打包数据寄存器中。“B”操作数可以存储在一个打包数据寄存器中或从存储器中读取。“C”操作数存储在一个打包数据寄存器中。

在该指令的全部剩余讨论中,讨论了“octoMADD”版本。该版本将8个打包数据元素源(例如,8个打包数据寄存器)与一个打包数据元素源(例如,单个寄存器)相乘。扩展内部循环为顺序实现提供如下执行(对于octoMADD指令):

for(i=0;i<8;i++)C[i]+=A[i,0]*B[0]+

A[i,1]*B[1]+

A[i,2]*B[2]+

A[i,3]*B[3]+

A[i,4]*B[4]+

A[i,5]*B[5]+

A[i,6]*B[6]+

A[i,7]*B[7];

如图所示,来自“A”和“B”操作数的相应打包数据元素位置的打包数据元素的每次乘法之后是加法。顺序相加分解为多个更简单的操作,只需最少的临时储存。

在一些实施方式中,使用二叉树方法。二叉树通过并行地对两个子树求和然后将结果加在一起来最小化延迟。将此递归地应用于整个二叉树。最终结果将加到“C”目的地操作数。

扩展内部循环为二进制实施方式提供如下执行(对于octoMADD指令):

for(i=0;i<8;i++)

C[i]+=((A[i,0]*B[0]+A[i,1]*B[1])+

(A[i,2]*B[2]+A[i,3]*B[3]))+

((A[i,4]*B[4]+A[i,5]*B[5])+

(A[i,6]*B[6]+A[i,7]*B[7]));

图110示出了具有二叉树缩减网络的octoMADD指令操作。该图显示操作的一个向量通路。对于512位向量,双精度octoMADD有8个通路,而单精度octoMADD有16个通路。

如图所示,多个乘法电路11001-11015分别执行A[i,0]*B[0]、A[i,1]*B[1]、A[i,2]*B[2]、A[i,3]*B[3]、A[i,4]*B[4]、A[i,5]*B[5]、A[i,6]*B[6]和A[i,7]*B[7]的乘法。在这个示例中,i是A寄存器。通常,乘法并行执行。

耦合到乘法电路11001-11015的是求和电路11017-11023,其将乘法电路11001-11015的结果相加。例如,求和电路执行A[i,0]*B[0]+A[i,1]*B[1]、A[i,2]*B[2]+A[i,3]*B[3]、A[i,4]*B[4]+A[i,5]*B[5]和A[i,6]*B[6]+A[i,7]*B[7]。通常,求和并行执行。

使用求和电路11025对初始求和的结果求和并将其加在一起。该加法的结果由求和电路11027加到来自目的地的原始(旧)值11031,以生成要存储在目的地中的新值11033。

在大多数实施方式中,指令不能指定八个独立源寄存器,加上用于另一个源的寄存器或存储器操作数以及寄存器目的地。因此,在某些情况下,octoMADD指令为矩阵操作数指定有限范围的八个寄存器。例如,octoMADD矩阵操作数可以是寄存器0-7。在一些实施例中,指定第一寄存器,并且到第一寄存器的连续寄存器是附加(例如,7个)寄存器。

图111示出了用以处理乘法加法指令的由处理器执行的方法的实施例。

在11101处,提取指令。例如,提取乘法加法指令。乘法加法指令包括操作码,用于第一打包数据操作数(存储器或寄存器)的字段,用于第二到第N打包数据源操作数的一个或多个字段,以及打包数据目的地操作数。在一些实施例中,乘法加法指令包括写掩码操作数。在一些实施例中,从指令缓存中提取指令。

在11103处解码所提取的指令。例如,由诸如本文详述的解码电路解码所提取的乘法加法指令。

在11105处取回与解码指令的源操作数相关联的数据值。为了避免在执行一系列乘法加法指令时需要从主寄存器文件反复读取这些值,这些寄存器的副本内置于乘法器-加法器阵列本身(如下所述)。副本保留为主寄存器文件的缓存。

在11107处,由诸如本文详述的执行电路(硬件)执行解码的指令,以针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该源操作数的该打包数据元素位置的数据元素与第一源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)对临时结果求和,3)将临时结果的总和加到打包数据目的地操作数的相应打包数据元素位置的数据元素,以及4)将临时结果与目的地的相应打包数据元素位置的数据元素的总和存储到打包数据目的地操作数的相应打包数据元素位置中。N通常由操作码或前缀表示。例如,对于octoMADD,N是9(这样A有8个寄存器)。乘法可以并行执行。

在一些实施例中,在11109处提交或退出指令。

图112示出了用以处理乘法加法指令的由处理器执行的方法的实施例。

在11201处,提取指令。例如,提取乘法加法指令。融合乘法加法指令包括操作码,用于第一打包数据操作数(存储器或寄存器)的字段,用于第二到第N打包数据源操作数的一个或多个字段,以及打包数据目的地操作数。在一些实施例中,融合乘法加法指令包括写掩码操作数。在一些实施例中,从指令缓存中提取指令。

在11203处解码所提取的指令。例如,由诸如本文详述的解码电路解码所提取的乘法加法指令。

在11205处取回与解码指令的源操作数相关联的数据值。为了避免在执行一系列乘法加法指令时需要从主寄存器文件反复读取这些值,这些寄存器的副本内置于乘法器-加法器阵列本身中(如下所述)。副本被保留作为主寄存器文件的缓存。

在11207处,由诸如本文详述的执行电路(硬件)执行经解码的指令,以针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该源操作数的该打包数据元素位置的数据元素与第一源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)成对地对临时结果求和,3)将临时结果的总和加到打包数据目的地操作数的相应打包数据元素位置的数据元素,以及4)将临时结果与目的地的相应打包数据元素位置的数据元素的总和存储到打包数据目的地操作数的相应打包数据元素位置中。N通常由操作码或前缀表示。例如,对于octoMADD,N是9(这样A有8个寄存器)。乘法可以并行执行。

在一些实施例中,在11209处提交或退出指令。

在一些实施方式中,当首次遇到MADD指令时,重命名器通过注入微操作以将主寄存器复制到缓存中,来使缓存的副本与主寄存器文件同步。后续MADD指令继续使用缓存的副本,只要它们保持不变即可。一些实施方式预期octomadd指令使用有限范围的寄存器,并且在产生寄存器值时广播到主寄存器文件和缓存的副本两者的写入。

图113(A)-(C)示出了用于执行MADD指令的示例性硬件。图113(A)示出了执行MADD指令的部件。图113(B)示出了这些部件的子集。具体地,多个乘法电路11323用于将源寄存器的打包数据元素与耦合到求和电路11327的每个乘法电路11323相乘。每个求和电路以链方式馈送求和电路11327。选择器11321用于在外部输入或求和电路的反馈之间进行选择。寄存器文件作为寄存器文件和读取多路复用器11325的一部分嵌入在乘法-加法器阵列中。特定寄存器硬连线到乘法器-加法器的每列。

图113(C)示出了寄存器文件和读取多路复用器11325。寄存器文件11327是多个寄存器,用于存储A作为缓存(例如,4或8个寄存器)。使用读取多路复用器11329选择正确的寄存器。

octomadd指令的预期使用如下:

内循环包含24个octomadd指令。每个指令从存储器读取一个“B”操作数并且加到24个“C”累加器之一。中间循环加载具有新区块的8个“A”寄存器。外循环加载并存储24个“C”累加器。可以展开内循环并添加预取以实现octomadd硬件的高利用率(>90%)。

下面的附图详述了用于实现上述实施例的示例性架构和系统。特别地,说明了上面讨论的核心类型(诸如乱序、标量、SIMD)的各方面(例如,寄存器、流水线等)。另外,示出了系统和片上系统实施方式,包括协处理器(例如,加速器、核心)。在一些实施例中,如下所述地模拟上述一个或多个硬件部件和/或指令,或者将其实现为软件模块。

图125是根据本发明一个实施例的寄存器架构12500的框图。在所示的实施例中,存在512位宽的32个向量寄存器12510;这些寄存器引用为zmm0到zmm31。低16个zmm寄存器的低阶256位覆盖在寄存器ymm0-16上。低16个zmm寄存器的低阶128位(ymm寄存器的低阶128位)覆盖在寄存器xmm0-15上。特定向量友好指令格式QAC00对这些覆盖的寄存器文件进行操作,如下表所示。

即,向量长度字段QAB59B在最大长度和一个或多个其他较短长度之间进行选择,其中每个这样的较短长度是前一长度的一半长度;没有向量长度字段QAB59B的指令模板对最大向量长度操作。此外,在一个实施例中,特定向量友好指令格式QAC00的B类指令模板对打包或标量单/双精度浮点数据和打包或标量整数数据进行操作。标量操作是对zmm/ymm/xmm寄存器中的最低阶数据元素位置执行的操作;根据实施例,高阶数据元素位置保持与指令之前相同或归零。

写掩码寄存器12515-在所示实施例中,存在8个写掩码寄存器(k0到k7),各自大小为64位。在替换实施例中,写掩码寄存器12515的大小为16位。如前所述,在本发明的一个实施例中,向量掩码寄存器k0不能用作写掩码;当通常表示k0的编码用于写掩码时,它选择0xFFFF的硬连线写掩码,有效地禁用该指令的写掩码。

通用寄存器12525-在所示实施例中,有16个64位通用寄存器,它们与现有的x86寻址模式一起用于寻址存储器操作数。这些寄存器由名称RAX,RBX,RCX,RDX,RBP,RSI,RDI,RSP和R8至R15引用。

标量浮点堆栈寄存器文件(x87堆栈)12545,其上混叠有MMX打包整数平坦寄存器文件12550-在所示实施例中,x87堆栈是用于使用x87指令集扩展对32/64/80位浮点数据执行标量浮点运算的八元素堆栈;而MMX寄存器用于对64位打包整数数据执行操作,以及保持用于MMX和XMM寄存器之间执行的某些操作的操作数。

本发明的替代实施例可以使用更宽或更窄的寄存器。另外,本发明的备选实施例可以使用更多、更少或不同的寄存器文件和寄存器。

处理器核可以以不同的方式实现,可以被实现用于不同的目的,并且可以在不同的处理器中实现。例如,这种核的实现方式可以包括:1)用于通用计算的通用有序核;2)用于通用计算的高性能通用乱序核;3)主要用于图形和/或科学(吞吐量)计算的专用核。不同处理器的实现方式可以包括:1)CPU,其包括旨在用于通用计算的一个或多个通用有序核和/或用于通用计算的一个或多个通用乱序核;2)协处理器,包括主要用于图形和/或科学(吞吐量)的一个或多个专用核。这种不同的处理器导致不同的计算机系统架构,其可以包括:1)在与CPU不同的芯片上的协处理器;2)在与CPU相同的封装中的单独管芯(die)上的协处理器;3)在与CPU相同的管芯上的协处理器(在这种情况下,这种协处理器有时被称为专用逻辑(例如,集成图形和/或科学(吞吐量)逻辑)或被称为专用核);4)片上系统,其可以在同一管芯上包括所描述的CPU(有时被称为(一个或多个)应用核或(一个或多个)应用处理器)、以上描述的协处理器、和附加功能。接下来描述示例性核架构,之后描述示例性处理器和计算机架构。

有序和乱序的核框图

图126A是示出根据本发明的实施例的示例性有序流水线和示例性寄存器重命名、乱序发布/执行流水线两者的框图。图126B是示出根据本发明的实施例的要被包括在处理器中的有序架构核和示例性寄存器重命名、乱序发布/执行架构核两者的示例性实施例的框图。图126A-B中的实线框示出了有序流水线和有序核,而可选择添加的虚线框示出了寄存器重命名、乱序发布/执行流水线和核。假定有序方面是乱序方面的子集,将描述乱序方面。

在图126A中,处理器流水线12600包括提取(fetch)阶段12602、长度解码阶段12604、解码阶段12606、分配阶段12608、重命名阶段12610、调度(也被称为调派或发布)阶段12612、寄存器读取/存储器读取阶段12614、执行阶段12616、写回/存储器写入阶段12618、异常处理阶段12622、和提交阶段(commit stage)12624。

图126B示出了处理器核12690,其包括耦合到执行引擎单元12650的前端单元12630,并且执行引擎单元12650和前端单元12630两者都耦合到存储器单元12670。核12690可以是精简指令集计算(RISC)核、复杂指令集计算(CISC)核、超长指令字(VLIW)核、或混合或替代的核类型。作为另一种选择,核12690可以是专用核,例如,网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(GPGPU)核、图形核等。

前端单元12630包括耦合到指令缓存单元12634的分支预测单元12632,指令缓存单元12634耦合到指令转换后备缓冲器(TLB)12636,指令转换后备缓冲器12636耦合到指令提取单元12638,指令提取单元12638耦合到解码单元12640。解码单元12640(或解码器)可以解码指令,并且生成作为输出的一个或多个微操作、微代码入口点、微指令、其他指令、或其他控制信号,它们解码自原始指令或以其他方式反映原始指令或导出自原始指令。可以使用各种不同的机制来实现解码单元12640。合适机制的示例包括但不限于查找表、硬件实现方式、可编程逻辑阵列(PLA)、微代码只读存储器(ROM)等。在一个实施例中,核12690包括微代码ROM或存储用于某些宏指令的微代码的其他介质(例如,在解码单元12640中或在前端单元12630内)。解码单元12640耦合到执行引擎单元12650中的重命名/分配器单元12652。

执行引擎单元12650包括重命名/分配器单元12652,其耦合到引退(retirement)单元12654和一组一个或多个调度器单元12656。(一个或多个)调度器单元12656表示任意数目的不同调度器,包括,预留站(reservations station)、中央指令窗等。(一个或多个)调度器单元12656耦合到(一个或多个)物理寄存器文件单元12658。每个物理寄存器文件单元12658表示一个或多个物理寄存器文件,这些物理寄存器文件中的不同的物理寄存器文件存储一个或多个不同的数据类型,例如,标量整数、标量浮点、打包整数、打包浮点、向量整数、向量浮点、状态(例如,作为要执行的下一指令的地址的指令指针)等。在一个实施例中,物理寄存器文件单元12658包括向量寄存器单元、写入掩码寄存器单元、和标量寄存器单元。这些寄存器单元可以提供架构向量寄存器、向量掩码寄存器、和通用寄存器。(一个或多个)物理寄存器文件单元12658与引退单元12654重叠,以说明寄存器重命名和乱序执行可以被实现的各种方式(例如,使用(一个或多个)重新排序缓冲器和(一个或多个)引退寄存器文件;使用(一个或多个)未来文件、(一个或多个)历史缓冲器、和(一个或多个)引退寄存器文件;使用寄存器图和寄存器池;等等)。引退单元12654和(一个或多个)物理寄存器文件单元12658耦合到(一个或多个)执行集群12660。(一个或多个)执行集群12660包括一组一个或多个执行单元12662和一组一个或多个存储器访问单元12664。执行单元12662可以对各种类型的数据(例如,标量浮点、打包整数、打包浮点、向量整数、向量浮点)执行各种操作(例如,移位、加法、减法、乘法)。虽然一些实施例可以包括专用于特定功能或功能集的多个执行单元,但是其他实施例可以仅包括一个执行单元或者全部执行所有功能的多个执行单元。(一个或多个)调度器单元12656、(一个或多个)物理寄存器文件单元12658、和(一个或多个)执行集群12660被示为可能是多个,因为某些实施例针对某些类型的数据/操作创建单独的流水线(例如,标量整数流水线、标量浮点/打包整数/打包浮点/向量整数/向量浮点流水线、和/或存储器访问流水线,其中每个流水线都有自己的调度器单元、物理寄存器文件单元、和/或执行集群-并且在单独的存储器访问流水线的情况下,其中仅该流水线的执行集群具有(一个或多个)存储器访问单元12664的某些实施例被实现)。还应理解,在使用单独的流水线的情况下,这些流水线中的一个或多个可以是乱序发布/执行而其余的是有序发布/执行的。

该组存储器访问单元12664耦合到存储器单元12670,存储器单元12670包括耦合到数据缓存单元12674的数据TLB单元12672,其中数据缓存单元12674耦合到2级(L2)缓存单元12676。在一个示例性实施例中,存储器访问单元12664可以包括加载单元、存储地址单元、和存储数据单元,其中的每个单元耦合到存储器单元12670中的数据TLB单元12672。指令缓存单元12634还耦合到存储器单元12670中的2级(L2)缓存单元12676。L2缓存单元12676耦合到一个或多个其他级别的缓存并最终耦合到主存储器。

作为示例,示例性寄存器重命名的乱序发布/执行核架构可以按如下方式实现流水线12600:1)指令提取12638执行提取和长度解码阶段12602和12604;2)解码单元12640执行解码阶段12606;3)重命名/分配器单元12652执行分配阶段12608和重命名阶段12610;4)(一个或多个)调度器单元12656执行调度阶段12612;5)(一个或多个)物理寄存器文件单元12658和存储器单元12670执行寄存器读取/存储器读取阶段12614;执行集群12660执行执行阶段12616;6)存储器单元12670和(一个或多个)物理寄存器文件单元12658执行写回/存储器写入阶段12618;7)异常处理阶段12622中可能涉及各个单元;8)引退单元12654和(一个或多个)物理寄存器文件单元12658执行提交阶段12624。

核12690可以支持一个或多个指令集(例如,x86指令集(具有已经添加有较新版本的一些扩展);美国加利福尼亚州桑尼维尔市的MIP Technologies的MIPS指令集;美国加利福尼亚州桑尼维尔市的ARM Holdings的ARM指令集(具有可选的附加扩展,例如,NEON)),包括本文所描述的(一个或多个)指令。在一个实施例中,核12690包括支持打包数据指令集扩展(例如,AVX1、AVX2)的逻辑,从而允许要使用打包数据来执行的许多多媒体应用所使用的操作。

应理解,核可以支持多线程(执行两个或更多个并行的操作集或线程集),并且可以以各种方式这样做,这些方式包括时间分片多线程、同时多线程(其中,单个物理核为该物理核正在同时进行多线程的每个线程提供逻辑核)、或它们的组合(例如,时间分片的提取和解码以及此后同时的多线程,例如,在

虽然在乱序执行的上下文中描述了寄存器重命名,但应理解,寄存器重命名可以用在有序架构中。虽然所示处理器的实施例还包括单独的指令和数据缓存单元12634/12674以及共享的L2缓存单元12676,但替代实施例可以具有用于指令和数据两者的单个内部缓存,例如,1级(L1)内部缓存、或多级内部缓存。在一些实施例中,系统可以包括内部缓存和外部缓存的组合,其中外部缓存在核和/或处理器外部。替代地,全部缓存可以在核和/或处理器外部。

图127A-B示出了更具体的示例性有序核架构的框图,其中核将是芯片中的若干逻辑块(可能包括相同类型和/或不同类型的其他核)中的一个逻辑块。逻辑块通过高带宽互连网络(例如,环形网络)与某固定功能逻辑、存储器I/O接口、和其他必要的I/O逻辑通信,这取决于应用。

图127A是根据本发明实施例的单个处理器核以及其与管芯上互连网络12702的连接以及其在2级(L2)缓存12704的本地子集的框图。在一个实施例中,指令解码器12700支持具有打包数据指令集扩展的x86指令集。L1缓存12706允许低等待时间的访问以将存储器缓存到标量和向量单元中。虽然在一个实施例中(为了简化设计),标量单元12708和向量单元12710使用单独的寄存器组(分别为标量寄存器12712和向量寄存器12714),并且它们之间传输的数据被写入到存储器然后从1级(L1)缓存12706中读回,但是本发明的替代实施例可以使用不同的方法(例如,使用单个寄存器组或包括允许数据在两个寄存器文件(file)之间传输而不被写入和读回的通信路径)。

L2缓存的本地子集12704是全局L2缓存的一部分,全局L2缓存被划分为分开的本地子集,每个处理器核一个本地子集。每个处理器核具有到其自己的L2缓存的本地子集12704的直接访问路径。由处理器核读取的数据被存储在其L2缓存子集12704中并且可以与访问它们自己的本地L2缓存子集的其他处理器核并行地被快速访问。由处理器核写入的数据被存储在其自己的L2缓存子集12704中,并且在需要的情况下被从其他子集冲刷(flushed)。环形网络确保共享数据的一致性。环形网络是双向的,以允许诸如处理器核、L2缓存、和其他逻辑块之类的代理在芯片内彼此通信。每个环形数据路径在每个方向上为1012位宽。

图127B是根据本发明实施例的图127A中的处理器核的一部分的展开图。图127B包括L1缓存12706的L1数据缓存12706A部分,以及关于向量单元12710和向量寄存器12714的更多细节。具体地,向量单元12710是16宽的向量处理单元(VPU)(参见16宽的ALU 12728),它执行整数、单精度浮点、和双精度浮点指令中的一个或多个。VPU支持通过调配单元12720对寄存器输入进行调配,使用数字转换单元12722A-B进行数字转换,以及使用复制单元12724对存储器输入进行复制。写入掩码寄存器12726允许预测得到向量写入。

图128是根据本发明实施例的可具有不止一个核、可具有集成存储器控制器、且可具有集成图形的处理器12800的框图。图128中的实线框示出了具有单核12802A、系统代理12810、和一组一个或多个总线控制器单元12816的处理器12800;但虚线框的可选添加示出了具有以下各项的替代处理器12800:多个核12802A-N、系统代理单元12810中的一组一个或多个集成存储器控制器单元12814、以及专用逻辑12808。

因此,处理器12800的不同实现方式可以包括:1)具有专用逻辑12808的CPU(其中专用逻辑是集成图形和/或科学(吞吐量)逻辑(其可以包括一个或多个核)),以及核12802A-N(其是一个或多个通用核(例如,通用有序核、通用乱序核、或两者的组合);2)具有核12802A-N的协处理器(其中核12802A-N是主要用于图形和/或科学(吞吐量)的大量专用核);3)具有核12802A-N的协处理器(其中核12802A-N是大量通用有序核)。因此,处理器12800可以是通用处理器、协处理器、或专用处理器,例如,网络或通信处理器、压缩引擎、图形处理器、GPGPU(通用图形处理单元)、高吞吐量的许多集成核(MIC)协处理器(包括30个或更多个核)、嵌入式处理器等等。处理器可以在一个或多个芯片上实现。处理器12800可以是一个或多个衬底的一部分和/或可以通过使用多种工艺技术(例如,BiCMOS、CMOS或NMOS)中的任何一种来在一个或多个衬底上实现。

存储器层级包括核内的一个或多个级别的缓存、一组或一个或多个共享缓存单元12806、以及耦合到该组集成存储器控制器单元12814的外部存储器(未示出)。该组共享缓存单元12806可以包括一个或多个中级缓存(例如,2级(L2)、3级(L3)、4级(L4)),或其他级别的缓存、最后级别缓存(LLC)、和/它们的组合。虽然在一个实施例中,基于环的互连单元12812对集成图形逻辑12808(集成图形逻辑12808是专用逻辑的示例并且在本文中也被称为专用逻辑)、该组共享缓存单元12806、以及系统代理单元12810/(一个或多个)集成存储器控制器单元12814进行互连,但替代实施例可以使用任何数目的众所周知的技术来互连这些单元。在一个实施例中,在一个或多个缓存单元12806和核12802A-N之间维持一致性。

在一些实施例中,核12802A-N中的一个或多个核能够进行多线程。系统代理12810包括协调和操作核12802A-N的那些组件。系统代理单元12810可以包括例如电源控制单元(PCU)和显示单元。PCU可以是或可以包括调节核12802A-N和集成图形逻辑12808的功率状态所需的逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。

核12802A-N在架构指令集方面可以是同构的或异构的;也就是说,核12802A-N中的两个或更多个核可能能够执行相同的指令集,而其他核可能能够执行仅该指令集的子集或不同的指令集。

图129-132是示例性计算机架构的框图。用于膝上型计算机、台式计算机、手持式PC、个人数字助理、工程工作站、服务器、网络设备、网络集线器、交换机、嵌入式处理器、数字信号处理器(DSP)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持设备、和各种其他电子设备的本领域已知的其他系统设计和配置也是适合的。通常,能够结合本文所公开的处理器和/或其他执行逻辑的各种各样的系统或电子设备通常是合适的。

现在参考图129,示出了根据本发明的一个实施例的系统12900的框图。系统12900可以包括一个或多个处理器12910、12915,其耦合到控制器集线器12920。在一个实施例中,控制器集线器12920包括图形存储器控制器集线器(GMCH)12990和输入/输出集线器(IOH)12950(可以在分开的芯片上);GMCH 12990包括耦合到存储器12940和协处理器12945的存储器和图形控制器;IOH 12950将输入/输出(I/O)设备12960耦合到GMCH 12990。替代地,存储器和图形控制器中的一个或两个被集成在处理器内(如本文所描述的),存储器12940和协处理器12945直接耦合到处理器12910,以及包括IOH 12950的单个芯片中的控制器集线器12920。

图129中用虚线表示附加处理器12915的可选性质。每个处理器12910、12915可以包括本文所描述的处理核中的一个或多个,并且可以是处理器12800的某个版本。

存储器12940可以是例如动态随机存取存储器(DRAM)、相变存储器(PCM)、或这两者的组合。对于至少一个实施例,控制器集线器12920经由多点总线(multi-drop bus)与(一个或多个)处理器12910、12915通信,该多点总线例如是前端总线(FSB)、诸如QuickPath互连(QPI)之类的点对点接口、或类似的连接12995。

在一个实施例中,协处理器12945是专用处理器,例如,高吞吐量MIC处理器、网络或通信处理器、压缩引擎、图形处理器、GPGPU、嵌入式处理器等。在一个实施例中,控制器集线器12920可以包括集成图形加速器。

在物理资源12910、12915之间在包括架构特性、微架构特性、热特性、功耗特性等的指标度量的范围方面可存在各种差异。

在一个实施例中,处理器12910执行控制一般类型的数据处理操作的指令。嵌入在指令内的可以是协处理器指令。处理器12910将这些协处理器指令识别为应该由所附接的协处理器12945执行的类型。因此,处理器12910将这些协处理器指令(或表示协处理器指令的控制信号)发布到协处理器总线或其它互连上,以到协处理器12945。(一个或多个)协处理器12945接受并执行所接收的协处理器指令。

现在参考图130,示出了根据本发明的实施例的第一更具体的示例性系统13000的框图。如图130所示,多处理器系统13000是点对点互连系统,并且包括经由点对点互连13050耦合的第一处理器13070和第二处理器13080。处理器13070和13080中的每一个处理器可以是处理器12800的某个版本。在本发明的一个实施例中,处理器13070和13080分别是处理器12910和12915,而协处理器13038是协处理器12945。在另一个实施例中,处理器13070和13080分别是处理器12910和协处理器12945。

处理器13070和13080被示出为分别包括集成存储器控制器(IMC)单元13072和13082。处理器13070还包括作为其总线控制器单元的一部分的点对点(P-P)接口13076和13078;类似地,第二处理器13080包括P-P接口13086和13088。处理器13070、13080可以使用P-P接口电路13078、13088经由点对点(P-P)接口13050来交换信息。如图130所示,IMC13072和13082将处理器耦合到相应的存储器(即,存储器13032和存储器13034),这些存储器可以是本地附接到相应处理器的主存储器的一部分。

处理器13070、13080可以各自使用点对点接口电路13076、13094、13086、13098经由各个P-P接口13052、13054来与芯片集13090交换信息。芯片集13090可以可选地经由高性能接口13039来与协处理器13038交换信息。在一个实施例中,协处理器13038是专用处理器,例如,高吞吐量MIC处理器、网络或通信处理器、压缩和/或解压缩引擎、图形处理器、GPGPU、嵌入式处理器等。

共享缓存(未示出)可以被包括在任一处理器中,或者在两个处理器外部但经由P-P互连与处理器连接,使得在处理器进入低功率模式的情况下,任一或两个处理器的本地缓存信息可以被存储在共享缓存中。

芯片集13090可以经由接口13096耦合到第一总线13016。在一个实施例中,第一总线13016可以是外围组件互连(PCI)总线,或诸如PCI Express总线或另一第三代I/O互连总线之类的总线,但本公开的范围不限于此。

如图130所示,各种I/O设备13014可以耦合到第一总线13016,以及将第一总线13016耦合到第二总线13020的总线桥13018。在一个实施例中,一个或多个附加处理器13015(例如,协处理器、高吞吐量MIC处理器、GPGPU、加速器(例如,图形加速器或数字信号处理(DSP)单元)、现场可编程门阵列、或任何其他处理器)耦合到第一总线13016。在一个实施例中,第二总线13020可以是低引脚数(LPC)总线。在一个实施例中,各种设备可以耦合到第二总线13020,包括,例如键盘和/或鼠标13022、通信设备13027、和诸如磁盘驱动器或其他大容量存储设备之类的储存装置13028(其可以包括指令/代码和数据13030)。此外,音频I/O 13024可以耦合到第二总线13020。注意,可能有其他架构。例如,代替图130的点对点架构,系统可以实现多点(multi-drop)总线或其他这样的架构。

现在参考图131,示出了根据本发明的实施例的第二更具体的示例性系统13100的框图。图130和131中的相似的元件具有相似的附图标记,并且图130中的某些方面已从图131中省略,以避免模糊图131的其他方面。

图131示出了处理器13070、13080可以分别包括集成存储器和I/O控制逻辑(“CL”)13072和13082。因此,CL 13072、13082包括集成存储器控制器单元并包括I/O控制逻辑。图131示出了不仅存储器13032、13034耦合到CL 13072、13082,而且I/O设备13114也耦合到控制逻辑13072、13082。传统(legacy)I/O设备13115耦合到芯片集13090。

现在参考图132,示出了根据本发明的实施例的SoC 13200的框图。图128中的相似的元件具有相似的附图标记。此外,虚线框是更高级SoC上的可选功能。在图132中,(一个或多个)互连单元13202耦合到以下各项:应用处理器13210,其包括一组一个或多个核12802A-N(包括缓存单元12804A-N)和(一个或多个)共享缓存单元12806;系统代理单元12810;(一个或多个)总线控制器单元12816;(一个或多个)集成存储器控制器单元12814;一组或一个或多个协处理器13220,其可以包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机存取存储器(SRAM)单元13230;直接存储器存取(DMA)单元13232;以及显示单元13240,用于耦合到一个或多个外部显示器。在一个实施例中,(一个或多个)协处理器13220包括专用处理器,例如,网络或通信处理器、压缩引擎、GPGPU、高吞吐量MIC处理器、嵌入式处理器等。

本文公开的机制的实施例可以以硬件、软件、固件或这些实现方法的组合来实现。本发明的实施例可以实现为在可编程系统上执行的计算机程序或程序代码,该可编程系统包括至少一个处理器,储存系统(包括易失性和非易失性存储器和/或储存元件),至少一个输入设备及至少一个输出设备。

程序代码(例如图130中所示的代码13030)可以应用于输入指令以执行本文描述的功能并生成输出信息。输出信息可以以已知的方式应用于一个或多个输出设备。对于本申请,处理系统包括具有处理器的任何系统,例如,数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或微处理器。

程序代码可以以高级过程或面向对象的编程语言实现,以与处理系统通信。如果需要,程序代码也可以用汇编语言或机器语言实现。实际上,本文描述的机制不限于任何特定编程语言的范围。在任何情况下,该语言可以是经编译或解析的语言。

至少一个实施例的一个或多个方面可以通过存储在机器可读介质上的代表性指令来实现,该代表性指令表示处理器内的各种逻辑,当由机器读取时使得机器构造逻辑以执行本文所描述的技术。这种称为“IP核”的表示可以存储在有形机器可读介质上,并提供给各种客户或制造设施,以加载到实际制造逻辑或处理器的制造机器中。

这样的机器可读储存介质可以包括但不限于由机器或设备制造或形成的物品的非暂态有形布置,包括诸如硬盘之类的储存介质,任何其他类型的盘,包括软盘、光盘、光盘只读存储器(CD-ROM)、光盘可擦写(CD-RW)和磁光盘、半导体设备(如只读存储器(ROM))、随机存取存储器(RAM)(如动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM))、可擦除可编程只读存储器(EPROM)、闪存、电可擦除可编程只读存储器(EEPROM)、相变存储器(PCM)、磁卡或光学卡或适用于存储电子指令的任何其他类型的介质。

因此,本发明的实施例还包括非暂时性实体机器可读介质,其包含指令或包含设计数据,例如硬件描述语言(HDL),其定义本文描述的结构、电路、装置、处理器和/或系统特征。这些实施例也可以被称为程序产品。

在一些情况下,指令转换器可用于将指令从源指令集转换为目标指令集。例如,指令转换器可以转换(例如,使用静态二进制转换,包括动态编译的动态二进制转换)、变形、仿真或以其他方式将指令转换为要由核处理的一个或多个其他指令。指令转换器可以用软件、硬件、固件或其组合来实现。指令转换器可以在处理器上、处理器外或者部分在处理器上、部分在处理器外。

图133是根据本发明实施例的对照使用软件指令转换器将源指令集中的二进制指令转换为目标指令集中的二进制指令的框图。在所示实施例中,指令转换器是软件指令转换器,但替代地,指令转换器可以用软件、固件、硬件、或其各种组合来实现。图133示出了采用高级语言13302的程序可以使用x86编译器13304来编译以生成x86二进制代码13306,其可以由具有至少一个x86指令集核的处理器13316本地执行。具有至少一个x86指令集核的处理器13316表示可以通过进行以下操作来执行与具有至少一个x86指令集核的Intel处理器基本上相同的功能,从而实现与具有至少一个x86指令集核的Intel处理器基本上相同的结果的任何处理器:兼容地执行或以其他方式处理(1)Intel x86指令集核的指令集的大部分或者(2)目标为在具有至少一个x86指令集核的Intel处理器上运行的应用或其他软件的目标代码版本。x86编译器13304表示可操作以生成x86二进制代码13306(例如,目标代码)的编译器,其中二进制代码可以在具有或不具有附加链接处理的情况下在具有至少一个x86指令集核的处理器13316上被执行。类似地,图133示出了采用高级语言13302的程序可以使用替代指令集编译器13308来编译以生成替代指令集二进制代码13310,该二进制代码可以由没有至少一个x86指令集核的处理器13314(例如,具有执行美国加利福尼亚州桑尼维尔市的MIPS Technologies的MIPS指令集和/或执行美国加利福尼亚州桑尼维尔市的ARMHoldings的ARM指令集的核的处理器)本地执行。指令转换器13312用于将x86二进制代码13306转换为可由不具有x86指令集核的处理器13314本地执行的代码。该转换后的代码不太可能与替代指令集二进制代码13310相同,因为很难制造出能够实现它的指令转换器;但是,转换后的代码将完成一般操作,并由来自替代指令集的指令组成。因此,指令转换器13312表示通过仿真、模拟、或任何其他过程来允许不具有x86指令集处理器或核的处理器或其他电子设备执行x86二进制代码13306的软件、固件、硬件、或其组合。

以下详述示例性实施方式,实施例以及特征和方面的特定组合。这些示例是指导性的,而不是限制性的。

示例1.一种系统,包括:多个异构处理元件;硬件异构调度器,用于分派用于在多个异构处理元件中的一个或多个上执行的指令,该指令对应于将由多个异构处理元件中的一个或多个处理的代码片段,使得指令对于多个异构处理元件中的一个或多个中的至少一个是本机指令。

示例2:示例1的系统,使得多个异构处理元件包括有序处理器核心、乱序处理器核心和打包数据处理器核心。

示例3:示例2的系统,使得多个异构处理元件还包括加速器。

示例4:示例1-3中任一示例的系统,使得硬件异构调度器还包括:程序阶段检测器,用于检测代码片段的程序阶段;使得多个异构处理元件包括具有第一微架构的第一处理元件和具有不同于第一微架构的第二微架构的第二处理元件;使得程序阶段是包括第一阶段和第二阶段的多个程序阶段之一,并且指令的分派部分地基于检测到的程序阶段;并且,使得与第二处理元件对代码片段的处理相比,第一处理元件对代码片段的处理产生改进的每瓦特性能特征。

示例5:示例1-4中任一示例的系统,使得硬件异构调度器还包括:选择器,用于选择多个处理元件的一种类型的处理元件以执行所接收的代码片段,并通过分派在所选类型的处理元件中的处理元件上调度代码片段。

示例6:示例1的系统,使得代码片段是与软件线程相关联的一个或多个指令。

示例7:示例5-6中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例8:示例5-7中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是用于支持密集算术基元的电路。

示例9:示例5-7中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是加速器。

示例10:示例5-9中任一示例的系统,使得数据并行程序阶段包括使用相同控制流同时处理的数据元素。

示例11:示例5-10中任一示例的系统,使得对于线程并行程序阶段,所选类型的处理元件是标量处理核心。

示例12:示例5-11中任一示例的系统,使得线程并行程序阶段包括使用独特控制流的数据依赖分支。

示例13:示例2-12中任一示例的系统,使得对于串行程序阶段,所选类型的处理元件是乱序核心。

示例14:示例2-13中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例15:示例1-14中任一示例的系统,使得硬件异构调度器支持多种代码类型,包括编译代码、内在函数、汇编代码、库、中间代码、卸载代码和设备代码。

示例16:示例5-15中任一示例的系统,使得硬件异构调度器在所选类型的处理元件不能本地处理代码片段时模拟功能。

示例17:示例1-15中任一示例的系统,使得硬件异构调度器在可用的硬件线程的数目被超额认订时模拟功能。

示例18:示例5-15中任一示例的系统,使得硬件异构调度器在所选类型的处理元件不能本地处理代码片段时模拟功能。

示例19:示例5-18中任一示例的系统,使得关于多个异构处理元件中的一种类型的处理元件的选择对于用户是透明的。

示例20:示例5-19中任一示例的系统,使得关于多个异构处理元件中的一种类型的处理元件的选择对于操作系统是透明的。

示例21:示例1-20中任一示例的系统,使得硬件异构调度器用于呈现同构多处理器编程模型,以使每个线程对于程序员看起来如同它在标量核心上执行。

示例22:示例21的系统,使得所呈现的同构多处理器编程模型呈现支持完整指令集的外观。

示例23:示例1-22中任一示例的系统,使得多个异构处理元件共享存储器地址空间。

示例24:示例1-23中任一示例的系统,使得硬件异构调度器包括要在异构处理元件之一上执行的二进制转换器。

示例25:示例5-24中任一示例的系统,使得多个异构处理元件中的一种类型的处理元件的默认选择是延迟优化的核心。

示例26:示例1-25中任一示例的系统,使得异构硬件调度器选择在多协议总线接口上用于所分派的指令的协议。

示例27:示例26中任一示例的系统,使得由多协议总线接口支持的第一协议包括用于访问系统存储器地址空间的存储器接口协议。

示例28:示例26-27中任一示例的系统,使得由多协议总线接口支持的第二协议包括缓存一致性协议,以维持存储在加速器的本地存储器中的数据与包括主机缓存层级结构和系统存储器的主机处理器的存储器子系统中的数据之间的一致性。

示例29:示例26-28中任一示例的系统,使得由多协议总线接口支持的第三协议包括支持设备发现、寄存器访问、配置、初始化、中断、直接存储器访问和地址转换服务的串行链路协议。

示例30:示例29的系统,使得第三协议包括外围部件接口快速(PCIe)协议。

示例31:一种系统,包括:包括加速器的异构处理器中的多个异构处理元件;存储器,用于存储程序代码,该程序代码可由异构处理器中的多个异构处理元件中的至少一个执行,该程序代码包括:异构调度器,用于分派用于在多个异构处理元件中的一个或多个上执行的指令,该指令对应于将由多个异构处理元件中的一个或多个处理的代码片段,使得指令对于多个异构处理元件中的一个或多个中的至少一个是本机指令。

示例32:示例31的系统,使得多个异构处理元件包括有序处理器核心、乱序处理器核心和打包数据处理器核心。

示例33:示例32的系统,使得多个异构处理元件还包括加速器。

示例34:示例31-33中任一示例的系统,使得异构调度器还包括:程序阶段检测器,用于检测代码片段的程序阶段;使得多个异构处理元件包括具有第一微架构的第一处理元件和具有不同于第一微架构的第二微架构的第二处理元件;使得程序阶段是包括第一阶段和第二阶段的多个程序阶段之一,并且指令的分派部分地基于检测到的程序阶段;并且,使得与第二处理元件对代码片段的处理相比,第一处理元件对代码片段的处理产生改进的每瓦特性能特征。

示例35:示例31-34中任一示例的系统,使得硬件异构调度器还包括:选择器,用于选择多个处理元件的一种类型的处理元件以执行所接收的代码片段,并通过分派在所选类型的处理元件中的处理元件上调度代码片段。

示例36:示例31-35中任一示例的系统,使得代码片段是与软件线程相关联的一个或多个指令。

示例37:示例34-36中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例38:示例34-37中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是用于支持密集算术基元的电路。

示例39:示例34-38中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是加速器。

示例40:示例34-39中任一示例的系统,使得数据并行程序阶段包括使用相同控制流同时处理的数据元素。

示例41:示例30-35中任一示例的系统,使得对于线程并行程序阶段,所选类型的处理元件是标量处理核心。

示例42:示例30-36中任一示例的系统,使得线程并行程序阶段包括使用独特控制流的数据依赖分支。

示例43:示例30-37中任一示例的系统,使得对于串行程序阶段,所选类型的处理元件是乱序核心。

示例44:示例30-38中任一示例的系统,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例45:示例31-44中任一示例的系统,使得异构调度器支持多种代码类型,包括编译代码、内在函数、汇编代码、库、中间代码、卸载代码和设备代码。

示例46:示例31-45中任一示例的系统,使得异构调度器在所选类型的处理元件不能本地处理代码片段时模拟功能。

示例47:示例31-46中任一示例的系统,使得异构调度器在可用的硬件线程的数目被超额认订时模拟功能。

示例48:示例31-47中任一示例的系统,使得异构调度器在所选类型的处理元件不能本地处理代码片段时模拟功能。

示例50:示例31-49中任一示例的系统,使得关于多个异构处理元件中的一种类型的处理元件的选择对于用户是透明的。

示例51:示例31-50中任一示例的系统,使得关于多个异构处理元件中的一种类型的处理元件的选择对于操作系统是透明的。

示例52:示例31-51中任一示例的系统,使得异构调度器呈现同构多处理器编程模型,以使每个线程对于程序员看起来如同它在标量核心上执行。

示例53:示例52中任一示例的系统,使得所呈现的同构多处理器编程模型呈现支持完整指令集的外观。

示例54a:示例31-53中任一示例的系统,使得多个异构处理元件共享存储器地址空间。

示例54b:示例31-53中任一示例的系统,使得异构调度器包括要在异构处理元件之一上执行的二进制转换器。

示例55:示例31-54中任一示例的系统,使得多个异构处理元件中的一种类型的处理元件的默认选择是延迟优化的核心。

示例56:示例31-55中任一示例的系统,使得异构软件调度器选择在多协议总线接口上用于所分派的指令的协议。

示例57:示例56中任一示例的系统,使得由多协议总线接口支持的第一协议包括用于访问系统存储器地址空间的存储器接口协议。

示例58:示例56-57中任一示例的系统,使得由多协议总线接口支持的第二协议包括缓存一致性协议,以维持存储在加速器的本地存储器中的数据与包括主机缓存层级结构和系统存储器的主机处理器的存储器子系统中的数据之间的一致性。

示例59:示例56-58中任一示例的系统,使得由多协议总线接口支持的第三协议包括支持设备发现、寄存器访问、配置、初始化、中断、直接存储器访问和地址转换服务的串行链路协议。

示例60:示例59的系统,使得第三协议包括外围部件接口快速(PCIe)协议。

实施例61:一种方法,包括:接收多个指令;分派所接收的多个指令以用于在多个异构处理元件中的一个或多个上执行,所接收的多个指令对应于将由所述多个异构处理元件中的一个或多个处理的代码片段,使得所述多个指令对于多个异构处理元件中的一个或多个中的至少一个是本机指令。

示例62:示例61的方法,使得多个异构处理元件包括有序处理器核心、乱序处理器核心和打包数据处理器核心。

示例63:示例62的方法,使得多个异构处理元件还包括加速器。

示例64:示例61-63中任一示例的方法,还包括:检测代码片段的程序阶段;使得多个异构处理元件包括具有第一微架构的第一处理元件和具有不同于第一微架构的第二微架构的第二处理元件;使得程序阶段是包括第一阶段和第二阶段的多个程序阶段之一,并且指令的分派部分地基于检测到的程序阶段;并且,使得与第二处理元件对代码片段的处理相比,第一处理元件对代码片段的处理产生改进的每瓦特性能特征。

示例65:示例61-64中任一示例的方法,还包括:选择多个处理元件的一种类型的处理元件以执行所接收的代码片段,并在所选类型的处理元件中的处理元件上调度代码片段。

示例66:示例61-63中任一示例的方法,使得代码片段是与软件线程相关联的一个或多个指令。

示例67:示例64-66中任一示例的方法,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例68:示例64-66中任一示例的方法,使得对于数据并行程序阶段,所选类型的处理元件是用于支持密集算术基元的电路。

示例69:示例64-68中任一示例的方法,使得对于数据并行程序阶段,所选类型的处理元件是加速器。

示例70:示例64-69中任一示例的方法,使得数据并行程序阶段的特征在于使用相同控制流同时处理的数据元素。

示例71:示例64-70中任一示例的方法,使得对于线程并行程序阶段,所选类型的处理元件是标量处理核心。

示例72:示例64-71中任一示例的方法,使得线程并行程序阶段的特征在于使用独特控制流的数据依赖分支。

示例73:示例64-72中任一示例的方法,使得对于串行程序阶段,所选类型的处理元件是乱序核心。

示例74:示例64-73中任一示例的方法,使得对于数据并行程序阶段,所选类型的处理元件是执行单指令多数据(SIMD)指令的处理核心。

示例75:示例61-74中任一示例的方法,还包括:在所选类型的处理元件不能本地处理代码片段时模拟功能。

示例76:示例61-74中任一示例的方法,还包括:在可用的硬件线程的数目被超额认订时模拟功能。

示例77:示例61-76中任一示例的方法,使得关于多个异构处理元件中的一种类型的处理元件的选择对于用户是透明的。

示例78:示例61-77中任一示例的方法,使得关于多个异构处理元件中的一种类型的处理元件的选择对于操作系统是透明的。

示例79:示例61-74中任一示例的方法,还包括:呈现同构多处理器编程模型,以使每个线程看起来如同它在标量核心上执行。

实施例80:实施例79的方法,使得所呈现的同构多处理器编程模型呈现支持完整指令集的外观。

示例81:示例61-79中任一示例的方法,使得多个异构处理元件共享存储器地址空间。

示例82:示例61-81中任一示例的方法,还包括:二进制转换要在异构处理元件之一上执行的代码片段。

示例83:示例61-82中任一示例的方法,使得多个异构处理元件中的一种类型的处理元件的默认选择是延迟优化的核心。

示例84:一种存储指令的非暂时性机器可读介质,所述指令在由硬件处理器执行时执行示例51-83之一的方法。

示例85:一种方法,包括:在异构调度器中接收代码片段;确定代码片段是否处于并行阶段;当代码片段不处于并行阶段时,选择延迟敏感的处理元件来执行代码片段;当代码片段处于并行阶段时,确定并行性的类型,并且对于线程并行代码片段,选择标量处理元件来执行代码片段,并且对于数据并行代码片段,确定数据并行代码片段的数据布局:对于打包数据布局,选择单指令多数据(SIMD)处理元件和算术基元处理元件之一,及对于随机数据布局,选择使用收集指令的SIMD处理元件、空间计算阵列、或标量核心阵列中的标量核心之一;并将代码片段传送到处理元件以供执行。

示例86:示例85的方法,还包括:在确定代码片段是否处于并行阶段之前,确定代码片段何时经受到加速器的卸载;当代码片段经受卸载时,将代码片段传送到加速器。

示例87:示例85-86中任一示例的方法,使得确定代码片段是否处于并行阶段基于检测到的数据依赖性、指令类型和控制流指令中的一个或多个。

示例88:示例87的方法,使得一类单指令多数据指令的指令指示并行阶段。

示例89:示例85-88中任一示例的方法,使得向由异构调度器处理的每个操作系统线程分配逻辑线程标识符。

示例90:示例89的方法,使得异构调度器利用逻辑线程标识符的条带映射,使得每个逻辑线程标识符被映射到处理元件类型、处理元件标识符和线程标识符的元组。

示例91:示例90的方法,使得通过除法和模运算来计算从逻辑线程标识符到处理元件标识符和线程标识符的映射。

示例92:示例91的方法,使得从逻辑线程标识符到处理元件标识符和线程标识符的映射是固定的,以保持线程亲和性。

示例93:示例90的方法,使得由异构调度器执行从逻辑线程标识符到处理元件类型的映射。

示例94:示例93的方法,使得从逻辑线程标识符到处理元件类型的映射是灵活的,以适应未来的处理元件类型。

示例95:示例91的方法,使得异构调度器利用核心组,使得至少一个核心组包括至少一个乱序元组和标量及SIMD元组,其逻辑线程标识符映射到相同的乱序元组。

示例96:示例95的方法,使得非并行阶段由线程确定,该线程在属于核心组之一的线程中具有独特页目录基址寄存器值。

示例97:示例96的方法,使得属于进程的线程共享相同的地址空间、页表和页目录基址寄存器值。

示例98:示例85-97中任一示例的方法,还包括:检测事件,使得事件是以下项中的一个:线程唤醒命令;写入页目录基址寄存器;休眠命令;线程中的阶段变化;以及指示对不同核心的所需重新分配的一个或多个指令。

示例99:示例98的方法,还包括:当事件是线程唤醒命令时:确定代码片段处于并行阶段,对与唤醒的线程共享相同页表基指针的处理元件的数量进行计数;确定计数的处理元件的数量是否大于1;当与唤醒的线程共享相同页表基指针的处理元件的数量的计数为1时,该线程处于串行阶段;当与唤醒的线程共享相同页表基指针的处理元件的数量的计数不为1时,该线程处于并行阶段。

示例100:示例98的方法,还包括:当事件是线程休眠命令时:清除与线程相关联的运行标志,对与受影响的线程共享相同页表基指针的处理元件的线程数量进行计数,确定乱序处理元件是否空闲;当页表基指针由核心组中的恰好一个线程共享时,则将该共享线程从乱序处理元件移出,当页表基指针由多于一个线程共享时,则将核心组的第一运行线程迁移到乱序处理元件。

示例101:示例100的方法,使得线程休眠命令是停止、等待进入和超时或暂停命令之一。

示例102:示例98的方法,还包括:当事件是阶段变化时:当线程的逻辑线程标识符指示它在标量处理元件上运行并且存在SIMD指令时,将线程迁移到SIMD处理元件;当线程的逻辑线程标识符指示它在SIMD处理元件上运行且没有SIMD指令时,将线程迁移到标量处理元件。

示例103:示例85-102中任一示例的方法,还包括:在传送代码片段之前,转换代码片段以更好地适合所选择的处理元件。

示例104:示例103的方法,使得异构调度器包括用于执行转换的二进制转换器。

示例105:示例103的方法,使得异构调度器包括用于执行转换的即时编译器。

示例106:示例85-105中任一示例的方法,使得该方法还包括示例61-83的任何方法示例的方法的步骤。

示例107:一种系统,包括:多个异构处理元件;异构调度器,用于确定代码片段的阶段,并至少部分地基于所确定的阶段将代码片段传送到多个异构处理元件之一以供执行。

示例108:示例107的系统,使得异构调度器:确定代码片段处于并行阶段;当代码片段不处于并行阶段时,选择延迟敏感的处理元件来执行代码片段;当代码片段处于并行阶段时,确定并行性的类型,并且对于线程并行代码片段,选择标量处理元件来执行代码片段,并且对于数据并行代码片段,确定数据并行代码片段的数据布局:对于打包数据布局,选择单指令多数据(SIMD)处理元件和算术基元处理元件之一,及对于随机数据布局,选择使用收集指令的SIMD处理元件、空间计算阵列、或标量核心阵列中的标量核心之一。

示例109:示例108的系统,使得异构调度器进一步:在确定代码片段是否处于并行阶段之前,确定代码片段何时经受到加速器的卸载;当代码片段经受卸载时,将代码片段传送到加速器。

示例110:示例108-109中任一示例的系统,使得异构调度器进一步:确定代码片段是否处于并行阶段基于检测到的数据依赖性、指令类型和控制流指令中的一个或多个。

示例111:示例110的系统,使得一类单指令多数据指令的指令指示并行阶段。

示例112:示例108-111中任一示例的系统,使得向由异构调度器处理的每个操作系统线程分配逻辑线程标识符。

示例113:示例112的系统,使得异构调度器利用逻辑线程标识符的条带映射,使得每个逻辑线程标识符被映射到处理元件类型、处理元件标识符和线程标识符的元组。

示例114:示例112的系统,使得通过除法和模运算来计算从逻辑线程标识符到处理元件标识符和线程标识符的映射。

示例115:示例114的系统,使得从逻辑线程标识符到处理元件标识符和线程标识符的映射是固定的,以保持线程亲和性。

示例116:示例115的系统,使得由异构调度器执行从逻辑线程标识符到处理元件类型的映射。

示例117:示例116的系统,使得从逻辑线程标识符到处理元件类型的映射是灵活的,以适应未来的处理元件类型。

示例118:示例108-117的系统,使得异构调度器利用核心组,使得核心组包括至少一个乱序元组和标量及SIMD元组,其逻辑线程标识符映射到相同的乱序元组。

示例119:示例118的系统,使得非并行阶段由线程确定,该线程在属于核心组之一的线程中具有独特页目录基址寄存器值。

示例120:示例119的系统,使得属于进程的线程共享相同的地址空间、页表和页目录基址寄存器值。

示例121:示例108-120中任一示例的系统,使得异构调度器用于:检测事件,使得事件是以下项之一:线程唤醒命令;写入页目录基址寄存器;休眠命令;线程中的阶段变化;以及指示所需重新分配的一个或多个指令。

示例122:示例121的系统,使得异构调度器用于:当事件是线程唤醒命令时:确定代码片段处于并行阶段,对与唤醒的线程共享相同页表基指针的处理元件的数量进行计数;确定计数的处理元件的数量是否大于1;当与唤醒的线程共享相同页表基指针的处理元件的数量的计数为1时,该线程处于串行阶段;当与唤醒的线程共享相同页表基指针的处理元件的数量的计数不为1时,该线程处于并行阶段。

示例123:示例121的系统,使得异构调度器用于:当事件是线程休眠命令时:清除与线程相关联的运行标志;对与受影响的线程共享相同页表基指针的处理元件的线程数量进行计数;确定乱序处理元件是否空闲;当页表基指针由核心组中的恰好一个线程共享时,则将该共享线程从乱序处理元件移出,当页表基指针由多于一个线程共享时,则将核心组的第一运行线程迁移到乱序处理元件。

示例124:示例123的系统,使得线程休眠命令是停止、等待进入和超时或暂停命令之一。

示例125:示例121的系统,使得异构调度器用于:当事件是阶段变化时:当线程的逻辑线程标识符指示它在标量处理元件上运行并且存在SIMD指令时,将线程迁移到SIMD处理元件;当线程的逻辑线程标识符指示它在SIMD处理元件上运行且没有SIMD指令时,将线程迁移到标量处理元件。

示例126:示例108-125中任一示例的系统,使得异构调度器用于:在传送代码片段之前,转换代码片段以更好地适合所选择的处理元件。

示例127:示例126的系统,使得异构调度器包括存储在非暂时性机器可读介质中的二进制转换器,以在执行时执行转换。

示例128:示例126的系统,使得异构调度器包括存储在非暂时性机器可读介质中的即时编译器,以在执行时执行转换。

示例129:示例108-128中任一示例的系统,还包括:存储器,用于存储程序代码,该程序代码可由异构处理器中的多个异构处理元件中的至少一个执行,以提供异构调度器。

示例130:示例108-128中任一示例的系统,使得异构调度器包括电路。

示例131:一种处理器,包括:处理器核心,所述处理器核心包括:解码器,用于解码处理器核心本地的至少一个指令;一个或多个执行单元,用于执行至少一个经解码指令,该至少一个经解码指令对应于加速开始指令,加速开始指令指示要卸载到加速器的代码区域的开始。

示例132:示例131的处理器,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以处理代码区域时,代码区域将由处理器核心处理。

示例133:示例131的处理器,使得响应于对应于加速开始指令的至少一个经解码指令的执行,处理器核心从第一执行模式转换到第二执行模式。

示例134:示例133的处理器,使得在第一执行模式中,处理器核心检查自修改代码,并且在第二执行模式中,处理器核心禁用对自修改代码的检查。

示例135:示例134的处理器,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例136:示例133-135中任一示例的处理器,使得在第一执行模式中,通过放宽存储器排序要求来弱化存储器一致性模型限制。

示例137:示例133-136中任一示例的处理器,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例138:一种方法,包括:解码处理器核心本地的指令;执行与加速开始指令相对应的经解码指令,加速开始指令用于指示要卸载到加速器的代码区域的开始。

示例139:示例138的方法,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以处理代码区域时,代码区域将由处理器核心处理。

示例140:示例138的方法,使得响应于对应于加速开始指令的经解码指令的执行,处理器核心从第一执行模式转换到第二执行模式。

示例141:示例140的方法,使得在第一执行模式中,处理器核心检查自修改代码,并且在第二执行模式中,处理器核心禁用对自修改代码的检查。

示例142:示例141的方法,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例143:示例140-142中任一示例的方法,使得在第一执行模式中,通过放宽存储器排序要求来弱化存储器一致性模型限制。

示例144:示例140-143中任一示例的方法,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例145:一种存储指令的非暂时性机器可读介质,该指令在由处理器执行时使处理器执行方法,该方法包括:解码处理器核心本地的指令;执行与加速开始指令相对应的经解码指令,加速开始指令用于指示要卸载到加速器的代码区域的开始。

示例146:示例145的方法,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以处理代码区域时,代码区域将由处理器核心处理。

示例147:示例145的方法,使得响应于对应于加速开始指令的经解码指令的执行,处理器核心从第一执行模式转换到第二执行模式。

示例148:示例147的方法,使得在第一执行模式中,处理器核心检查自修改代码,并且在第二执行模式中,处理器核心禁用对自修改代码的检查。

示例149:示例148的方法,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例150:示例148-149中任一示例的方法,使得在第一执行模式中,通过放宽存储器排序要求来弱化存储器一致性模型限制。

示例151:示例148-150中任一示例的方法,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例152:一种系统,包括:处理器核心,所述处理器核心包括:解码器,用于解码处理器核心本地的至少一个指令;一个或多个执行单元,用于执行至少一个经解码指令,该至少一个经解码指令对应于加速开始指令,加速开始指令用于指示要卸载到加速器的代码区域的开始。

示例153:示例152的系统,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以处理代码区域时,代码区域将由处理器核心处理。

示例154:示例152的系统,使得响应于对应于加速开始指令的至少一个经解码指令的执行,处理器核心从第一执行模式转换到第二执行模式。

示例155:示例154的系统,使得在第一执行模式中,处理器核心检查自修改代码,并且在第二执行模式中,处理器核心禁用对自修改代码的检查。

示例156:示例155的系统,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例157:示例152-156中任一示例的处理器,使得在第一执行模式中,通过放宽存储器排序要求来弱化存储器一致性模型限制。

示例158:示例152-157中任一示例的处理器,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例159:一种处理器,包括:处理器核心,所述处理器核心包括:解码器,用于解码处理器核心本地的指令;一个或多个执行单元,用于执行与加速结束指令相对应的经解码指令,加速结束指令用于指示要卸载到加速器的代码区域的结束。

示例160:示例159的处理器,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以接收并处理代码区域时,代码区域将由处理器核心处理。

示例161:示例159的处理器,使得通过执行对应于加速开始指令的经解码指令来描绘代码区域,所述执行将处理器核心从第一执行模式转换到第二执行模式。

示例162:示例161的处理器,使得在第一执行模式中,处理器检查自修改代码,并且在第二执行模式中,处理器禁用对自修改代码的检查。

示例163:示例162的处理器,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例164:示例161-163中任一示例的处理器,使得在第一执行模式中,弱化存储器一致性模型限制。

示例165:示例161-164中任一示例的处理器,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例166:示例159-165中任一示例的处理器,使得加速器开始指令的执行选通处理器核心上的代码区域的执行,直到执行加速器结束指令为止。

示例167:一种方法,包括:解码处理器核心本地的指令;执行与加速结束指令相对应的经解码指令,加速结束指令用于指示要卸载到加速器的代码区域的结束。

示例168:示例167的方法,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以接收并处理代码区域时,代码区域将由处理器核心处理。

示例169:示例167的方法,使得通过执行对应于加速开始指令的经解码指令来描绘代码区域,所述执行将处理器核心从第一执行模式转换到第二执行模式。

示例170:示例169的方法,使得在第一执行模式中,处理器检查自修改代码,并且在第二执行模式中,处理器禁用对自修改代码的检查。

示例171:示例170的方法,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例172:示例169-171中任一示例的方法,使得在第一执行模式中,弱化存储器一致性模型限制。

示例173:示例169-172中任一示例的方法,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例174:示例167-173中任一示例的方法,使得加速器开始指令的执行选通处理器核心上的代码区域的执行,直到执行加速器结束指令为止。

示例175:一种存储指令的非暂时性机器可读介质,所述指令在由处理器执行时使得处理器执行方法,该方法包括:解码处理器核心本地的指令;执行与加速结束指令相对应的解码指令,加速结束指令指示要卸载到加速器的代码区域的结束。

示例176:示例175的非暂时性机器可读介质,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以接收并处理代码区域时,代码区域将由处理器核心处理。

示例177:示例175的非暂时性机器可读介质,使得通过执行对应于加速开始指令的经解码指令来描绘代码区域,所述执行将处理器核心从第一执行模式转换到第二执行模式。

示例178:示例177的非暂时性机器可读介质,使得在第一执行模式中,处理器检查自修改代码,并且在第二执行模式中,处理器禁用对自修改代码的检查。

示例179:示例178的非暂时性机器可读介质,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例180:示例177-179中任一示例的非暂时性机器可读介质,使得在第一执行模式中,弱化存储器一致性模型限制。

示例181:示例177-180中任一示例的非暂时性机器可读介质,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例182:示例175-181中任一示例的非暂时性机器可读介质,使得加速器开始指令的执行选通处理器核心上的代码区域的执行,直到执行加速器结束指令为止。

示例183:一种系统,包括:处理器核心,所述处理器核心包括:解码器,用于解码处理器核心本地的指令;一个或多个执行单元,用于执行与加速结束指令相对应的经解码指令,加速结束指令用于指示要卸载到加速器的代码区域的结束;加速器,用于执行卸载的指令。

示例184:示例183的系统,使得基于目标加速器是否耦合到处理器核心并且可用于处理代码区域来卸载代码区域,使得当目标加速器没有耦合到处理器核心以接收并处理代码区域时,代码区域将由处理器核心处理。

示例185:示例184的系统,使得通过执行对应于加速开始指令的解码指令来描绘代码区域,所述执行将处理器核心从第一执行模式转换到第二执行模式。

示例186:示例185的系统,使得在第一执行模式中,处理器检查自修改代码,并且在第二执行模式中,处理器禁用对自修改代码的检查。

示例187:示例186的系统,使得为了禁用自修改代码检查,禁用自修改代码检测电路。

示例188:示例185-187中任一示例的系统,使得在第一执行模式中,弱化存储器一致性模型限制。

示例189:示例185-188中任一示例的系统,使得在第一执行模式中,通过设置浮点控制字寄存器来改变浮点语义。

示例190:示例183-190中任一示例的系统,使得加速器开始指令的执行选通处理器核心上的代码区域的执行,直到执行加速器结束指令为止。

示例191:一种系统,包括:加速器,用于执行线程;

处理器核心;和存储器,其中存储有用于实现异构调度器的软件,使得当软件由处理器核心执行时,异构调度器用于:检测适合于在加速器上潜在执行的线程中的代码序列,选择加速器以执行的检测到的代码序列,将检测到的代码序列发送到所选择的加速器。

示例192:示例191的系统,还包括:多个异构处理元件,用于执行不适合于由加速器执行的线程的程序阶段。

示例193:示例191-192中任一示例的系统,使得异构调度器还包括:模式匹配器,用于通过将代码序列与预定模式集合进行比较来识别代码序列。

示例194:示例193的系统,使得预定模式集合被存储在存储器中。

示例195:示例191-194中任一示例的系统,使得异构调度器使用性能监控来识别具有模式匹配的代码,并通过配置处理器核心进行一个或多个以下操作来调整与线程相关联的操作模式:忽略自修改代码,弱化存储器一致性模型限制,改变浮点语义,更改性能监控以及改变架构标志使用。

示例196:示例191-195中任一示例的系统,使得异构调度器还包括转换模块,用于将识别的代码转换为加速器代码以供加速器执行。

示例197:示例191-196中任一示例的系统,使得处理器核心包括:模式匹配电路,用于使用存储的模式来检测线程中的代码序列。

示例198:示例191-197中任一示例的系统,使得处理器核心维护在系统中执行的每个线程的运行状态。

示例199:示例191-197中任一示例的系统,使得异构调度器维护在系统中执行的每个线程的状态。

示例200:示例191-199中任一示例的系统,使得异构调度器基于处理器元件信息、跟踪的线程和检测到的代码序列中的一个或多个来选择加速器。

示例201:一种系统,包括:多个异构处理元件;耦合到多个处理元件的异构调度器电路,异构调度器电路包括:线程和处理元件跟踪器表,用于维护每个线程执行和每个处理元件的运行状态;选择器,用于选择多个异构处理元件中的一种类型的处理元件,以处理代码片段,并基于来自线程和处理元件跟踪器的状态和处理元件信息,在多个异构处理元件之一上调度代码片段以供执行。

示例202:示例201的系统,还包括:存储器,用于存储可由处理器核心执行的软件,该软件用于检测线程中的代码序列以用于在作为耦合到异构调度器电路的多个异构处理元件之一的加速器上的潜在执行。

示例203:示例202的系统,使得软件模式匹配器从存储的模式中识别代码序列。

示例204:示例201-203中任一示例的系统,使得异构调度器将所识别的代码转换为加速器代码。

示例205:示例201-204中任一示例的系统,使得选择器是由异构调度器电路执行的有限状态机。

示例206:一种方法,包括:执行线程;检测执行线程中的模式;将识别的模式转换为加速器代码;并将已转换的模式传送到可用的加速器以供执行。

示例207:示例206的方法,使得使用软件模式匹配器来识别模式。

示例208:示例206的方法,使得使用硬件模式匹配电路来识别模式。

示例209:一种方法,包括:执行线程;检测执行线程中的模式;基于模式调整与线程相关联的操作模式以使用放宽的要求。

示例210:示例209的方法,使得使用软件模式匹配器来识别模式。

示例211:示例209的方法,使得使用硬件模式匹配电路识别模式。

示例212:示例209的方法,使得在调整的操作模式中应用以下项中的一个或多个:忽略自修改代码,弱化存储器一致性模型限制,改变浮点语义,更改性能监控,及改变架构标志使用。

示例213:一种系统,包括:解码器,用于解码处理器核心本地的指令;一个或多个执行单元,用于执行经解码的指令,经解码的指令中的一个或多个对应于加速开始指令,加速开始指令使得进入不同的执行模式,用于同一线程中的加速开始指令之后的指令。

示例214:示例213的系统,使得加速开始指令包括用于指定指向存储器数据块的指针的字段,使得存储器数据块的格式包括序列号字段以指示中断之前的进度。

示例215:示例213-214中任一示例的系统,使得加速开始指令包括块类标识符字段,用于指定存储在存储器中的代码的预定义转换。

示例216:示例213-215中任一示例的系统,使得加速开始指令包括实施方式标识符字段,用于指示用于执行的硬件类型。

示例217:示例213-216中任一示例的系统,使得加速开始指令包括保存状态区域大小字段,用于指示状态保存区域的大小和格式,该状态保存区域存储将在加速开始指令执行之后修改的寄存器。

示例218:示例213-217中任一示例的系统,使得加速开始指令包括用于本地储存区域大小的字段,使得本地储存区域用于提供超出寄存器的储存。

示例219:示例218的系统,使得本地储存区域大小由加速开始指令的立即操作数定义。

示例220:示例218的系统,使得本地储存区域不在加速开始指令之后的指令之外被访问。

示例221:示例213-220中任一示例的系统,使得对于不同执行模式内的指令,可以定义存储器依赖性类型。

示例222:示例221的系统,使得可定义存储器依赖性类型包括以下之一:独立类型,其中保证存储-加载和存储-存储依赖性不存在;对本地储存区域类型的潜在依赖访问,其中对本地储存区域的加载和存储可以彼此依赖,但是独立于其他加载和存储;潜在依赖类型,其中硬件将动态检查并强制执行指令之间的依赖关系;和原子类型,其中加载和存储在它们自身之间依赖,并且存储器以原子方式更新。

示例223:示例213-222中任一示例的系统,还包括:存储器:用于存储:保存状态,包括要使用的寄存器、要更新的标志和实施方式规范信息;和执行期间超出寄存器使用的本地储存。

示例224:示例223的系统,使得并行执行的每个实例获得其自己的本地储存。

示例225:一种方法,包括:进入线程的不同的放宽的执行模式;在不同的放宽的执行模式期间,向保存状态区域写入在线程执行期间要使用的寄存器;在不同的放宽的执行模式期间,保留本地储存,以在线程中每个并行执行时使用;在不同的放宽的执行模式内执行线程块并跟踪指令;基于加速器结束指令的执行来确定是否已到达不同执行模式的结束;当到达不同执行模式的结束时,从保存状态区域恢复寄存器和标志;并且当尚未到达不同执行模式的结束时,使用中间结果更新本地储存。

示例226:示例225的方法,使得在不同的放宽的执行模式期间发生以下项中的一个或多个:忽略自修改代码,弱化存储器一致性模型限制,改变浮点语义,更改性能监控,改变架构标志使用。

示例227:示例225或226的方法,使得基于加速器开始指令的执行来进入不同的执行模式。

示例228:示例225的方法,使得基于确定的模式进入不同的执行模式。

示例229:示例225-228中任一示例的方法,使得在加速器开始指令所指向的存储器块中定义用于存储在加速器开始指令执行之后将被修改的寄存器的状态保存区域的大小和格式。

示例230:示例225-229中任一示例的方法,还包括:在执行之前转换线程或其一部分。

示例231:示例230的方法,使得线程或其一部分被转换为加速器代码。

示例232:示例230或231的方法,使得经转换的线程或线程的经转换的部分由加速器执行。

示例233:示例213-232中任一示例的方法,使得通过更新与线程的块相关联的存储块中的序列号来跟踪块的指令。

示例234:示例223-233中任一示例的方法,使得当指令成功执行并且退出时,更新线程块的序列号。

示例235:示例223-234中任一示例的方法,使得当加速器结束指令执行并退出时到达不同执行模式的结束。

示例236:示例223-235中任一示例的方法,使得当如加速器结束指令执行确定的未到达不同执行模式的结束时,尝试使用中间结果来尝试执行部分块。

示例237:示例236的方法,使得非加速器处理元件用于在异常或中断之后利用中间结果来执行。

示例238:示例223-237中任一示例的方法,使得当尚未到达不同执行模式的结束时,将执行回滚到加速器使用开始时的点。

示例239:一种系统,包括:解码器,用于解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段,以及用于打包数据目的地操作数的字段;执行电路,用于执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果与打包数据目的地操作数的相应打包数据元素位置的数据元素的总和存储到打包数据目的地操作数的相应打包数据元素位置中。

示例240:示例239的系统,使得N由操作码指示。

示例241:示例239-240中任一示例的系统,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例242:示例239-241中任一示例的系统,使得执行电路包括二叉树缩减网络。

示例243:示例242中任一示例的系统,使得执行电路是加速器的一部分。

示例244:示例242的系统,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例245:示例244的系统,使得并行处理每个乘法。

示例246:示例239-245中任一示例的系统,使得打包数据元素对应于一个或多个矩阵的元素。

示例247:一种方法,包括:解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段,以及用于打包数据目的地操作数的字段;执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果与打包数据目的地操作数的相应打包数据元素位置的数据元素的总和存储到打包数据目的地操作数的相应打包数据元素位置中。

示例248:示例247的方法,使得N由操作码指示。

示例249:示例247-248中任一示例的方法,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例250:示例247-249中任一示例的方法,使得执行电路包括二叉树缩减网络。

示例251:示例247的方法,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例252:示例251的方法,使得每个打包数据操作数具有八个打包数据元素。

示例253:示例251的方法,使得并行处理每个乘法。

示例254:示例247-253中任一示例的方法,使得打包数据元素对应于一个或多个矩阵的元素。

示例255:一种存储指令的非暂时性机器可读介质,所述指令在由处理器执行时使处理器执行方法,该方法包括:解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段,以及用于打包数据目的地操作数的字段;执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果与打包数据目的地操作数的相应打包数据元素位置的数据元素的总和存储到打包数据目的地操作数的相应打包数据元素位置中。

示例256:示例255的非暂时性机器可读介质,使得N由操作码指示。

示例257:示例255-256中任一示例的非暂时性机器可读介质,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例258:示例255-257中任一示例的非暂时性机器可读介质,使得执行电路包括二叉树缩减网络。

示例259:示例258的非暂时性机器可读介质,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例260:示例259的非暂时性机器可读介质,使得每个打包数据操作数具有八个打包数据元素。

示例261:示例259的非暂时性机器可读介质,使得并行处理每个乘法。

示例262:示例255-261中任一示例的非暂时性机器可读介质,使得打包数据元素对应于一个或多个矩阵的元素。

示例263:一种方法,包括:解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段、以及用于打包数据目的地操作数的字段;执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)成对地对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果的总和存储到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例264:示例263的方法,使得N由操作码指示。

示例265:示例263-264中任一示例的方法,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例266:示例265的方法,使得执行电路是二叉树缩减网络。

示例267:示例266的方法,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例268:示例263-267中任一示例的方法,使得每个打包数据操作数具有八个打包数据元素。

示例269:示例268-268中任一示例的方法,使得并行处理每个乘法。

示例270:一种存储指令的非暂时性机器可读介质,所述指令在由处理器执行时使处理器执行方法,该方法包括:解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段、以及用于打包数据目的地操作数的字段;执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)成对地对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果的总和存储到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例271:示例270的非暂时性机器可读介质,使得N由操作码指示。

示例272:示例270-271中任一示例的非暂时性机器可读介质,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例273:示例272的非暂时性机器可读介质,使得执行电路是二叉树缩减网络。

示例274:示例272的非暂时性机器可读介质,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例275:示例270-274中任一示例的非暂时性机器可读介质,使得每个打包数据操作数具有八个打包数据元素。

示例276:示例270-275中任一示例的非暂时性机器可读介质,使得并行处理每个乘法。

示例277:一种系统,包括:解码器,用于解码指令,该指令具有操作码、用于第一打包数据源操作数的字段、用于第二到第N打包数据源操作数的一个或多个字段、以及用于打包数据目的地操作数的字段;执行电路,用于执行经解码的指令,针对第二到第N打包数据源操作数的每个打包数据元素位置,1)将该打包数据源操作数的该打包数据元素位置的数据元素与第一打包数据源操作数的相应打包数据元素位置的数据元素相乘以生成临时结果,2)成对地对临时结果求和,3)将临时结果的总和与打包数据目的地操作数的相应打包数据元素位置的数据元素相加,以及4)将临时结果的总和存储到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例278:示例277的系统,使得N由操作码指示。

示例279:示例277-278中任一示例的系统,使得将源操作数的值复制到乘法-加法器阵列的寄存器中。

示例280:示例279的系统,使得执行电路是二叉树缩减网络。

示例281:示例279的系统,使得二叉树缩减网络包括成对地耦合到第一求和电路集合的多个乘法电路,使得第一求和电路集合耦合到第二求和电路集合,第二求和电路集合耦合到第三求和电路集合,第三求和电路集合也耦合到打包数据目的地操作数的相应打包数据元素位置的数据元素。

示例282:示例277-281中任一示例的系统,使得每个打包数据操作数具有八个打包数据元素。

示例283:示例277-282中任一示例的系统,使得并行处理每个乘法。

示例284:一种系统,包括:加速器,包括:多协议总线接口,用于将加速器耦合到主机处理器,加速器包括用于处理命令的一个或多个处理元件;共享工作队列,包括多个条目以存储由多个客户端提交的工作描述符,工作描述符包括用于标识提交工作描述符的客户端的标识码、由一个或多个处理元件执行的至少一个命令、和寻址信息;仲裁器,用于根据指定的仲裁策略从共享工作队列向一个或多个处理元件分派工作描述符,使得一个或多个处理元件中的每一个接收从仲裁器分派的工作描述符,以执行源和目的地地址转换,读取通过源地址转换识别的源数据,执行至少一个命令以生成目的地数据,并使用目的地地址转换将目的地数据写入存储器。

示例285:示例284的系统,使得多个客户端包括向加速器提交直接用户模式输入/输出(IO)请求的一个或多个用户模式应用程序;在共享加速器的虚拟机(VM)中运行的内核模式驱动程序;和/或在多个容器中运行的软件代理。

示例286:示例285的系统,使得多个客户端中的至少一个客户端包括在VM内执行的用户模式应用程序或容器。

示例287:示例284-286中任一示例的系统,使得客户端包括对等输入/输出(IO)代理和/或软件链式卸载请求中的一个或多个。

示例288:示例287的系统,使得对等IO代理中的至少一个包括网络接口控制器(NIC)。

示例289:示例284-288中任一示例的系统,还包括:地址转换缓存,用于存储可由一个或多个处理元件使用的虚拟到物理地址转换。

示例290:示例284-289中任一示例的系统,使得指定的仲裁策略包括先进先出策略。

示例291:示例284-290中任一示例的系统,使得指定的仲裁策略包括服务质量(QoS)策略,其中给予第一客户端的工作描述符高于第二客户端的工作描述符的优先级。

示例292:示例291的系统,使得将第一客户端的工作描述符在第二客户端的工作描述符之前分派到一个或多个处理元件,即使在第一客户端的工作描述符之前在共享工作队列中接收到第二客户端的工作描述符。

示例293:示例284-292中任一示例的系统,使得标识码包括用于标识分配给客户端的系统存储器中的地址空间的进程地址空间标识符(PASID)。

示例294:示例284-293中任一示例的系统,还包括:一个或多个专用工作队列,每个专用工作队列包括多个条目以存储由与专用工作队列相关联的单个客户端提交的工作描述符。

示例295:示例294的系统,还包括:组配置寄存器,其被编程为将两个或多个专用工作队列和/或共享工作队列组合成组,该组与一个或多个处理元件相关联。

示例296:示例295的系统,使得一个或多个处理元件用于处理来自组中的专用工作队列和/或共享工作队列的工作描述符。

示例297:示例284-296中任一示例的系统,使得由多协议总线接口支持的第一协议包括用于访问系统存储器地址空间的存储器接口协议。

示例298:示例284-297中任一示例的系统,使得由多协议总线接口支持的第二协议包括缓存一致性协议,以维持存储在加速器的本地存储器中的数据与包括主机缓存层级结构和系统存储器的主机处理器的存储器子系统中的数据之间的一致性。

示例299:示例284-298中任一示例的系统,使得由多协议总线接口支持的第三协议包括支持设备发现、寄存器访问、配置、初始化、中断、直接存储器访问和地址转换服务的串行链路协议。

示例300:示例299的系统,使得第三协议包括外围部件接口快速(PCIe)协议。

示例301:示例284-300中任一示例的系统,还包括:加速器存储器,用于存储要由处理元件处理的源数据,并存储由一个或多个处理元件的处理产生的目的地数据。

示例302:示例301的系统,使得加速器存储器包括高带宽存储器(HBM)。

示例303:示例301的系统,使得为加速器存储器分配主机处理器使用的系统存储器地址空间的第一部分。

示例304:示例303的系统,还包括:主机存储器,为其分配系统存储器地址空间的第二部分。

示例305:示例304的系统,还包括:偏移电路和/或逻辑,用于针对存储在系统存储器地址空间中的每个数据块,指示包含在块内的数据是否向加速器偏移。

示例306:示例305的系统,使得每个数据块包括存储器页。

示例307:示例305的系统,使得主机在不首先向加速器传送请求的情况下禁止处理向加速器偏移的数据。

示例308:示例307的系统,使得偏移电路和/或逻辑包括偏移表,该偏移表包括要针对每个固定大小的数据块设置的一位,以指示向加速器的偏移。

示例309:示例301-308中任一示例的系统,使得加速器包括:存储器控制器,用于与主机处理器的一致性控制器通信,以执行与存储在加速器存储器中的数据相关联的一个或多个数据一致性事务。

示例310:示例309的系统,使得存储器控制器工作在设备偏移模式中以访问存储在加速器存储器中的数据块,该数据块被设置为向加速器偏移,使得当处于设备偏移模式时,存储器控制器在不询问主机处理器的缓存一致性控制器的情况下访问加速器存储器。

示例311:示例309的系统,使得存储器控制器工作在主机偏移模式中以访问被设置为向主机处理器偏移的数据块,使得当处于主机偏移模式时,存储器控制器通过主机处理器中的缓存一致性控制器将所有请求发送到加速器存储器。

示例312:示例284-311中任一示例的系统,使得共享工作队列存储至少一个批次描述符,其标识一批工作描述符。

示例313:示例312的系统,还包括:批处理电路,用于通过从存储器读取该批工作描述符来处理该批次描述符。

示例314:示例292的系统,使得响应于主机处理器执行第一类型的指令,将工作描述符添加到专用工作队列,以及使得响应主机处理器执行第二类型的指令,将工作描述符添加到共享工作队列。

示例315:一种方法,包括:将第一存储器页集合置于设备偏移中;从耦合到主机处理器的加速器设备的本地存储器分配第一存储器页集合;将操作数数据从主机处理器的核心或输入/输出代理传送到分配的页;加速器设备使用本地存储器处理操作数以生成结果;并将第一存储器页集合从设备偏移转换为主机偏移。

示例316:示例315的方法,使得将第一存储器页集合置于设备偏移中包括在更新偏移表中针对第一存储器页集合进行更新以指示页处于加速器设备偏移中。

示例317:示例315-316中任一示例的方法,使得更新条目包括设置与第一存储器页集合中的每个页相关联的位。

示例318:示例315-317中任一示例的方法,使得一旦设置为设备偏移,则保证第一存储器页集合不被缓存在主机缓存存储器中。

示例319:示例315-318中任一示例的方法,使得分配第一存储器页集合包括启动驱动程序或应用程序编程接口(API)调用。

示例320:示例315-319中任一示例的方法,使得为了处理操作数,加速器设备执行命令并处理直接来自其本地存储器的数据。

示例321:示例315-320中任一示例的方法,使得将操作数数据传送到所分配的页包括将一个或多个工作描述符提交给加速器设备,工作描述符标识或包括操作数。

示例322:示例321的方法,使得一个或多个工作描述符可以导致根据命令从主机处理器缓存刷新分配的页。

示例323:示例315-323中任一示例的方法,使得当第一存储器页集合被设置为主机偏移时,允许主机处理器访问、缓存并共享结果。

相关技术
  • 用于异构计算的系统、方法和装置
  • 用于在支持共享虚拟存储器的异构计算系统中的TLB关闭的方法和装置
技术分类

06120112481679