一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

执行矩阵值指示的制作方法

2023-09-22 09:51:30 来源:中国专利 TAG:

执行矩阵值指示
1.要求优先权
2.本技术要求2021年5月13日提交的题为“用于配置编译器以接收和生成计算操作的指令的处理器和系统(processor and system to configure a compiler to receive and generate instructions for computational operations)”的美国临时申请第63/188,406号的权益,其全部内容通过引用并入本文。
技术领域
3.至少一个实施例涉及用于执行一个或更多个矩阵运算的处理资源。例如,至少一个实施例涉及执行编译器以生成用于存储稀疏矩阵的非零元素的索引值的指令的处理器或计算系统,用于存储具有所述稀疏矩阵的非零元素的值的压缩数组(array)的指令,用于执行矩阵乘法运算的指令,以及用于解压缩所述矩阵乘法运算的结果以生成结果稀疏矩阵(例如,包括零值和非零值)的指令。


背景技术:

4.矩阵是按行和列排列的一组数字,或者一般来说,矩阵的元素由两个索引来索引。这些数字称为矩阵的元素、条目或值。矩阵具有广泛的应用范围,包括神经网络和机器学习。为了计算神经网络或机器学习算法的数学运算,处理器可以使用一个或更多个矩阵执行若干运算,例如加法和乘法,其中这些运算对应于计算中间结果或最终结果。一些神经网络包括具有存储数百万甚至数十亿元素的矩阵的层。可以改进用于执行矩阵运算的存储器量、计算能力或计算资源。
附图说明
5.图1示出了根据至少一个实施例的用于执行矩阵运算的计算架构的概览示意图;
6.图2示出了根据至少一个实施例的以稀疏格式表示的矩阵的示例;
7.图3示出了根据至少一个实施例的用于稀疏矩阵的稀疏元数据的示例;
8.图4a、图4b、图4c、图4d和图4e示出了根据至少一个实施例的生成和执行稀疏矩阵指令或运算的过程的示例;
9.图5示出了根据至少一个实施例的示例性数据中心;
10.图6示出了根据至少一个实施例的处理系统;
11.图7示出了根据至少一个实施例的计算机系统;
12.图8示出了根据至少一个实施例的系统;
13.图9示出了根据至少一个实施例的示例性集成电路;
14.图10示出了根据至少一个实施例的计算系统;
15.图11示出了根据至少一个实施例的apu;
16.图12示出了根据至少一个实施例的cpu;
17.图13示出了根据至少一个实施例的示例性加速器集成切片;
18.图14a-图14b示出了根据至少一个实施例的示例性图形处理器;
19.图15a示出了根据至少一个实施例的图形核心;
20.图15b示出了根据至少一个实施例的gpgpu;
21.图16a示出了根据至少一个实施例的并行处理器;
22.图16b示出了根据至少一个实施例的处理集群;
23.图16c示出了根据至少一个实施例的图形多处理器;
24.图17示出了根据至少一个实施例的图形处理器;
25.图18示出了根据至少一个实施例的处理器;
26.图19示出了根据至少一个实施例的处理器;
27.图20示出了根据至少一个实施例的图形处理器核心;
28.图21示出了根据至少一个实施例的ppu;
29.图22示出了根据至少一个实施例的gpc;
30.图23示出了根据至少一个实施例的流式多处理器;
31.图24示出了根据至少一个实施例的编程平台的软件栈;
32.图25示出了根据至少一个实施例的图24的软件栈的cuda实现;
33.图26示出了根据至少一个实施例的图24的软件栈的rocm实现;
34.图27示出了根据至少一个实施例的图24的软件栈的opencl实现;
35.图28示出了根据至少一个实施例的由编程平台支持的软件;
36.图29示出了根据至少一个实施例的在图24-27的编程平台上执行的编译代码;
37.图30示出了根据至少一个实施例的在图24-27的编程平台上执行的更详细的编译代码;
38.图31示出了根据至少一个实施例的在编译源代码之前转换源代码;
39.图32a示出了根据至少一个实施例的被配置为使用不同类型的处理单元来编译和执行cuda源代码的系统;
40.图32b示出了根据至少一个实施例的被配置为使用cpu和启用cuda的gpu来编译和执行图32a的cuda源代码的系统;
41.图32c示出了根据至少一个实施例的被配置为使用cpu和未启用cuda的gpu来编译和执行图32a的cuda源代码的系统;
42.图33示出了根据至少一个实施例的由图32c的cuda到hip转换工具转换的示例性内核;
43.图34更详细地示出了根据至少一个实施例的图32c的未启用cuda的gpu;以及
44.图35示出了根据至少一个实施例的示例性cuda网格的线程如何被映射到图34的不同计算单元;以及
45.图36示出了根据至少一个实施例的如何将现有cuda代码迁移到数据并行c 代码。
具体实施方式
46.在以下描述中,阐述了许多具体细节以提供对至少一个实施例的更透彻的理解。然而,对于本领域技术人员显而易见的是,可以在没有这些具体细节中的一个或更多个的
情况下实践本发明的概念。
47.在至少一个实施例中,稀疏矩阵的矩阵乘法涉及处理器执行以许多零值作为输入的乘法;因此,处理器会浪费计算资源计算无价值的乘法运算,例如零乘以非零值。在至少一个实施例中,稀疏矩阵是具有许多(例如,多半)零值的矩阵(例如,所述矩阵值的50%为零,所述矩阵中超过60%的值为零,或所述矩阵中超过70%的值为零)。在至少一个实施例中,即使值为零,它们仍然需要存储在存储器中。在至少一个实施例中,对于高精度数据类型(例如,浮点),即使零对计算贡献不大,存储所述零值可能也很重要。
48.在至少一个实施例中,与执行诸如矩阵乘法和累加(mma)、整数矩阵乘法和累加(imma)以及半精度矩阵乘法和累加(hmma)之类的计算操作相关联的算法,并且可以包括稀疏矩阵。在至少一个实施例中,稀疏矩阵乘法运算作为训练或执行神经网络、卷积或机器学习操作的一部分被执行。
49.为了改进使用稀疏矩阵的计算操作,在至少一个实施例中,系统接收一个或更多个指令,这些指令通过减少乘法运算要完成运算的零的数量来减少用于执行与稀疏矩阵的乘法的计算负载。在至少一个实施例中,程序员将这样的指令写入一个或更多个源文件以执行一个或更多个稀疏矩阵乘法运算。在至少一个实施例中,至少部分地基于稀疏矩阵的非零值的一个或更多个指示,利用一个或更多个图形处理核心来执行所述矩阵乘法运算。例如,一个或更多个处理器可以接收用于图形处理单元的并行线程指令(ptx),其是由编译器生成的与汇编指令类似的平台无关指令。在至少一个实施例中,当应用程序正在运行时,及时(jit)将进一步将ptx指令编译为gpu特定的机器指令(例如,可执行指令)。在至少一个实施例中,一个或更多个图形处理核心执行稀疏矩阵乘法运算,其中所述一个或更多个图形处理核心可以并行执行稀疏矩阵运算。
50.在至少一个实施例中,一个或更多个第一指令(称为“聚集(gather)指令”)用于指示矩阵的哪些值是非零。在至少一个实施例中,执行所述聚集指令返回指示哪些值是非零的索引数组。例如,如果矩阵的第一、第四和第九个元素仅是所述非零值,则执行所述聚集指令将返回1、4和9。在至少一个实施例中,编译器接收所述一个或更多个第一指令并且生成用于一个或更多个图形处理单元的可执行指令(例如,被配置为在所述一个或更多个gpu上执行操作的一个或更多个驱动器可访问的可执行指令)。
51.在至少一个实施例中,第二指令(称为“压缩指令”或归约指令)用于生成矩阵的压缩表示。在至少一个实施例中,执行所述压缩指令使矩阵的非零元素与来自所述第一指令的索引一起被存储(没有零)。例如,压缩指令可以使一个或更多个处理器生成压缩数组,其存储稀疏矩阵的非零元素的值。在至少一个实施例中,编译器接收所述一个或更多个第二指令并生成用于一个或更多个图形处理单元的可执行指令(例如,ptx指令、较低级别指令)。
52.在至少一个实施例中,第三指令(也称为“mma指令”)用于对两个或更多个矩阵操作数执行mma运算,其中操作数中的至少一个使用第二(压缩)指令进行压缩。在至少一个实施例中,执行所述第三指令使用索引来执行mma运算(例如,没有不必要的与零的相乘)。在至少一个实施例中,编译器接收所述一个或更多个第三指令并生成用于一个或更多个图形处理单元的可执行指令(例如,ptx指令、较低级别指令)。
53.在至少一个实施例中,第四指令(称为“分散(scatter)指令”)用于存储来自非零
值的矩阵(连同零值)和来自第二(压缩)指令的索引。在至少一个实施例中,所述第四指令用于对压缩矩阵进行解压缩,其可以由api执行或生成,其中所述api是用于执行稀疏矩阵乘法运算的api库的一部分。在至少一个实施例中,解压缩包括基于输入稀疏矩阵中的零值的索引值将零值添加到矩阵(例如,将零值存储在未包括在压缩矩阵或压缩数组中的索引中)。
54.在至少一个实施例中,所述第一、第二、第三和第四指令由编译器接收并解析、翻译或编译为较低级别指令,诸如x86、arm(例如,armv7、32位),精简指令集计算机(risc)指令和/或预编译指令,其中所述较低级别指令(例如,机器可读指令或可执行指令)可由被配置为在一个或更多个图形处理单元上执行所述指令的驱动器使用,以执行包括稀疏矩阵的矩阵乘法运算。在至少一个实施例中,所述编译指令或可执行指令包括操作数,所述操作数指示非零值被存储在稀疏矩阵中何处(例如,索引)和所述非零值的值。
55.在至少一个实施例中,本文公开的指令和/或技术适用于矩阵,但也适用于数据结构,例如数组、表、列、行或以有组织的格式存储值的其他数据结构。在至少一个实施例中,本文公开的指令和/或技术适用于更通用的线性运算,例如张量。
56.图1示出了根据至少一个实施例的示出计算架构100的概览示意图。在至少一个实施例中,图1包括第一源文件102、第二源文件104、第一编译器106、中间源文件108、第二编译器110、可执行代码112、驱动器114和gpu 116。在至少一个实施例中,根据本公开实施的系统100用于配置第二编译器110,该第二编译器110编译程序指令以在gpu 116内的一个或更多个处理核上执行以执行计算操作(例如,稀疏矩阵-矩阵乘法和累加(稀疏mma)、稀疏hmma、稀疏imma等),从而减少了由一个或更多个gpu 116执行的操作的数量。
57.在至少一个实施例中,第一源文件102是直接源文件,例如程序员直接用ptx语言编写以创建源文件。在至少一个实施例中,第一源文件102是ptx源文件108。在至少一个实施例中,api(例如,cuda api)从应用程序接收第二源文件104并将所述源文件提供给第一编译器106,第一编译器106将第一源代码106编译为中间源文件108(例如,ptx代码)。在至少一个实施例中,第一源文件102和第二源文件104包括用于神经网络操作的操作,例如卷积或乘法。在至少一个实施例中,第一源文件102在执行所述文件时变成中间源文件108(例如,ptx文件)。在至少一个实施例中,第一编译器106将以人类可读格式(例如,cuda、hip、c 和下面列出的其他格式)编写的代码,例如第二源文件104,翻译成ptx源文件108。在至少一个实施例中,第一编译器106以及它如何用于编译代码将在下面至少在图24-图32a及其相应的描述中更详细地描述。在至少一个实施例中,中间源文件108包含指令,使得图形驱动器使用第二编译器110将ptx指令翻译成二进制代码112,该二进制代码112可以在并行处理单元(ppu)的核心上运行,例如图形处理单元(gpu)116(通过使用驱动器114)。
58.在至少一个实施例中,gpu 116支持除了面向图形的操作之外的宽范围的操作。例如,在至少一个实施例中,gpu 116能够执行任意程序指令。在至少一个实施例中,gpu 116包括编译器,该编译器使用驱动器(诸如驱动器114)来编译程序指令以在gpu 116内包括的一个或更多个处理核上执行。在至少一个实施例中,驱动器114是软件或包括软件库,其被配置为在一个或更多个图形处理单元(例如,cuda驱动器)上执行代码。在至少一个实施例中,每个这样的核心与执行执行线程的其他处理核并行地执行特定执行线程。在至少一个实施例中,图1示出了一个gpu 116,但也可以使用多于一个的gpu。在至少一个实施例中,
gpu 116包括一个或更多个算术逻辑单元(alu),其中所述一个或更多个alu被配置为存储操作数(例如,稀疏矩阵的非零值的元数据或稀疏矩阵的索引),以及其中所述alu可以对这些操作数进行操作以执行指令(例如,以完成矩阵乘法运算)。
59.在至少一个实施例中,与mma指令的密集版本不同,稀疏性在添加到现有mma指令的附加操作数中表示。在至少一个实施例中,附加操作数被呈现给第二编译器110(例如,应用程序编程接口(api))并由第二编译器110处理。在至少一个实施例中,第二编译器110及其如何用于编译代码在下面至少在图24-图32a及其相应的描述中更详细地描述。
60.在至少一个实施例中,创建附加操作数以表示稀疏信息,该信息也被添加到具有用于并行线程执行(ptxa)的汇编器作为前端的api(例如,有向无环图(dag)接口)以及被添加到用于mma指令的编译器中间表示(ir)。在至少一个实施例中,第二源文件104(例如,设备代码)由第一编译器106接收并编译成中间源文件108(例如,ptx源文件)。在至少一个实施例中,然后中间源文件108由第二编译器110在运行时编译成可执行代码112(例如,cuda中的二进制代码)。在至少一个实施例中,对于计算统一设备架构(cuda),第二编译器110在运行时将非硬件特定的中间源文件108(例如,ptx ir代码)编译成用于特定目标的可执行代码112。经由编译器与底层设备的通信在下文在图24-图32a中更详细地描述。
61.在至少一个实施例中,gpu 116支持具有稀疏属性的hmma和imma,其可以在中间源文件108中公开(例如,作为内部或中间指令)。在至少一个实施例中,中间源文件108(例如,ptx源文件)和优化代码生成器(ocg)之间的dag接口被配置为支持稀疏hmma和稀疏imma。在至少一个实施例中,dag接口是软件接口,其由一个或更多个处理器(例如,主机处理器、cpu)执行以生成用于编译器或dag与其他软件的接口。在至少一个实施例中,程序员可以修改dag,从而修改编译器,例如,以在编译时执行不同的操作。在至少一个实施例中,中间源文件108(例如,ptx源文件)中的稀疏hmma和稀疏imma类似于常规mma,但具有如下所述的添加。
62.在至少一个实施例中,gpu 116被设计为支持hmma和imma增强。在至少一个实施例中,增强需要改变前端(以公开(expose)新特征)和ocg。在至少一个实施例中,ocg是用于图代码的低级编译器。在至少一个实施例中,ocg处理寄存器分配、调度和窥孔优化(peephole optimization)。在至少一个实施例中,高级优化器处理计算代码并在管道输出到ocg之前执行传统的全局优化。在至少一个实施例中,ocg为图形处理器(例如,gpu 116)生成高效代码。在至少一个实施例中,中间源文件108(例如,ptx源文件)和ocg之间的dag接口被配置为支持稀疏hmma和imma。在至少一个实施例中,中间源文件108公开所述特征以允许用户利用硬件支持的mma运算。在至少一个实施例中,gpu 116被设计成通过添加稀疏模式和附加矩阵形状来扩展所述操作。在至少一个实施例中,新特征在前端(例如,ptx源文件108)中被公开。在至少一个实施例中,中间源文件108(诸如ptx源文件)与稀疏元数据输入和其他操作数一起公开新形状和稀疏模式。在至少一个实施例中,由中间源文件108前端将指令翻译成dag中间指令(ir),该dag中间指令又被翻译成ir。在至少一个实施例中,用于现有imma和hmma运算的dag和中间源文件108被更新以支持新特征。在至少一个实施例中,中间源文件108在被翻译成层叠样式表(sass)编码之前,经过ocg的几个阶段以被合法化、优化、寄存器分配和调度。
63.在至少一个实施例中,本文描述的技术包括第二编译器110中的技术优势,该第二
dag》(需要关于f32宏计算保持一致性,如下所述),以及输入“e”(稀疏元数据)。
69.在至少一个实施例中,例如,当需要链式连接时创建dag。在至少一个实施例中,以下mma指令需要链式连接:hmma.f r.f.xyzw(结果d的上4x32b),a.f16x2.xy,b.f16x2.xy,c.f.xyzw,d.f.xyzw,e.u.x
‑‑‑
。在至少一个实施例中,所述链如下:《矩阵a》、《矩阵b》、《矩阵c的上4x32b》、hmma.f r.f.xyzw(结果d的下4x32b),a.f16x2.xy
‑‑
,b.f16x2.xy
‑‑
,c.f.xyzw,d.f.
‑‑‑‑
(虚拟输入)、e.u.x
‑‑‑‑
、《矩阵a》、《矩阵b》、《矩阵c的下4x32b》、《虚拟输入:const dag》其中还有输入“e”(稀疏元数据)和相同的“e”稀疏元数据dag。
70.在至少一个实施例中,针对稀疏格式和稀疏id在hmma dag节点上设置子操作(例如,subops)。在至少一个实施例中,稀疏模式被设置为以下之一:isubop_fermi_mma_sp_mode_none,isubop_fermi_mma_sp_mode_tid或isubop_fermi_mma_sp_mode_regoffset。在至少一个实施例中,isubop_fermi_mma_sp_mode_none是指不稀疏并且是默认的。在至少一个实施例中,isubop_fermi_mma_sp_mode_tid是指稀疏tid模式。在至少一个实施例中,isubop_fermi_mma_sp_mode_regoffset是指稀疏regoffset模式。
71.在至少一个实施例中,实现从中间源文件108(例如,ptx源文件)修改器到sp_mode枚举的映射。在至少一个实施例中,被分配“关”的.sp是.spformat并且被分配“sp_mode_none”的sp模式。在至少一个实施例中,分配“开”的.sp是tid的.spformat,并且被分配“sp_mode_tid”的sp模式。在至少一个实施例中,被分配“开”的.sp是regoffset的.spformat,并且被分配“sp_mode_regoffset”的sp模式。
72.在至少一个实施例中,稀疏模式在hmma dag上被设置如下:setisubopfield_fermi(fop,isubop_fermi_mma_sp_mode,isubop_fermi_mma_sp_mode_tid)。在至少一个实施例中,稀疏id在hmma dag上被设置如下:setisubopfield_fermi(fop,isubop_fermi_mma_sp_id,《id imm value》)。在至少一个实施例中,为hmma和imma添加了形状枚举,其可以被设置如下:setisubopfield_fermi(fop,isubop_fermi_hmma_shape,isubop_fermi_hmma_160832);setisubopfield_fermi(fop,isubop_fermi_imma_shape,isubop_fermi_imma_8816)。
73.图2示出了根据至少一个实施例的以稀疏格式表示的矩阵(例如,16乘16)的示例和指示一组线程中的哪个线程存储元数据的稀疏选择器。在至少一个实施例中,使用用于不同矩阵形状和数据类型的不同粒度来代替图2中所示和描述的粒度。在至少一个实施例中,编译器被配置为接受稀疏信息以生成稀疏mma指令(以及如何表示该指令)。在至少一个实施例中,接口(例如,dag接口)被修改以接受稀疏信息。如图2所示以仅供参考,灰色区域突出显示原始稀疏矩阵202的对应于opd a 206和元数据208的部分。
74.在至少一个实施例中,原始稀疏矩阵202是稀疏矩阵。在至少一个实施例中,原始稀疏矩阵202是如图1中描述的稀疏矩阵,例如,它具有大多数零值(例如,具有零值的元素),如图2所示。在至少一个实施例中,稀疏mma指令的输入操作数204至少包括opd a 206和元数据208。在至少一个实施例中,opd a 206和元数据208是原始稀疏矩阵202的压缩版本。在至少一个实施例中,稀疏mma指令的输入操作数204类似于如以上图1中描述的稀疏mma指令的输入操作数。在至少一个实施例中,元数据208指的是存储原始稀疏矩阵202内的子块(sub-chunk)中的每个非零元素的索引的矩阵。在至少一个实施例中,元数据208内的索引是指向原始稀疏矩阵202内的位置的指针。在至少一个实施例中,元数据208与以上图1
中描述的元数据相同。在至少一个实施例中,opd a 206指的是存储原始稀疏矩阵202内的所述非零元素的矩阵。在至少一个实施例中,opd a 206类似于以上图1中描述的非零元素。在至少一个实施例中,元数据208的元素映射opd a 206的元素在原始稀疏矩阵202中的位置。在至少一个实施例中,压缩210是结合以上图1的压缩矩阵。
75.在至少一个实施例中,原始稀疏矩阵202和稀疏mma指令的输入操作数204中的数据类型可以是64位浮点(fp64)、32位浮点(fp32)、半精度浮点(fp16))、brian浮点(bfloat16或bf16)、flexpoint、tensorfloat-32(tf32)、整数或类似的矩阵乘法运算。在至少一个实施例中,本文描述的技术可以用于诸如bf16之类的数据类型。在至少一个实施例中,在.m16n8k16和.m16n8k32mma.sp运算期间,矩阵a以2:4的粒度被构造为稀疏的。在至少一个实施例中,矩阵a的行中四个相邻元素的每个块具有两个零元素和两个非零元素。在至少一个实施例中,仅两个非零元素被存储在表示矩阵a的操作数中,并且它们在矩阵a中的四个宽的块(four-wide chunk)中的位置由元数据操作数中的两个2位索引指示。在至少一个实施例中,稀疏选择器指示贡献元数据的线程。在至少一个实施例中,在.m16n8k16中,一组四个连续线程中的一个线程可以为整个组贡献元数据。在至少一个实施例中,所述线程可以由{0,1,2,3}中的值指示。在至少一个实施例中,在m16n8k32中,一组四个连续线程中的线程对可贡献稀疏元数据。因此,在至少一个实施例中,稀疏选择器可以是0(例如,线程t0、t1)或1(线程t2、t3);其他值可能会导致未定义的行为。
76.在至少一个实施例中,本文描述的技术可以用于诸如tf32之类的数据类型。在至少一个实施例中,例如,当矩阵a具有.tf32元素时,矩阵a以1:2的粒度被构造为稀疏的。在至少一个实施例中,矩阵a的行中两个相邻元素的每个块具有一个零元素和一个非零元素。在一个实施例中,仅非零元素被存储在矩阵a的操作数中,并且它们在矩阵a中的两个宽的块中的位置由元数据中的4位索引指示,如图3中所示。在至少一个实施例中,稀疏选择器指示贡献元数据的线程。在至少一个实施例中,在m16n8k8中,一组四个连续线程中的一个线程为整个组贡献元数据。在至少一个实施例中,所述线程由{0,1,2,3}中的值指示。在至少一个实施例中,在m16n8k16中,一组四个连续线程中的线程对贡献稀疏元数据。因此,在至少一个实施例中,稀疏选择器必须是0(线程t0、t1)或1(线程t2、t3);其他值可能导致未定义的行为。
77.在至少一个实施例中,本文描述的技术可以用于诸如整数之类的数据类型。在至少一个实施例中,例如,当矩阵a和b具有.u8/.s8元素时,矩阵a以2:4的粒度被构造为稀疏的。例如,在至少一个实施例中,矩阵a的行中四个相邻元素的每个块具有两个零元素和两个非零元素。在至少一个实施例中,只有两个非零元素被存储在稀疏矩阵中,并且它们在四个宽的块中的位置由元数据中的两个2位索引指示。在至少一个实施例中,当矩阵a和b具有.u4/.s4元素时,矩阵a以4:8的粒度按对(pair-wise)被构造为稀疏的。在至少一个实施例中,矩阵a的行中八个相邻元素的每个块具有四个零值和四个非零值。在至少一个实施例中,零值和非零值被聚类在两个元素的子块中,每个元素在八个宽的块内,例如,八个宽的块中的每个两个宽的子块必须全为零或全为非零。在至少一个实施例中,只有四个非零值被存储在稀疏矩阵中,并且具有非零值的两个两个宽的子块在矩阵a的行的八个宽的块中的位置由元数据中的两个2位索引指示。在至少一个实施例中,稀疏选择器指示贡献元数据的线程。在至少一个实施例中,例如,具有.u8/.s8类型的m16n8k32和具有.u4/.s4类型的
m16n8k64:一组四个连续线程中的线程对贡献稀疏元数据。在至少一个实施例中,稀疏选择器必须是0(线程t0、t1)或1(线程t2、t3);任何其他值都会导致未定义的行为。在至少一个实施例中,在具有.u8/.s8类型的m16n8k32和具有.u4/.s4类型的m16n8k64中:一组四个连续线程中的所有线程贡献稀疏元数据。在至少一个实施例中,这种情况下的稀疏选择器必须为0。
78.在至少一个实施例中,稀疏选择器的任何其他值都会导致未定义的行为。
79.在至少一个实施例中,本文描述的技术针对用于支持稀疏mma指令的编译器实现方式。在至少一个实施例中,密集mma指令由编译器支持,例如图1中的第二编译器110。在至少一个实施例中,可以将扩展特征添加到编译器以处理稀疏mma指令。在至少一个实施例中,稀疏信息在元数据寄存器中表示(在上述语法中表示为“re”)。在至少一个实施例中,本文描述的技术针对为gpu配置后端编译器。在至少一个实施例中,添加元数据寄存器“re”并且在最后一个操作数(在上述语法中表示为“info”)中添加附加信息,其中info包含至少两个字段(例如,sparsemode和sparseid)。在至少一个实施例中,在添加了稀疏元数据和info的情况下,提供了一种机器,关于它必须如何将数据ra压缩或打包成其原始密集形式,然后计算mma指令。在至少一个实施例中,编译器接收编程语言(其包括关于稀疏信息的信息)以编译成hmma机器指令。
80.在至少一个实施例中,编译器被配置有附加操作数和信息,以将代码编译成可执行代码(例如,并行线程可执行汇编“ptxa”语言)。在至少一个实施例中,所述编译器与前端编译器接口,该前端编译器解析ptx语言,例如可以是如以上图1中描述的ptx源文件的中间源文件108。在至少一个实施例中,后端编译器使用dag接口从ptxa前端获取re和info。在至少一个实施例中,稀疏mma至少包括hmma(例如,半浮点格式)和imma(例如,整数类型操作数,例如8位或4位整数)。在至少一个实施例中,指令(例如genmetadata)用于生成稀疏元数据操作数(re)。在至少一个实施例中,可以使用其他指令(4:2和/或2:1压缩)来压缩或解压缩用于稀疏矩阵乘法的矩阵元素。
81.在至少一个实施例中,密集矩阵被表示为稀疏矩阵形式,其中非零元素被压缩为原始大小的一半或更小。在至少一个实施例中,所述非零元素使用索引(re)来表示。在至少一个实施例中,如上文以所述hmma格式所述的,ra是稀疏矩阵,而其他矩阵是密集矩阵。在至少一个实施例中,ra在压缩(例如,4:2或2:1)之后被半压缩,其中四个元素被压缩成两个元素或两个元素被压缩成一个元素。在至少一个实施例中,当非零元素被压缩时,那些非零元素的索引(re)帮助跟踪那些非零在原始密集矩阵中的位置。在至少一个实施例中,使用稀疏矩阵,发生更少的计算操作,同时也使用更少的内存。在至少一个实施例中,将非零元素减少一半将导致计算速度快两倍。在至少一个实施例中,通过实施本文描述的技术,处理速度的增加还导致当在多种神经网络和/或各种gpu上使用时更快的端到端训练时间和推理时间。在至少一个实施例中,在执行压缩和稀疏矩阵运算之后,执行解压缩以反映所执行的运算。
82.在至少一个实施例中,ra是1x4子矩阵,其由以[0,0]、[0,1]、[1,0]、[1,1]作为位置编号的每个元素的位置组成。在至少一个实施例中,如果位置[0,0]和[1,1]被选择为在ra寄存器中,则re包含[0,0]和[1,1],ra寄存器中的非零元素的索引。
[0083]
图3示出了根据至少一个实施例的稀疏矩阵的稀疏元数据的示例。在至少一个实
施例中,来自矩阵a 302中的行的两个宽的块示出了压缩矩阵。在至少一个实施例中,来自矩阵a 302中的行的两个宽的块类似于以上图1和图2中所描述的块。在至少一个实施例中,来自矩阵a 302中的行的两个宽的块是来自矩阵a中的行的两个宽的块。在至少一个实施例中,所述数组下方的编号(例如,0、31、63)是指对应于矩阵a的列。在至少一个实施例中,来自矩阵a 302中的行的两个宽的块是从列0到列63的压缩数据。在至少一个实施例中,来自矩阵a 302中的行的两个宽的块示出了从列0到列31只有零元素(例如,列0到列31中不包含非零元素)。在至少一个实施例中,来自矩阵a 302中的行的两个宽的块示出了在列31和列63之间存在非零元素,由“x”表示。在至少一个实施例中,“x”充当非零元素的占位符。在至少一个实施例中,“x”具有数据类型,其取决于实现方式。在至少一个实施例中,可以配置x的所述数据类型。在至少一个实施例中,数据类型可以是:64位浮点(fp64)、32位浮点(fp32)、半精度浮点(fp16)、brian浮点(bfloat16或bf16)、flexpoint、tensorfloat-32(tf32)、整数或类似运算。在至少一个实施例中,“x”类似于以上图1中描述的非零元素。
[0084]
在至少一个实施例中,两个宽的块306内的元素的索引是指与来自矩阵a 302中的行的两个宽的块内的与位置关联的元素相对应的各个索引。在至少一个实施例中,在所述数组下方的编号(例如,0、31、63)指的是对应于矩阵a的列。在至少一个实施例中,两个宽的块306内的元素的索引结合图1进行操作。在至少一个实施例中,两个宽的块306内的元素11和10的索引具有非零值。在至少一个实施例中,两个宽的块306内的元素11和10的索引具有列31和列63之间的非零值“x”,如来自矩阵a 302中的行的两个宽的块所示。
[0085]
在至少一个实施例中,稀疏矩阵操作数304是对应于来自矩阵a 302中的行的两个宽的块的稀疏矩阵操作数。在至少一个实施例中,稀疏矩阵操作数304类似于以上图2中描述的opd a。在至少一个实施例中,元数据308是对应于来自矩阵a 302中的行的两个宽的块的元数据。在至少一个实施例中,元数据308类似于以上图1中描述的元数据。在至少一个实施例中,0b1110和0b0100只是有意义的索引值;任何其他值都会导致未定义的行为。
[0086]
图4示出了根据至少一个实施例的根据指令执行稀疏矩阵运算的过程400的示例。在至少一个实施例中,图1-图3中公开的系统可以执行全部过程400的一部分。在至少一个实施例中,过程400由过程435、445、455和/或465组成。在至少一个实施例中,一个或更多个电路、一个或更多个处理器(例如,cpu、gpu)、一个或更多个api或一个或更多个系统可以执行过程400或过程400、435、445、455和465的一部分(如图4a、图4b、图4c、图4d和图4e中的“b”、“c”、“d”和“e”所示)。在至少一个实施例中,过程400、435、445、455和465(或本文描述的任何其他过程,或其变体和/或组合)中的一些或全部在配置有计算机可执行指令的一个或更多个计算机系统的控制下执行,这些计算机可执行指令被实现为由硬件、软件或其组合在一个或更多个处理器上共同执行的代码(例如,计算机可执行指令、一个或更多个计算机程序或一个或更多个应用程序)。在至少一个实施例中,代码以计算机程序的形式存储在计算机可读存储介质上,该计算机程序包括可由一个或更多个处理器执行的多个计算机可读指令。在至少一个实施例中,计算机可读存储介质是非暂时性计算机可读介质。在至少一个实施例中,可用于执行过程400的至少一些计算机可读指令不是仅使用瞬态信号(例如,传播的瞬态电或电磁传输)来存储的。在至少一个实施例中,非暂时性计算机可读介质不一定包括暂时性信号的收发器内的非暂时性数据存储电路(例如,缓冲器、高速缓存和队列)。
[0087]
在至少一个实施例中,过程400、435、445、455和465包括用于使稀疏矩阵运算(例
如,mma、imma、hmma)根据生成的指令被执行的一个或更多个过程。在至少一个实施例中,过程400、435、445、455和465由诸如本公开中描述的那些系统(例如,诸如cpu之类的主机处理器和诸如gpu之类的设备处理器)之类的一个或更多个系统执行。在至少一个实施例中,过程400、435、445、455和465由诸如结合图1描述的那些系统之类的系统执行。在至少一个实施例中,过程400、435、445、455和465的一个或更多个操作以任何合适的顺序执行,包括顺序的、并行的和/或其变体,并且使用任何合适的处理单元执行,例如cpu、gpgpu、gpu、ppu和/或其变体。在至少一个实施例中,在一个或更多个神经网络上同时执行过程400、435、445、455和465。
[0088]
在至少一个实施例中,执行过程400的至少一部分的所述系统接收指令以执行稀疏矩阵运算410,如结合图1所描述的。在至少一个实施例中,所述系统生成所述指令以执行一个或更多个计算操作。在至少一个实施例中,编译器,例如图1中的第二编译器110,被配置为接收稀疏信息。在至少一个实施例中,稀疏信息在附加操作数中表示,该附加操作数被添加到现有矩阵乘法和累加(mma)指令,并由所述编译器处理以生成用于gpu的可执行指令。
[0089]
在接收指令操作410处,主处理器、片上系统或处理器接收指令以执行与稀疏矩阵的矩阵乘法运算(例如,如图1-3中所公开的)。在至少一个实施例中,作为神经网络操作或机器学习操作的一部分,程序员创建具有一个或更多个聚集、压缩、相乘和解压缩(例如,或分散)指令的源代码文件。例如,程序员可以在cuda中起草第一、第二、第三和第四指令,以与稀疏矩阵执行矩阵运算,包括聚集、压缩、相乘和解压缩的函数。在至少一个实施例中,程序员的指令由api(例如,cuda api)接收,该api使所述指令被转换为较低级别指令(例如,ptx可读源代码)。在至少一个实施例中,程序员直接写入较低级别指令以生成源文件(例如,诸如图1中所示的ptx源文件之类的ptx代码)。在至少一个实施例中,在将源代码编译成可执行设备代码(例如,用于一个或更多个gpu)之前执行接收指令操作,其中指令由编译器(例如,ptx编译器)或设备代码(例如,生成gpu可执行代码的编译器)接收。在至少一个实施例中,由一个或更多个处理器执行的一个或更多个api执行全部或部分接收指令操作410。
[0090]
在生成压缩数组操作415处,处理器、片上系统或处理器接收生成或执行压缩指令。在至少一个实施例中,一个或更多个电路执行api以压缩一个或更多个矩阵,其中压缩是使一个或更多个处理器仅将稀疏矩阵的非零值存储在一个或更多个处理器核或单元(例如,一个或更多个gpu或图形处理核心)可访问的存储器中的操作。在至少一个实施例中,压缩操作包括从稀疏矩阵生成具有非零值的压缩数组(例如,cuda数组)。在至少一个实施例中,压缩操作可以生成压缩数据结构,例如压缩行、压缩列、压缩向量,或其他数据结构,例如具有特定形状或大小的矩阵。在至少一个实施例中,在生成压缩数组操作415中,处理器、片上系统或处理器接收生成数组或元数据,该数组或元数据将稀疏矩阵的非零值的索引存储在gpu或一个或更多个图形处理核心可访问的存储器中(例如,以便由在gpu上执行的一个或更多个线程执行的mma运算期间可以访问它)。在至少一个实施例中,压缩数组操作415使一个或更多个处理器以二进制格式或压缩格式存储非零值的索引。
[0091]
在生成压缩数组操作415处,在至少一个实施例中,在一个或更多个图形处理单元上执行指令的一个或更多个驱动器可以访问所存储的压缩非零值和用于所述非零值的索引。在至少一个实施例中,编译器编译包括压缩数组操作415的指令以生成中间指令或可执
行指令,以指示矩阵的哪些值是非零。在至少一个实施例中,执行所述聚集指令返回指示哪些值是非零的索引数组。例如,如果矩阵的仅第一、第四和第九个元素是所述非零值,则执行所述聚集指令将返回1、4和9。在至少一个实施例中,第二指令(称为“压缩指令”或归约指令)用于生成矩阵的压缩表示。在至少一个实施例中,执行所述压缩指令使矩阵的非零元素与来自第一指令的索引一起被存储(没有零)。例如,执行压缩指令的一个或更多个处理器使所述一个或更多个处理器生成压缩数组,其存储稀疏矩阵的非零元素的值。在至少一个实施例中,由一个或更多个处理器执行的一个或更多个api执行压缩数组操作415。
[0092]
在执行稀疏矩阵运算420处,处理器、一个或更多个电路、片上系统或处理核执行指令以执行矩阵乘法(例如,执行“mma指令”)。在至少一个实施例中,执行稀疏矩阵运算420包括对两个或更多个矩阵操作数执行mma运算,其中所述操作数中的至少一个是使用压缩指令压缩的(参见操作415)。在至少一个实施例中,执行所述指令使用索引来执行mma运算(例如,没有不必要的与零的相乘)。在至少一个实施例中,由一个或更多个处理器执行的一个或更多个api执行稀疏矩阵运算420。在至少一个实施例中,稀疏矩阵运算420包括图1-3中公开的运算,例如hmma、imma或与稀疏矩阵的其他矩阵乘法运算。
[0093]
在生成解压缩数据结构操作425处,一个或更多个处理器或一个或更多个电路生成接收第四指令,然后生成“分散指令”以存储来自非零值的矩阵(连同零值)和来自第二(压缩指令)的索引。在至少一个实施例中,一个或更多个处理器执行所述分散指令并将所述解压缩矩阵存储在数据结构(例如,矩阵)中。在至少一个实施例中,所述第四指令用于对压缩矩阵进行解压缩,其可以由api执行或生成,所述api由一个或更多个处理器执行,其中所述api是用于执行稀疏矩阵乘法运算的api库的一部分。在至少一个实施例中,解压缩数据结构操作425包括图1-3中公开的操作,例如hmma、imma或与稀疏矩阵的矩阵乘法运算。
[0094]
在确定操作430处,在至少一个实施例中,处理器、一个或更多个电路、片上系统或执行过程400的至少一部分的系统至少基于425执行的稀疏矩阵运算确定是否有更多稀疏矩阵运算要执行。在至少一个实施例中,如果执行过程400的至少一部分的所述系统确定存在要执行的附加稀疏矩阵运算,则执行过程400的至少一部分的所述系统执行稀疏矩阵运算420,直到完成所有稀疏矩阵运算。在至少一个实施例中,如果执行过程400的至少一部分的所述系统确定没有要执行的附加稀疏矩阵运算,则过程400结束。
[0095]
如图4b所示,在至少一个实施例中,一个或更多个电路执行过程435以执行操作,以指示一个或更多个数据矩阵内的一个或更多个非零值。在至少一个实施例中,一个或更多个电路作为执行过程400的一部分执行过程435。在获得压缩指令的操作437处,在至少一个实施例中,处理器接收指令、api输出、执行api调用或接收源代码文件(例如,如图1中所公开的)以压缩诸如稀疏矩阵之类的数据结构。在确定数据结构的非零值的索引的操作439处,在至少一个实施例中,一个或更多个电路或一个或更多个处理器(例如,主机处理器、gpu或cpu)确定矩阵的元素是否为非零,并将所述非零值的索引存储在存储器中(例如,存储在一个或更多个图形处理核心可访问的存储器中)。例如,处理器确定矩阵的每个元素是零还是非零值,并且如果所述处理器确定元素是非零,则它在索引操作439中生成包括索引的元数据并存储所述非零值的索引。例如,一个或更多个电路可以确定矩阵[0 0 3 0]具有一个非零值并且它是三,并且它可以存储该(1,3)以指示所述非零值具有行1和列3的索引。在至少一个实施例中,存储所述索引值可以包括编译器接收压缩稀疏数据结构的指令,并
且所述编译器生成包括索引值的操作数。在至少一个实施例中,在生成操作441处,处理器、一个或更多个电路、片上系统或执行过程435的至少一部分的系统确定是否已经分析矩阵的所有值以确定非零值和对应的索引。在至少一个实施例中,如果执行过程435的至少一部分的所述系统确定还有更多矩阵要分析,则它可以继续对其进行分析。在至少一个实施例中,如果执行过程435的至少一部分的所述系统确定没有附加值要分析,则过程435结束。
[0096]
如图4c所示,在至少一个实施例中,一个或更多个电路执行过程445以执行api,以压缩一个或更多个数据矩阵。在获得压缩指令的操作447处,在至少一个实施例中,处理器接收指令、api输出、执行api调用或接收源代码文件(例如,如图1中所公开的)以压缩数据结构,例如稀疏矩阵。在确定数据结构的非零值的操作449处,在至少一个实施例中,一个或更多个电路或一个或更多个处理器(例如,主机处理器、gpu或cpu)确定矩阵的元素是否为非零。例如,处理器确定矩阵的每个元素是零还是非零值,并且如果所述处理器确定元素是非零,则它执行生成压缩数据结构操作449并存储所述非零值的值。例如,一个或更多个电路可以确定矩阵[0 0 3 0]具有一个非零值并且它是三个,并且它可以将该值存储在数组中。在至少一个实施例中,在确定操作452处,处理器、一个或更多个电路、片上系统或执行过程445的至少一部分的系统确定是否已经分析矩阵的所有值以确定非零值。在至少一个实施例中,如果执行过程445的至少一部分的所述系统确定还有更多矩阵要分析,则它可以继续对其进行分析。在至少一个实施例中,如果执行过程445的至少一部分的所述系统确定没有附加值要分析,则过程445结束。
[0097]
如图4d所示,在至少一个实施例中,一个或更多个电路执行过程455以对两个或更多个数据矩阵执行矩阵乘法累加(mma)运算,其中两个或更多个矩阵中的至少一个包含压缩数据。在至少一个实施例中,所述两个或更多个矩阵由过程435和445生成,其中一个矩阵是包括非零值的索引值的矩阵,而另一个是所述压缩矩阵。在获得操作457处,一个或更多个电路接收指令以执行矩阵乘法运算,例如通过从编译器接收指令或从源代码或api调用接收指令。在接收操作459处,一个或更多个电路接收压缩数组中的非零值并从过程435和445接收非零值的索引值。在执行乘法操作461处,一个或更多个电路使用两个或更多个数据矩阵执行矩阵乘法运算,其中两个或更多个矩阵中的至少一个包含压缩数据(例如,具有索引值的压缩数组)。
[0098]
如图4e所示,在至少一个实施例中,一个或更多个电路执行过程465执行api,以解压缩一个或更多个数据矩阵。在至少一个实施例中,一个或更多个电路执行过程465以执行api,以解压缩一个或更多个数据矩阵。在获得压缩指令的操作467处,在至少一个实施例中,处理器接收指令、api输出、执行api调用或接收源代码文件(例如,如图1中所公开的)以对数据结构进行解压缩,例如稀疏矩阵。例如,在过程455中对稀疏矩阵进行矩阵乘法之后,处理器接收生成扩展矩阵并执行分散操作的指令。在接收操作469处,一个或更多个电路接收矩阵乘法结果的非零值的索引值。在生成解压缩矩阵操作处,一个或更多个电路通过执行如过程400中公开的分散操作来生成解压缩矩阵。在至少一个实施例中,如果执行过程465的至少一部分的所述系统确定存在更多矩阵要解压缩,则可以继续解压缩它。在至少一个实施例中,如果执行过程465的至少一部分的所述系统确定没有附加值要分析,则过程465结束。
[0099]
数据中心
[0100]
图5示出了根据至少一个实施例的示例数据中心500。在至少一个实施例中,数据中心500包括图1-3中公开的系统,并且可以执行图4中的部分或全部过程400。在至少一个实施例中,数据中心500包括但不限于数据中心基础设施层510、框架层520、软件层530和应用层540。
[0101]
在至少一个实施例中,如图5所示,数据中心基础设施层510可以包括资源协调器512、分组的计算资源514和节点计算资源(“节点c.r.”)516(1)-516(n),其中“n”代表任何完整的正整数。在至少一个实施例中,节点c.r.516(1)-516(n)可以包括但不限于任意数量的中央处理单元(“cpu”)或其他处理器(包括加速器、现场可编程门阵列(“fpga”)、网络设备中的数据处理单元(“dpu”)、图形处理器等),存储器设备(例如动态只读存储器),存储设备(例如固态硬盘或磁盘驱动器),网络输入/输出(“nwi/o”)设备,网络交换机,虚拟机(“vm”),电源模块和冷却模块等。在至少一个实施例中,节点c.r.516(1)-516(n)中的一个或更多个节点c.r.可以是具有一个或更多个上述计算资源的服务器。
[0102]
在至少一个实施例中,分组的计算资源514可以包括容纳在一个或更多个机架内的节点c.r.的单独分组(未示出),或者容纳在各个地理位置的数据中心内的许多机架(也未示出)。分组的计算资源514内的节点c.r.的单独分组可以包括可以被配置或分配为支持一个或更多个工作负载的分组的计算、网络、存储器或存储资源。在至少一个实施例中,可以将包括cpu或处理器的几个节点c.r.分组在一个或更多个机架内,以提供计算资源来支持一个或更多个工作负载。在至少一个实施例中,一个或更多个机架还可以包括任意数量的电源模块、冷却模块和网络交换机,以任意组合。
[0103]
在至少一个实施例中,资源协调器512可以配置或以其他方式控制一个或更多个节点c.r.516(1)-516(n)和/或分组的计算资源514。在至少一个实施例中,资源协调器512可以包括用于数据中心500的软件设计基础结构(“sdi”)管理实体。在至少一个实施例中,资源协调器512可以包括硬件、软件或其某种组合。
[0104]
在至少一个实施例中,如图5所示,框架层520包括但不限于作业调度器532、配置管理器534、资源管理器536和分布式文件系统538。在至少一个实施例中,框架层520可以包括支持软件层530的软件552和/或应用程序层540的一个或更多个应用程序542的框架。在至少一个实施例中,软件552或应用程序542可以分别包括基于web的服务软件或应用程序,例如由amazon web services,google cloud和microsoft azure提供的服务或应用程序。在至少一个实施例中,框架层520可以是但不限于一种免费和开放源软件网络应用框架,例如可以利用分布式文件系统538来进行大范围数据处理(例如“大数据”)的apache sparktm(以下称为“spark”)。在至少一个实施例中,作业调度器532可以包括spark驱动器,以促进对数据中心500的各个层所支持的工作负载进行调度。在至少一个实施例中,配置管理器534可以能够配置不同的层,例如软件层530和包括spark和用于支持大规模数据处理的分布式文件系统538的框架层520。在至少一个实施例中,资源管理器536能够管理映射到或分配用于支持分布式文件系统538和作业调度器532的集群或分组计算资源。在至少一个实施例中,集群或分组计算资源可以包括数据中心基础设施层510上的分组的计算资源514。在至少一个实施例中,资源管理器536可以与资源协调器512协调以管理这些映射的或分配的计算资源。
[0105]
在至少一个实施例中,包括在软件层530中的软件552可以包括由节点c.r.516
(1)-516(n)的至少一部分,分组计算资源514和/或框架层520的分布式文件系统538使用的软件。一种或更多种类型的软件可以包括但不限于internet网页搜索软件、电子邮件病毒扫描软件、数据库软件和流视频内容软件。
[0106]
在至少一个实施例中,应用层540中包括的一个或更多个应用程序542可以包括由节点c.r.516(1)-516(n)的至少一部分、分组的计算资源514和/或框架层520的分布式文件系统538使用的一种或更多种类型的应用程序。一种或更多种类型的应用程序可以包括但不限于cuda应用程序。
[0107]
在至少一个实施例中,配置管理器534、资源管理器536和资源协调器512中的任何一个可以基于以任何技术上可行的方式获取的任意数量和类型的数据来实现任意数量和类型的自我修改动作。在至少一个实施例中,自我修改动作可以减轻数据中心500的数据中心操作员做出可能不好的配置决定并且可以避免数据中心的未充分利用和/或执行差的部分。
[0108]
基于计算机的系统
[0109]
以下各图提出但不限于可用于实现至少一个实施例的示例性的基于计算机的系统。
[0110]
图6示出了根据至少一个实施例的处理系统600。在至少一个实施例中,处理系统600包括在图1-3中公开的系统中,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,处理系统600包括一个或更多个处理器602和一个或更多个图形处理器608,并且可以是单处理器台式机系统、多处理器工作站系统或具有大量处理器602或处理器核心607的服务器系统。在至少一个实施例中,处理系统600是结合在片上系统(soc)集成电路内的处理平台,以用于移动、手持或嵌入式设备。
[0111]
在至少一个实施例中,处理系统600可以包括或结合在基于服务器的游戏平台中,包括游戏和媒体控制台的游戏控制台、移动游戏控制台、手持游戏控制台或在线游戏控制台。在至少一个实施例中,处理系统600是移动电话、智能电话、平板计算设备或移动互联网设备。在至少一个实施例中,处理系统600还可包括与可穿戴设备耦合或集成在可穿戴设备中,例如智能手表可穿戴设备、智能眼镜设备、增强现实设备或虚拟现实设备。在至少一个实施例中,处理系统600是电视或机顶盒设备,其具有一个或更多个处理器602以及由一个或更多个图形处理器608生成的图形界面。
[0112]
在至少一个实施例中,一个或更多个处理器602每个包括一个或更多个处理器核心607,以处理指令,该指令在被执行时执行针对系统和用户软件的操作。在至少一个实施例中,一个或更多个处理器核心607中的每一个被配置为处理特定指令集609。在至少一个实施例中,指令集609可以促进复杂指令集计算(cisc)、精简指令集计算(risc),或通过超长指令字(vliw)进行计算。在至少一个实施例中,多个处理器核心607可以各自处理不同的指令集609,该指令集609可以包括有助于仿真其他指令集的指令。在至少一个实施例中,处理器核心607还可以包括其他处理设备,例如数字信号处理器(dsp)。
[0113]
在至少一个实施例中,处理器602包括高速缓存存储器(cache)604。在至少一个实施例中,处理器602可以具有单个内部高速缓存或多个级别的内部高速缓存。在至少一个实施例中,高速缓存存储器在处理器602的各个组件之间共享。在至少一个实施例中,处理器602还使用外部高速缓存(例如,三级(l3)高速缓存或最后一级高速缓存(llc))(未示出),
其可以使用已知的高速缓存一致性技术在处理器核心607之间共享该逻辑。在至少一个实施例中,处理器602中另外包括寄存器文件606,处理器602可以包括用于存储不同类型的数据的不同类型的寄存器(例如,整数寄存器、浮点寄存器、状态寄存器和指令指针寄存器)。在至少一个实施例中,寄存器文件606可以包括通用寄存器或其他寄存器。
[0114]
在至少一个实施例中,一个或更多个处理器602与一个或更多个接口总线610耦合,以在处理器602与系统600中的其他组件之间传输通信信号,例如地址、数据或控制信号。在至少一个实施例中,接口总线610在一个实施例中可以是处理器总线,例如直接媒体接口(dmi)总线的版本。在至少一个实施例中,接口总线610不限于dmi总线,并且可以包括一个或更多个外围组件互连总线(例如,pci,pciexpress)、存储器总线或其他类型的接口总线。在至少一个实施例中,处理器602包括集成存储器控制器616和平台控制器集线器630。在至少一个实施例中,存储器控制器616促进存储设备与处理系统600的其他组件之间的通信,而平台控制器集线器(pch)630通过本地i/o总线提供到输入/输出(i/o)设备的连接。
[0115]
在至少一个实施例中,存储器设备620可以是动态随机存取存储器(dram)设备、静态随机存取存储器(sram)设备、闪存设备、相变存储设备或具有适当的性能以用作处理器存储器。在至少一个实施例中,存储器设备620可以用作处理系统600的系统存储器,以存储数据622和指令621,以在一个或更多个处理器602执行应用或过程时使用。在至少一个实施例中,存储器控制器616还与可选的外部图形处理器612耦合,其可以与处理器602中的一个或更多个图形处理器608通信以执行图和媒体操作。在至少一个实施例中,显示设备611可以连接至处理器602。在至少一个实施例中,显示设备611可以包括内部显示设备中的一个或更多个,例如在移动电子设备或便携式计算机设备或通过显示器接口(例如显示端口(displayport)等)连接的外部显示设备。在至少一个实施例中,显示设备611可以包括头戴式显示器(hmd),诸如用于虚拟现实(vr)应用或增强现实(ar)应用中的立体显示设备。
[0116]
在至少一个实施例中,平台控制器集线器630使外围设备能够通过高速i/o总线连接到存储器设备620和处理器602。在至少一个实施例中,i/o外围设备包括但不限于音频控制器646、网络控制器634、固件接口628、无线收发器626、触摸传感器625、数据存储设备624(例如,硬盘驱动器、闪存等)。在至少一个实施例中,数据存储设备624可以经由存储器接口(例如,sata)或经由外围总线来连接,诸如外围组件互连总线(例如,pci、pcie)。在至少一个实施例中,触摸传感器625可以包括触摸屏传感器、压力传感器或指纹传感器。在至少一个实施例中,无线收发器626可以是wi-fi收发器、蓝牙收发器或移动网络收发器,诸如3g、4g或长期演进(lte)收发器。在至少一个实施例中,固件接口628使能与系统固件的通信,并且可以是例如统一的可扩展固件接口(uefi)。在至少一个实施例中,网络控制器634可以启用到有线网络的网络连接。在至少一个实施例中,高性能网络控制器(未示出)与接口总线610耦合。在至少一个实施例中,音频控制器646是多通道高清晰度音频控制器。在至少一个实施例中,处理系统600包括可选的传统(legacy)i/o控制器640,用于将遗留(例如,个人系统2(ps/2))设备耦合到处理系统600。在至少一个实施例中,平台控制器集线器630还可以连接到一个或更多个通用串行总线(usb)控制器642,该控制器连接输入设备,诸如键盘和鼠标组合643、相机644或其他usb输入设备。
[0117]
在至少一个实施例中,存储器控制器616和平台控制器集线器630的实例可以集成
到离散的外部图形处理器中,例如外部图形处理器612。在至少一个实施例中,平台控制器集线器630和/或存储控制器616可以在一个或更多个处理器602的外部。例如,在至少一个实施例中,处理系统600可以包括外部存储控制器616和平台控制器集线器630,其可以配置成在与处理器602通信的系统芯片组中的存储器控制器集线器和外围控制器集线器。
[0118]
图7示出了根据至少一个实施例的计算机系统700。在至少一个实施例中,计算机系统700包括在图1-3中公开的一个或更多个系统,并且可以执行图4中公开的所有过程400的一部分。在至少一个实施例中,计算机系统700可以是具有互连的设备和组件,soc,或某种组合的系统。在至少一个实施例中,计算机系统700由处理器702形成,该处理器702可以包括用于执行指令的执行单元。在至少一个实施例中,计算机系统700可以包括但不限于组件,例如处理器702,其采用包括逻辑的执行单元以执行用于过程数据的算法。在至少一个实施例中,计算机系统700可以包括处理器,例如可从加利福尼亚圣塔克拉拉的英特尔公司(intel corporation of santa clara,california)获得的处理器家族、xeontm、xscaletm和/或strongarmtm,core
tm
或nervana
tm
微处理器,尽管也可以使用其他系统(包括具有其他微处理器的pc、工程工作站、机顶盒等)。在至少一个实施例中,计算机系统700可以执行可从华盛顿州雷蒙德市的微软公司(microsoft corporation of redmond,wash.)获得的windows操作系统版本,尽管其他操作系统(例如unix和linux)、嵌入式软件和/或图形用户界面也可以使用。
[0119]
在至少一个实施例中,计算机系统700可以用在其他设备中,例如手持设备和嵌入式应用。手持设备的一些示例包括蜂窝电话、互联网协议(internet protocol)设备、数码相机、个人数字助理(“pda”)和手持pc。在至少一个实施例中,嵌入式应用可以包括微控制器、数字信号处理器(“dsp”)、soc、网络计算机(“netpc”)、机顶盒、网络集线器、广域网(“wan”)交换机,或根据至少一个实施例可以执行一个或更多个指令的任何其他系统。
[0120]
在至少一个实施例中,计算机系统700可包括但不限于处理器702,该处理器702可包括但不限于一个或更多个执行单元708,其可以配置为执行计算统一设备架构(“cuda”)(由加利福尼亚州圣克拉拉的nvidia corporation开发)程序。在至少一个实施例中,cuda程序是用cuda编程语言编写的软件应用程序的至少一部分。在至少一个实施例中,计算机系统700是单处理器台式机或服务器系统。在至少一个实施例中,计算机系统700可以是多处理器系统。在至少一个实施例中,处理器702可以包括但不限于cisc微处理器、risc微处理器、vliw微处理器、实现指令集组合的处理器,或任何其他处理器设备,例如数字信号处理器。在至少一个实施例中,处理器702可以耦合到处理器总线710,该处理器总线710可以在处理器702与计算机系统700中的其他组件之间传输数据信号。
[0121]
在至少一个实施例中,处理器702可以包括但不限于1级(“l1”)内部高速缓存存储器(“cache”)704。在至少一个实施例中,处理器702可以具有单个内部高速缓存或多级内部缓存。在至少一个实施例中,高速缓存存储器可以驻留在处理器702的外部。在至少一个实施例中,处理器702可以包括内部和外部高速缓存的组合。在至少一个实施例中,寄存器文件706可以在各种寄存器中存储不同类型的数据,包括但不限于整数寄存器、浮点寄存器、状态寄存器和指令指针寄存器。
[0122]
在至少一个实施例中,包括但不限于执行整数和浮点运算的逻辑的执行单元708,其也位于处理器702中。处理器702还可以包括微码(“ucode”)只读存储器(“rom”),用于存
储某些宏指令的微代码。在至少一个实施例中,执行单元708可以包括用于处理封装指令集709的逻辑。在至少一个实施例中,通过将封装指令集709包括在通用处理器702的指令集中,以及要执行指令的相关电路,可以使用通用处理器702中的封装数据来执行许多多媒体应用程序使用的操作。在至少一个实施例中,可以通过使用处理器的数据总线的全宽度来在封装的数据上执行操作来加速和更有效地执行许多多媒体应用程序,这可能不需要在处理器的数据总线上传输较小的数据单元来一次对一个数据元素执行一个或更多个操作。
[0123]
在至少一个实施例中,执行单元708也可以用在微控制器、嵌入式处理器、图形设备、dsp和其他类型的逻辑电路中。在至少一个实施例中,计算机系统700可以包括但不限于存储器720。在至少一个实施例中,存储器720可以被实现为dram设备、sram设备、闪存设备或其他存储设备。存储器720可以存储由处理器702可以执行的由数据信号表示的指令719和/或数据721。
[0124]
在至少一个实施例中,系统逻辑芯片可以耦合到处理器总线710和存储器720。在至少一个实施例中,系统逻辑芯片可以包括但不限于存储器控制器集线器(“mch”)716,并且处理器702可以经由处理器总线710与mch716通信。在至少一个实施例中,mch716可以提供到存储器720的高带宽存储器路径718以用于指令和数据存储以及用于图形命令、数据和纹理的存储。在至少一个实施例中,mch716可以在处理器702、存储器720和计算机系统700中的其他组件之间启动数据信号,并且在处理器总线710、存储器720和系统i/o722之间桥接数据信号。在至少一个实施例中,系统逻辑芯片可以提供用于耦合到图形控制器的图形端口。在至少一个实施例中,mch716可以通过高带宽存储器路径718耦合到存储器720,并且图形/视频卡712可以通过加速图形端口(accelerated graphics port)(“agp”)互连714耦合到mch716。
[0125]
在至少一个实施例中,计算机系统700可以使用系统i/o722作为专有集线器接口总线来将mch716耦合到i/o控制器集线器(“ich”)730。在至少一个实施例中,ich730可以通过本地i/o总线提供与某些i/o设备的直接连接。在至少一个实施例中,本地i/o总线可以包括但不限于用于将外围设备连接到存储器720、芯片组和处理器702的高速i/o总线。示例可以包括但不限于音频控制器729、固件集线器(“flash bios”)728、无线收发器726、数据存储724、包含用户输入725的传统i/o控制器723和键盘接口、串行扩展端口727(例如usb)和网络控制器734。数据存储724可以包括硬盘驱动器、软盘驱动器、cd-rom设备、闪存设备或其他大容量存储设备。
[0126]
在至少一个实施例中,图7示出了包括互连的硬件设备或“芯片”的系统。在至少一个实施例中,图7可以示出示例性soc。在至少一个实施例中,图7中示出的设备可以与专有互连、标准化互连(例如,pcie)或其某种组合互连。在至少一个实施例中,系统700的一个或更多个组件使用计算快速链路(cxl)互连来互连。
[0127]
图8示出了根据至少一个实施例的系统800。在至少一个实施例中,系统800包括在图1-3中公开的一个或更多个系统中,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,系统800是利用处理器810的电子设备。在至少一个实施例中,系统800可以是,例如但不限于,笔记本电脑、塔式服务器、机架服务器、刀片服务器、通信地耦合到一个或更多个场所内或云服务提供商的边缘设备、膝上型计算机、台式机、平板电脑、移动设备、电话、嵌入式计算机或任何其他合适的电子设备。
[0128]
在至少一个实施例中,系统800可以包括但不限于通信地耦合到任何合适数量或种类的组件、外围设备、模块或设备的处理器810。在至少一个实施例中,处理器810使用总线或接口耦合,诸如i2c总线、系统管理总线(“smbus”)、低引脚数(lpc)总线、串行外围接口(“spi”)、高清音频(“hda”)总线、串行高级技术附件(“sata”)总线、usb(1、2、3版)或通用异步接收器/发送器(“uart”)总线。在至少一个实施例中,图8示出了系统,该系统包括互连的硬件设备或“芯片”。在至少一个实施例中,图8可以示出示例性soc。在至少一个实施例中,图8中所示的设备可以与专有互连线、标准化互连(例如,pcie)或其某种组合互连。在至少一个实施例中,图8的一个或更多个组件使用计算快速链路(cxl)互连线来互连。
[0129]
在至少一个实施例中,图8可以包括显示器824、触摸屏825、触摸板830、近场通信单元(“nfc”)845、传感器集线器840、热传感器846、快速芯片组(“ec”)835、可信平台模块(“tpm”)838、bios/固件/闪存(“bios,fw flash”)822、dsp860、固态磁盘(“ssd”)或硬盘驱动器(“hdd”)820、无线局域网单元(“wlan”)850、蓝牙单元852、无线广域网单元(“wwan”)856、全球定位系统(gps)855、相机(“usb3.0相机”)854(例如usb3.0相机)或以例如lpddr3标准实现的低功耗双倍数据速率(“lpddr”)存储器单元(“lpddr3”)815。这些组件可以各自以任何合适的方式实现。
[0130]
在至少一个实施例中,其他组件可以通过以上讨论的组件通信地耦合到处理器810。在至少一个实施例中,加速度计841、环境光传感器(“als”)842、罗盘843和陀螺仪844可以可通信地耦合到传感器集线器840。在至少一个实施例中,热传感器839、风扇837、键盘846和触摸板830可以通信地耦合到ec835。在至少一个实施例中,扬声器863、耳机864和麦克风(“mic”)865可以通信地耦合到音频单元(“音频编解码器和d类放大器”)864,其又可以通信地耦合到dsp860。在至少一个实施例中,音频单元864可以包括例如但不限于音频编码器/解码器(“编解码器”)和d类放大器。在至少一个实施例中,sim卡(“sim”)857可以通信地耦合到wwan单元856。在至少一个实施例中,组件(诸如wlan单元850和蓝牙单元852以及wwan单元856)可以被实现为下一代形式因素(ngff)。
[0131]
图9示出了根据至少一个实施例的示例性集成电路900。在至少一个实施例中,集成电路900可以包括在图1-3中公开的一个或更多个系统中,并且可执行图4中的所有过程400的一部分在至少一个实施例中,示例性集成电路900是soc,其可使用一个或更多个ip核心制造。在至少一个实施例中,集成电路900包括一个或更多个应用处理器905(例如,cpu、dpu)、至少一个图形处理器910,并且可以另外包括图像处理器915和/或视频处理器920,其中任意一个可能是模块化ip核心。在至少一个实施例中,集成电路900包括外围或总线逻辑,其包括usb控制器925、uart控制器930、spi/sdio控制器935和i2s/i2c控制器940。在至少一个实施例中,集成电路900可以包括显示设备945耦合到高清多媒体接口(hdmi)控制器950和移动工业处理器接口(mipi)显示接口955中的一个或更多个。在至少一个实施例中,存储可以由闪存子系统960提供,包括闪存和闪存控制器。在至少一个实施例中,可以经由存储器控制器965提供存储器接口以用于访问sdram或sram存储器设备。在至少一个实施例中,一些集成电路还包括嵌入式安全引擎970。
[0132]
图10示出了根据至少一个实施例的计算系统1000。在至少一个实施例中,计算系统1000可以包括在图1-3中公开的一个或更多个系统中,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,计算系统1000包括处理子系统1001,其具有经由可以
包括存储器集线器1005的互连路径通信的一个或更多个处理器1002和系统存储器1004。在至少一个实施例中,存储器集线器1005可以是芯片组组件内的单独组件,也可以集成在一个或更多个处理器1002内。在至少一个实施例中,存储器集线器1005通过通信链路1006与i/o子系统1011耦合。在至少一个实施例中,i/o子系统1011包括i/o集线器1007,其可以使计算系统1000能够接收来自一个或更多个输入设备1008的输入。在至少一个实施例中,i/o集线器1007可以使能显示控制器,其包括在一个或更多个处理器1002中,用于向一个或更多个显示设备1010a提供输出。在至少一个实施例中,与i/o集线器1007耦合的一个或更多个显示设备1010a可以包括本地、内部或嵌入式显示设备。
[0133]
在至少一个实施例中,处理子系统1001包括经由总线或其他通信链路1013耦合到存储器集线器1005的一个或更多个并行处理器1012。在至少一个实施例中,通信链路1013可以是许多基于标准的通信链路技术或协议中的一种,例如但不限于pcie,或者可以是针对供应商的通信接口或通信结构。在至少一个实施例中,一个或更多个并行处理器1012形成计算集中的并行或向量处理系统,该系统可以包括大量的处理核心和/或处理集群,例如多集成核心(mic)处理器。在至少一个实施例中,一个或更多个并行处理器1012形成可以将像素输出到经由i/o集线器1007耦合的一个或更多个显示设备1010a之一的图形处理子系统。在至少一个实施例中,一个或更多个并行处理器1012还可以包括显示控制器和显示接口(未示出),以使得能够直接连接到一个或更多个显示设备1010b。
[0134]
在至少一个实施例中,系统存储单元1014可以连接到i/o集线器1007,以提供用于计算系统1000的存储机制。在至少一个实施例中,i/o交换机1016可以用于提供接口机制,以实现i/o集线器1007与其他组件之间的连接,例如可以集成到平台中的网络适配器1018和/或无线网络适配器1019,以及可以通过一个或更多个附加设备1020添加的各种其他设备。在至少一个实施例中,网络适配器1018可以是以太网适配器或另一有线网络适配器。在至少一个实施例中,无线网络适配器1019可以包括wi-fi、蓝牙、nfc的一个或更多个或其他包括一个或更多个无线电的网络设备。
[0135]
在至少一个实施例中,计算系统1000可以包括未明确示出的其他组件,包括usb或其他端口连接、光存储驱动器、视频捕获设备等,也可以连接到i/o集线器1007。在至少一个实施例中,对图10中的各个组件进行互连的通信路径可以使用任何合适的协议来实现,诸如基于pci(外围组件互连)的协议(例如,pcie),或其他总线或点对点通信接口和/或协议(例如,nvlink高速互连或互连协议)。
[0136]
在至少一个实施例中,一个或更多个并行处理器1012包括针对图形和视频处理而优化的电路(包括例如视频输出电路),并构成图形处理单元(gpu)。在至少一个实施例中,一个或更多个并行处理器1012包括针对通用处理而优化的电路。在至少一个实施例中,计算系统1000的组件可以与单个集成电路上的一个或更多个其他系统元件集成。例如,在至少一个实施例中,一个或更多个并行处理器1012、存储器集线器1005、处理器1002和i/o集线器1007可以被集成到片上系统(soc)集成电路中。在至少一个实施例中,计算系统1000的组件可以被集成到单个封装中以形成系统级封装(sip)配置。在至少一个实施例中,计算系统1000的组件的至少一部分可以被集成到多芯片模块(mcm)中,该多芯片模块可以与其他多芯片模块互连到模块化计算系统中。在至少一个实施例中,从计算系统1000中省略了i/o子系统1011和显示设备1010b。
[0137]
处理系统
[0138]
以下各图阐述了但不限于可用于实现至少一个实施例的示例性处理系统。
[0139]
图11示出了根据至少一个实施例的加速处理单元(“apu”)1100。在至少一个实施例中,apu 1100可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,apu 1100由加利福尼亚州圣克拉拉市的amd公司开发。在至少一个实施例中,apu 1100可以被配置为执行应用程序,诸如cuda程序。在至少一个实施例中,apu 1100包括但不限于核心复合体1110、图形复合体1140、结构1160、i/o接口1170、存储器控制器1180、显示控制器1192和多媒体引擎1194。在至少一个实施例中,apu 1100可以包括但不限于任意数量的核心复合体1110、任意数量的图形复合体1140、任意数量的显示控制器1192和任意数量的多媒体引擎1194的任何组合。为了说明的目的,在本文中用附图标记表示相似对象的多个实例,其中附图标记标识该对象,并且括号中的数字标识所需要的实例。
[0140]
在至少一个实施例中,核心复合体1110是cpu,图形复合体1140是gpu,并且apu 1100是将不限于1110和1140集成到单个芯片上的处理单元。在至少一个实施例中,一些任务可以被分配给核心复合体1110,而其他任务可以被分配给图形复合体1140。在至少一个实施例中,核心复合体1110被配置为执行与apu 1100相关联的主控制软件,例如操作系统。在至少一个实施例中,核心复合体1110是apu 1100的主处理器,其控制和协调其他处理器的操作。在至少一个实施例中,核心复合体1110发出控制图形复合体1140的操作的命令。在至少一个实施例中,核心复合体1110可以被配置为执行从cuda源代码派生的主机可执行代码,并且图形复合体1140可以被配置为执行从cuda源代码派生的设备可执行代码。
[0141]
在至少一个实施例中,核心复合体1110包括但不限于核心1120(1)-1120(4)和l3高速缓存1130。在至少一个实施例中,核心复合体1110可以包括但不限于任意数量的核心1120以及任意数量和类型的高速缓存的任何组合。在至少一个实施例中,核心1120被配置为执行特定指令集架构(“isa”)的指令。在至少一个实施例中,每个核心1120是cpu核心。
[0142]
在至少一个实施例中,每个核心1120包括但不限于获取/解码单元1122,整数执行引擎1124,浮点执行引擎1126和l2高速缓存1128。在至少一个实施例中,获取/解码单元1122获取指令,对这些指令进行解码,生成微操作,并将单独的微指令分派给整数执行引擎1124和浮点执行引擎1126。在至少一个实施例中,获取/解码单元1122可以同时分派一个微指令到整数执行引擎1124和另一微指令到浮点执行引擎1126。在至少一个实施例中,整数执行引擎1124执行不限于整数和存储器操作。在至少一个实施例中,浮点引擎1126执行不限于浮点和向量运算。在至少一个实施例中,获取-解码单元1122将微指令分派给单个执行引擎,该执行引擎代替整数执行引擎1124和浮点执行引擎1126两者。
[0143]
在至少一个实施例中,每个核心1120(i)可以访问包括在核心1120(i)中的l2高速缓存1128(i),其中i是表示核心1120的特定实例的整数。在至少一个实施例中,包括在核心复合体1110(j)中的每个核心1120经由包括在核心复合体1110(j)中的l3高速缓存1130(j)连接到包括在核心复合体1110(j)中的其他核心1120,其中j是表示核心复合体1110的特定实例的整数。在至少一个实施例中,包括在核心复合体1110(j)中的核心1120可以访问包括在核心复合体1110(j)中的所有l3高速缓存1130(j),其中j是表示核心复合体1110的特定实例的整数。在至少一个实施例中,l3高速缓存1130可以包括但不限于任意数量的切片
(slice)。
[0144]
在至少一个实施例中,图形复合体1140可以被配置为以高度并行的方式执行计算操作。在至少一个实施例中,图形复合体1140被配置为执行图形管线操作,诸如绘制命令、像素操作、几何计算以及与将图像渲染至显示器相关联的其他操作。在至少一个实施例中,图形复合体1140被配置为执行与图形无关的操作。在至少一个实施例中,图形复合体1140被配置为执行与图形有关的操作和与图形无关的操作。
[0145]
在至少一个实施例中,图形复合体1140包括但不限于任意数量的计算单元1150和l2高速缓存1142。在至少一个实施例中,计算单元1150共享l2高速缓存1142。在至少一个实施例中,l2高速缓存1142被分区。在至少一个实施例中,图形复合体1140包括但不限于任意数量的计算单元1150以及任意数量(包括零)和类型的高速缓存。在至少一个实施例中,图形复合体1140包括但不限于任意数量的专用图形硬件。
[0146]
在至少一个实施例中,每个计算单元1150包括但不限于任意数量的simd单元1152和共享存储器1154。在至少一个实施例中,每个simd单元1152实现simd架构并且被配置为并行执行操作。在至少一个实施例中,每个计算单元1150可以执行任意数量的线程块,但是每个线程块在单个计算单元1150上执行。在至少一个实施例中,线程块包括但不限于任意数量的执行线程。在至少一个实施例中,工作组是线程块。在至少一个实施例中,每个simd单元1152执行不同的线程束(warp)。在至少一个实施例中,线程束是一组线程(例如16个线程),其中线程束中的每个线程属于单个线程块,并且被配置为基于单个指令集来处理不同的数据集。在至少一个实施例中,可以使用预测(predication)来禁用线程束中的一个或更多个线程。在至少一个实施例中,通道是线程。在至少一个实施例中,工作项是线程。在至少一个实施例中,波前是线程束。在至少一个实施例中,线程块中的不同波前可一起同步并经由共享存储器1154进行通信。
[0147]
在至少一个实施例中,结构1160是系统互连,其促进跨核心复合体1110、图形复合体1140、i/o接口1170、存储器控制器1180、显示控制器1192和多媒体引擎1194的数据和控制传输。在至少一个实施例中,除了结构1160之外或代替结构1160,apu1100还可以包括但不限于任意数量和类型的系统互连,该结构1160促进跨可以在apu1100内部或外部的任意数量和类型的直接或间接链接的组件的数据和控制传输。在至少一个实施例中,i/o接口1170表示任意数量和类型的i/o接口(例如,pci,pci-extended(“pci-x”),pcie,千兆以太网(“gbe”),usb等)。在至少一个实施例中,各种类型的外围设备耦合到i/o接口1170。在至少一个实施例中,耦合到i/o接口1170的外围设备可以包括但不限于键盘,鼠标,打印机,扫描仪,操纵杆或其他类型的游戏控制器、媒体记录设备、外部存储设备、网络接口卡等。
[0148]
在至少一个实施例中,显示控制器amd92在一个或更多个显示设备(例如液晶显示器(lcd)设备)上显示图像。在至少一个实施例中,多媒体引擎1194包括但不限于任意数量和类型的与多媒体相关的电路,例如视频解码器、视频编码器、图像信号处理器等。在至少一个实施例中,存储器控制器1180促进apu 1100与统一系统存储器1190之间的数据传输。在至少一个实施例中,核心复合体1110和图形复合体1140共享统一系统存储器1190。
[0149]
在至少一个实施例中,apu 1100实现种存储器子系统,其包括但不限于任意数量和类型的存储器控制器1180和可以专用于一个组件或在多个组件之间共享的存储器设备(例如,共享存储器1154)。组件。在至少一个实施例中,apu 1100实现高速缓存子系统,其包
括但不限于一个或更多个高速缓存存储器(例如,l2高速缓存1628,l3高速缓存1130和l2高速缓存1142),每个高速缓存存储器可以是组件私有的或在任意数量的组件(例如,核心1120,核心复合体1110,simd单元1152,计算单元1150和图形复合体1140)之间共享。
[0150]
图12示出了根据至少一个实施例的cpu 1200。在至少一个实施例中,cpu 1200可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,cpu 1200由加利福尼亚州圣克拉拉市的amd公司开发。在至少一个实施例中,cpu 1200可以被配置为执行应用程序。在至少一个实施例中,cpu 1200被配置为执行主控制软件,例如操作系统。在至少一个实施例中,cpu 1200发出控制外部gpu(未示出)的操作的命令。在至少一个实施例中,cpu 1200可以被配置为执行从cuda源代码派生的主机可执行代码,并且外部gpu可以被配置为执行从这种cuda源代码派生的设备可执行代码。在至少一个实施例中,cpu 1200包括但不限于任意数量的核心复合体1210,结构1260,i/o接口1270和存储器控制器1280。
[0151]
在至少一个实施例中,核心复合体1210包括但不限于核心1220(1)-1220(4)和l3高速缓存1230。在至少一个实施例中,核心复合体1210可以包括但不限于任意数量的核心1220以及任意数量和类型的高速缓存的任何组合。在至少一个实施例中,核心1220被配置为执行特定isa的指令。在至少一个实施例中,每个核心1220是cpu核心。
[0152]
在至少一个实施例中,每个核心1220包括但不限于获取/解码单元1222,整数执行引擎1224,浮点执行引擎1226和l2高速缓存1228。在至少一个实施例中,获取/解码单元1222获取指令,对这些指令进行解码,生成微操作,并将单独的微指令分派给整数执行引擎1224和浮点执行引擎1226。在至少一个实施例中,获取/解码单元1222可以同时分派一个微指令至整数执行引擎1224和另一微指令至浮点执行引擎1226。在至少一个实施例中,整数执行引擎1224执行不限于整数和存储器操作。在至少一个实施例中,浮点引擎1226执行不限于浮点和向量运算。在至少一个实施例中,获取-解码单元1222将微指令分派给单个执行引擎,该引擎代替整数执行引擎1224和浮点执行引擎1226两者。
[0153]
在至少一个实施例中,每个核心1220(i)可以访问包括在核心1220(i)中的l2高速缓存1228(i),其中i是表示核心1220的特定实例的整数。在至少一个实施例中,包括在核心复合体1210(j)中的每个核心1220经由包括在核心复合体1210(j)中的l3高速缓存1230(j)连接到核心复合体1210(j)中的其他核心1220,其中j是表示核心复合体1210的特定实例的整数。在至少一个实施例中,包括在核心复合体1210(j)中的核心1220可以访问包括在核心复合体1210(j)中的所有l3高速缓存1230(j),其中j是表示核心复合体1210的特定实例的整数。在至少一个实施例中,l3高速缓存1230可以包括但不限于任意数量的切片。
[0154]
在至少一个实施例中,结构1260是系统互连,其促进跨核心复合体1210(1)-1210(n)(其中n是大于零的整数)、i/o接口1270和存储器控制器1280的数据和控制传输。在至少一个实施例中,除了结构1260之外或代替结构1260,cpu 1200还可以包括但不限于任意数量和类型的系统互连,该结构1260促进跨可以在cpu 1200内部或外部的任意数量和类型的直接或间接链接的组件的数据和控制传输。在至少一个实施例中,i/o接口1270表示任意数量和类型的i/o接口(例如pci,pci-x,pcie,gbe,usb等)。在至少一个实施例中,各种类型的外围设备耦合到i/o接口1270。在至少一个实施例中,耦合到i/o接口1270的外围设备可以包括但不限于显示器,键盘,鼠标,打印机,扫描仪,操纵杆或其他类型的游戏控制器、媒体
记录设备、外部存储设备、网络接口卡等。
[0155]
在至少一个实施例中,存储器控制器1280促进cpu1200与系统存储器1290之间的数据传输。在至少一个实施例中,核心复合体1210和图形复合体1240共享系统存储器1290。在至少一个实施例中,cpu1200实现存储器子系统,其包括但不限于任意数量和类型的存储器控制器1280和可以专用于一个组件或在多个组件之间共享的存储器设备。在至少一个实施例中,cpu1200实现了高速缓存子系统,其包括但不限于一个或更多个高速缓存存储器(例如,l2高速缓存1228和l3高速缓存1230),每个高速缓存存储器可以是组件私有的或在任意数量的组件(例如,核心1220和核心复合体1210)之间共享。
[0156]
图13示出了根据至少一个实施例的示例性加速器集成切片1390。在至少一个实施例中,加速器集成切片1390可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。如本文所使用的,“切片”包括加速器集成电路的处理资源的指定部分。在至少一个实施例中,加速器集成电路代表多个图形加速模块种的多个图形处理引擎提供高速缓存管理、存储器访问、环境管理和中断管理服务。图形处理引擎可以各自包括单独的gpu。可选地,图形处理引擎可包括gpu内的不同类型的图形处理引擎,例如图形执行单元、媒体处理引擎(例如,视频编码器/解码器)、采样器和blit引擎。在至少一个实施例中,图形加速模块可以是具有多个图形处理引擎的gpu。在至少一个实施例中,图形处理引擎可以是集成在通用封装、线卡或芯片上的各个gpu。
[0157]
系统存储器1314内的应用程序有效地址空间1382存储进程元素1383。在一个实施例中,响应于来自处理器1307上执行的应用程序1380的gpu调用1381而存储进程元素1383。进程元素1383包含对应应用程序1380的处理状态。包含在进程元素1383中的工作描述符(wd)1384可以是应用程序请求的单个作业或可能包含指向作业队列的指针。在至少一个实施例中,wd1384是指向应用程序有效地址空间1382中的作业请求队列的指针。
[0158]
图形加速模块1346和/或各个图形处理引擎可以由系统中的全部或部分进程共享。在至少一个实施例中,可以包括用于建立处理状态并将wd1384发送到图形加速模块1346以在虚拟化环境中开始作业的基础设施。
[0159]
在至少一个实施例中,专用进程编程模型是针对实现的。在该模型中,单个进程拥有图形加速模块1346或个体图形处理引擎。由于图形加速模块1346由单个进程拥有,因此管理程序为拥有的分区初始化加速器集成电路,并且当分配图形加速模块1346时操作系统对加速器集成电路进行初始化以用于拥有的分区。
[0160]
在操作中,加速器集成切片1390中的wd获取单元1391获取下一个wd1384,其中包括要由图形加速模块1346的一个或更多个图形处理引擎完成的工作的指示。来自wd1384的数据可以存储在寄存器1345被存储器管理单元(mmu)1339、中断管理电路1347和/或环境管理电路1348使用,如图所示。例如,mmu1339的一个实施例包括用于访问os虚拟地址空间1385内的段/页表1386的段/页面漫游电路。中断管理电路1347可以处理从图形加速模块1346接收到的中断事件(int)1392。当执行图操作时,由图形处理引擎产生的有效地址1393由mmu1339转换为实际地址。
[0161]
在一个实施例中,为每个图形处理引擎和/或图形加速模块1346复制相同的寄存器组1345,并且可以由系统管理程序或操作系统来初始化。这些复制的寄存器中的每一个都可以包含在加速器集成切片1390中。表1中显示了可由管理程序初始化的示例性寄存器。
[0162]
表1

管理程序初始化的寄存器
[0163]
1切片控制寄存器2实地址(ra)计划的处理区域指针3授权掩码覆盖寄存器4中断向量表输入偏移5中断向量表入口限制6状态寄存器7逻辑分区id8实地址(ra)管理程序加速器利用率记录指针9存储描述寄存器
[0164]
表2中示出了可以由操作系统初始化的示例性寄存器。
[0165]
表2

操作系统初始化寄存器
[0166]
1进程和线程识别2有效地址(ea)环境保存/还原指针3虚拟地址(va)加速器利用率记录指针4虚拟地址(va)存储分段表指针5权威面具6工作描述符
[0167]
在一个实施例中,每个wd1384特定于特定的图形加速模块1346和/或特定图形处理引擎。它包含图形处理引擎进行工作或工作所需的所有信息,或者它可以是指向存储器位置的指针,其中应用程序建立了要完成的工作的命令队列。
[0168]
图14a-14b示出了根据本文至少一个实施例的示例性图形处理器。在至少一个实施例中,任何示例性图形处理器可以使用一个或更多个ip核心来制造。除了图示之外,在至少一个实施例中可以包括其他逻辑和电路,包括附加的图形处理器/核心、外围接口控制器或通用处理器核心。在至少一个实施例中,示例性图形处理器用于soc内。
[0169]
图14a示出了根据至少一个实施例的soc集成电路的示例性图形处理器1410,其可以使用一个或更多个ip核心来制造。图14b示出了根据至少一个实施例的soc集成电路的附加示例性图形处理器1440,其可以使用一个或更多个ip核心来制造。在至少一个实施例中,图形处理器1410或图形处理器1440可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的全部过程400的一部分。在至少一个实施例中,图14a的图形处理器1410是低功耗图形处理器核心。在至少一个实施例中,图14b的图形处理器1440是更高性能的图形处理器核心。在至少一个实施例中,每个图形处理器1410、1440可以是图9的图形处理器910的变体。
[0170]
在至少一个实施例中,图形处理器1410包括顶点处理器1405和一个或更多个片段处理器1415a-1415n(例如1415a、1415b、1415c、1415d至1415n-1和1415n)。在至少一个实施例中,图形处理器1410可以经由单独的逻辑来执行不同的着色器程序,使得顶点处理器1405被优化以执行针对顶点着色器程序的操作,而一个或更多个片段处理器1415a-1415n执行片段(例如,像素)着色操作用于片段或像素或着色器程序。在至少一个实施例中,顶点处理器1405执行3d图形管线的顶点处理阶段并生成图元和顶点数据。在至少一个实施例
中,片段处理器1415a-1415n使用由顶点处理器1405生成的图元和顶点数据来生成在显示设备上显示的帧缓冲区。在至少一个实施例中,片段处理器1415a-1415n被优化以执行如在opengl api中所提供的片段着色器程序,其可以用于执行与在direct 3dapi中所提供的像素着色器程序类似的操作。
[0171]
在至少一个实施例中,图形处理器1410附加地包括一个或更多个mmu 1420a-1420b、高速缓存1425a-1425b和电路互连1430a-1430b。在至少一个实施例中,一个或更多个mmu 1420a-1420b提供用于图形处理器1410的虚拟到物理地址的映射,包括用于顶点处理器1405和/或片段处理器1415a-1415n,其可以引用存储在存储器中的顶点或图像/纹理数据,除了存储在一个或更多个高速缓存1425a-1425b中的顶点或图像/纹理数据之外。在至少一个实施例中,一个或更多个mmu 1420a-1420b可以与系统内的其他mmu同步,包括与图9的一个或更多个应用处理器905、图像处理器915和/或视频处理器920相关联的一个或更多个mmu,使得每个处理器905-920可以参与共享或统一的虚拟存储器系统。在至少一个实施例中,一个或更多个电路互连1430a-1430b使图形处理器1410能够经由soc的内部总线或经由直接连接与soc内的其他ip核心相连接。
[0172]
在至少一个实施例中,图形处理器1440包括图14a的图形处理器1410的一个或更多个mmu 1420a-1420b、高速缓存1425a-1425b和电路互连1430a-1430b。在至少一个实施例中,图形处理器1440包括一个或更多个着色器核心1455a-1455n(例如,1455a、1455b、1455c、1455d、1455e、1455f、至1455n-1和1455n),其提供了统一的着色器核心架构,其中单个核心或类型或核心可以执行所有类型的可编程着色器代码,包括用于实现顶点着色器、片段着色器和/或计算着色器的着色器程序代码。在至少一个实施例中,多个着色器核心可以变化。在至少一个实施例中,图形处理器1440包括核心间任务管理器1445,其充当线程分派器以将执行线程分派给一个或更多个着色器核心1455a-1455n和分块单元1458,以加速基于图块渲染的分块操作,其中在图像空间中细分了场景的渲染操作,例如,以利用场景内的局部空间一致性或优化内部缓存的使用。
[0173]
图15a示出了根据至少一个实施例的图形核心1500。在至少一个实施例中,图形核心1500可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分,例如,图形处理核心可以是gpu 116的一部分。在至少一个实施例中,图形核心1500可以包括在图9的图形处理器910内。在至少一个实施例中,图形核心1500可以是图14b中统一的着色器核心1455a-1455n。在至少一个实施例中,图形核心1500包括共享指令高速缓存1502、纹理单元1418和高速缓存/共享存储器1520,它们是图形核心1500内的执行资源所共有的。在至少一个实施例中,图形核心1500可以包括多个切片(slice)1501a-1501n或每个核心的分区,图形处理器可以包括图形核心1500的多个实例。切片1501a-1501n可以包括支持逻辑,该支持逻辑包括本地指令高速缓存1504a-1504n、线程调度器1506a-1506n、线程分派器1508a-1508n和一组寄存器1510a-1510n。在至少一个实施例中,切片1501a-1501n可以包括一组附加功能单元(afu)1512a-1512n、浮点单元(fpu)1514a-1514n、整数算术逻辑单元(alu)1516a-1516n、地址计算单元(acu)1513a-1513n、双精度浮点单元(dpfpu)1515a-1515n和矩阵处理单元(mpu)1517a-1517n。
[0174]
在一个实施例中,fpu1514a-1514n可以执行单精度(32位)和半精度(16位)浮点运算,而dpfpu1515a-1515n可以执行双精度(64位)浮点运算点操作。在至少一个实施例中,
alu1516a-1516n可以以8位、16位和32位精度执行可变精度整数运算,并且可以被配置用于混合精度运算。在至少一个实施例中,mpu1517a-1517n还可被配置用于混合精度矩阵运算,包括半精度浮点运算和8位整数运算。在至少一个实施例中,mpu1517a-1517n可以执行各种矩阵操作以加速cuda程序,包括使得能够支持加速的通用矩阵到矩阵乘法(gemm)。在至少一个实施例中,afu1512a-1512n可以执行浮点数或整数单元不支持的附加逻辑运算,包括三角运算(例如,sine、cosine等)。
[0175]
图15b示出了在至少一个实施例中的通用图形处理单元(gpgpu)1530。在至少一个实施例中,gpgpu 1530可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分,例如,gpgpu 1530可以是gpu 116。在至少一个实施例中,gpgpu 1530是高度并行的并且适合于部署在多芯片模块上。在至少一个实施例中,gpgpu 1530可以被配置为使得高度并行的计算操作能够由gpu阵列来执行。在至少一个实施例中,gpgpu 1530可以直接链路到gpgpu 1530的其他实例,以创建多gpu集群以提高用于cuda程序的执行时间。在至少一个实施例中,gpgpu 1530包括主机接口1532以实现与主机处理器的连接。在至少一个实施例中,主机接口1532是pcie接口。在至少一个实施例中,主机接口1532可以是厂商专用的通信接口或通信结构。在至少一个实施例中,gpgpu 1530从主机处理器接收命令,并使用全局调度器1534将与那些命令相关联的执行线程分派给一组计算集群1536a-1536h。在至少一个实施例中,计算集群1536a-1536h共享高速缓存存储器1538。在至少一个实施例中,高速缓存存储器1538可以用作计算集群1536a-1536h内的高速缓存存储器的高级高速缓存。
[0176]
在至少一个实施例中,gpgpu 1530包括经由一组存储器控制器1542a-1542b与计算集群1536a-1536h耦合的存储器1544a-1544b。在至少一个实施例中,存储器1544a-1544b可以包括各种类型的存储器设备,包括动态随机存取存储器(dram)或图形随机存取存储器,例如同步图形随机存取存储器(sgram),包括图形双倍数据速率(gddr)存储器。
[0177]
在至少一个实施例中,计算集群1536a-1536h各自包括一组图形核心,诸如图15a的图形核心1500,其可以包括多种类型的整数和浮点逻辑单元,可以以各种精度执行计算操作,包括适合与cuda程序相关的计算。例如,在至少一个实施例中,每个计算集群1536a-1536h中的浮点单元的至少一个子集可以配置为执行16位或32位浮点运算,而不同的浮点单元的子集可以配置为执行64位浮点运算。
[0178]
在至少一个实施例中,gpgpu 1530的多个实例可以被配置为操作为计算集群。计算集群1536a-1536h可以实现用于同步和数据交换的任何技术上可行的通信技术。在至少一个实施例中,gpgpu 1530的多个实例通过主机接口1532进行通信。在至少一个实施例中,gpgpu 1530包括i/o集线器1539,其将gpgpu 1530与gpu链路1540耦合,使得能够直接连接至gpgpu 1530的其他的实例。在至少一个实施例中,gpu链路1540耦合到专用gpu到gpu桥接器,其使得能够在gpgpu 1530的多个实例之间进行通信和同步。在至少一个实施例中,gpu链路1540与高速互连耦合,以向其他gpgpu或并行处理器发送和接收数据。在至少一个实施例中,gpgpu 1530的多个实例位于单独的数据处理系统中,并经由可经由主机接口1532访问的网络设备进行通信。在至少一个实施例中,gpu链路1540可被配置为能够连接到主机处理器,附加或替代主机接口1532。在至少一个实施例中,gpgpu 1530可以配置为执行cuda程序。
[0179]
图16a示出了根据至少一个实施例的并行处理器1600。在至少一个实施例中,并行处理器1600可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分,例如,并行处理器1600可以是gpu 116。在至少一个实施例中,并行处理器1600的各种组件可以使用一个或更多个集成电路设备来实现,例如可编程处理器、专用集成电路(asic)或fpga。
[0180]
在至少一个实施例中,并行处理器1600包括并行处理单元1602。在至少一个实施例中,并行处理单元1602包括i/o单元1604,其使得能够与其他设备进行通信,包括并行处理单元1602的其他实例。在至少一个实施例中,i/o单元1604可以直接连接到其他设备。在至少一个实施例中,i/o单元1604通过使用集线器或交换机接口(例如,存储器集线器1405)与其他设备连接。在至少一个实施例中,存储器集线器1605与i/o单元1604之间的连接形成通信链路。在至少一个实施例中,i/o单元1604与主机接口1606和存储器交叉开关1616连接,其中主机接口1606接收用于执行处理操作的命令,而存储器交叉开关1616接收用于执行存储器操作的命令。
[0181]
在至少一个实施例中,当主机接口1606经由i/o单元1604接收命令缓冲区时,主机接口1606可以引导工作操作以执行那些命令到前端1608。在至少一个实施例中,前端1608与调度器1610耦合,调度器1610配置成将命令或其他工作项分配给处理阵列1612。在至少一个实施例中,调度器1610确保在将任务分配给处理阵列1612中的处理阵列1612之前,处理阵列1612被正确地配置并且处于有效状态。在至少一个实施例中,调度器1610通过在微控制器上执行的固件逻辑来实现。在至少一个实施例中,微控制器实现的调度器1610可配置成以粗粒度和细粒度执行复杂的调度和工作分配操作,从而实现对在处理阵列1612上执行的线程的快速抢占和环境切换。在至少一个实施例中,主机软件可以证明用于通过多个图形处理门铃之一在处理阵列1612上进行调度的工作负载。在至少一个实施例中,工作负载然后可以由包括调度器1610的微控制器内的调度器1610逻辑在处理阵列1612上自动分配。
[0182]
在至少一个实施例中,处理阵列1612可以包括多达“n”个处理集群(例如,集群1614a、集群1614b到集群1614n)。在至少一个实施例中,处理阵列1612的每个集群1614a-1614n可以执行大量并发线程。在至少一个实施例中,调度器1610可以使用各种调度和/或工作分配算法将工作分配给处理阵列1612的集群1614a-1614n,其可以根据每种程序或计算类型产生的工作负载而变化。在至少一个实施例中,调度可以由调度器1610动态地处理,或者可以在配置为由处理阵列1612执行的程序逻辑的编译期间部分地由编译器逻辑来辅助。在至少一个实施例中,可将处理阵列1612的不同的集群1614a-1614n分配用于处理不同类型的程序或用于执行不同类型的计算。
[0183]
在至少一个实施例中,处理阵列1612可以配置成执行各种类型的并行处理操作。在至少一个实施例中,处理阵列1612配置成执行通用并行计算操作。例如,在至少一个实施例中,处理阵列1612可以包括执行处理任务的逻辑,该处理任务包括对视频和/或音频数据的过滤,执行建模操作,包括物理操作以及执行数据转换。
[0184]
在至少一个实施例中,处理阵列1612配置成执行并行图形处理操作。在至少一个实施例中,处理阵列1612可以包括附加逻辑以支持这种图形处理操作的执行,包括但不限于执行纹理操作的纹理采样逻辑,以及镶嵌逻辑和其他顶点处理逻辑。在至少一个实施例
中,处理阵列1612可以配置成执行与图形处理有关的着色器程序,例如但不限于顶点着色器、曲面细分着色器、几何着色器和像素着色器。在至少一个实施例中,并行处理单元1602可以经由i/o单元1604从系统存储器传送数据以进行处理。在至少一个实施例中,在处理期间,可以在处理期间将传送的数据存储到片上存储器(例如,并行处理器存储器1622),然后将其写回到系统存储器。
[0185]
在至少一个实施例中,当并行处理单元1602用于执行图处理时,调度器1610可以配置成将处理工作负载划分为近似相等大小的任务,以更好地将图形处理操作分配给处理阵列1612的多个集群1614a-1614n。在至少一个实施例中,处理阵列1612的部分可以配置成执行不同类型的处理。例如,在至少一个实施例中,第一部分可以配置成执行顶点着色和拓扑生成,第二部分可以配置成执行镶嵌和几何着色,并且第三部分可以配置成执行像素着色或其他屏幕空间操作,以生成用于显示的渲染图像。在至少一个实施例中,可以将由集群1614a-1614n中的一个或更多个产生的中间数据存储在缓冲区中,以允许在集群1614a-1614n之间传输中间数据以进行进一步处理。
[0186]
在至少一个实施例中,处理阵列1612可以经由调度器1610接收要执行的处理任务,该调度器1610从前端1608接收定义处理任务的命令。在至少一个实施例中,处理任务可以包括要被处理的数据的索引,例如可以包括表面(补丁)数据、原始数据、顶点数据和/或像素数据,以及状态参数和定义如何处理数据的命令(例如,要执行什么程序)。在至少一个实施例中,调度器1610可以配置成获取与任务相对应的索引,或者可以从前端1608接收索引。在至少一个实施例中,前端1608可以配置成确保在启动由传入命令缓冲区(例如,批缓冲区(batch-buffer)、推送缓冲区等)指定的工作负载之前,处理阵列1612配置成有效状态。
[0187]
在至少一个实施例中,并行处理单元1602的一个或更多个实例中的每一个可以与并行处理器存储器1622耦合。在至少一个实施例中,可以经由存储器交叉开关1616访问并行处理器存储器1622,所述存储器交叉开关1616可以接收来自处理阵列1612以及i/o单元1604的存储器请求。在至少一个实施例中,存储器交叉开关1616可以经由存储器接口1618访问并行处理器存储器1622。在至少一个实施例中,存储器接口1618可以包括多个分区单元(例如,分区单元1620a、分区单元1620b到分区单元1620n),其可各自耦合至并行处理器存储器1622的一部分(例如,存储器单元)。在至少一个实施例中,多个分区单元1620a-1620n为配置为等于存储器单元的数量,使得第一分区单元1620a具有对应的第一存储器单元1624a,第二分区单元1620b具有对应的存储器单元1624b,第n分区单元1620n具有对应的第n存储器单元1624n。在至少一个实施例中,分区单元1620a-1620n的数量可以不等于存储器设备的数量。
[0188]
在至少一个实施例中,存储器单元1624a-1624n可以包括各种类型的存储器设备,包括动态随机存取存储器(dram)或图形随机存取存储器,例如同步图形随机存取存储器(sgram),包括图形双倍数据速率(gddr)存储器。在至少一个实施例中,存储器单元1624a-1624n还可包括3d堆叠存储器,包括但不限于高带宽存储器(hbm)。在至少一个实施例中,可以跨存储器单元1624a-1624n来存储诸如帧缓冲区或纹理映射的渲染目标,从而允许分区单元1620a-1620n并行地写入每个渲染目标的部分,以有效地使用并行处理器存储器1622的可用带宽。在至少一个实施例中,可以排除并行处理器存储器1622的本地实例,以有利于
利用系统存储器与本地高速缓存存储器结合的统一存储器设计。
[0189]
在至少一个实施例中,处理阵列1612的集群1614a-1614n中的任何一个都可以处理将被写入并行处理器存储器1622内的任何存储器单元1624a-1624n中的数据。在至少一个实施例中,存储器交叉开关1616可以配置为将每个集群1614a-1614n的输出传输到任何分区单元1620a-1620n或另一个集群1614a-1614n,集群1614a-1614n可以对输出执行其他处理操作。在至少一个实施例中,每个集群1614a-1614n可以通过存储器交叉开关1616与存储器接口1618通信,以从各种外部存储设备读取或写入各种外部存储设备。在至少一个实施例中,存储器交叉开关1616具有到存储器接口1618的连接以与i/o单元1604通信,以及到并行处理器存储器1622的本地实例的连接,从而使不同处理集群1614a-1614n内的处理单元与系统存储器或不是并行处理单元1602本地的其他存储器进行通信。在至少一个实施例中,存储器交叉开关1616可以使用虚拟通道来分离集群1614a-1614n和分区单元1620a-1620n之间的业务流。
[0190]
在至少一个实施例中,可以在单个插入卡上提供并行处理单元1602的多个实例,或者可以将多个插入卡互连。在至少一个实施例中,并行处理单元1602的不同实例可以配置成相互操作,即使不同实例具有不同数量的处理核心,不同数量的本地并行处理器存储器和/或其他配置差异。例如,在至少一个实施例中,并行处理单元1602的一些实例可以包括相对于其他实例而言更高精度的浮点单元。在至少一个实施例中,结合并行处理单元1602或并行处理器1600的一个或更多个实例的系统可以以各种配置和形式因素来实现,包括但不限于台式机、膝上型计算机或手持式个人计算机、服务器、工作站、游戏机和/或嵌入式系统。
[0191]
图16b示出了根据至少一个实施例的处理集群1694。在至少一个实施例中,处理集群1694可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,处理集群1694被包括在并行处理单元内。在至少一个实施例中,处理集群1694是图16a的处理集群1614a-1614n之一的实例。在至少一个实施例中,处理集群1694可以配置成并行执行许多线程,其中术语“线程”是指在特定的一组输入数据上执行的特定程序的实例。在至少一个实施例中,单指令多数据(simd)指令发布技术用于支持大量线程的并行执行而无需提供多个独立的指令单元。在至少一个实施例中,使用单指令多线程(simt)技术来支持并行执行大量一般同步的线程,这使用了公共指令单元,该公共指令单元配置成向每个处理集群1694内的一组处理引擎发出指令。
[0192]
在至少一个实施例中,可以通过将处理任务分配给simt并行处理器的管线管理器1632来控制处理集群1694的操作。在至少一个实施例中,管线管理器1632从图16a的调度器1610接收指令,通过图形多处理器1634和/或纹理单元1636管理这些指令的执行。在至少一个实施例中,图形多处理器1634是simt并行处理器的示例性实例。然而,在至少一个实施例中,处理集群1694内可以包括不同架构的各种类型的simt并行处理器。在至少一个实施例中,在处理集群1694内可以包括图形多处理器1634的一个或更多个实例。在至少一个实施例中,图形多处理器1634可以处理数据,并且数据交叉开关1640可以用于将处理后的数据分发到多个可能的目的(包括其他着色器单元)地之一。在至少一个实施例中,管线管理器1632可以通过指定要经由数据交叉开关1640分配的处理后的数据的目的地来促进处理后的数据的分配。
[0193]
在至少一个实施例中,处理集群1694内的每个图形多处理器1634可以包括相同的一组功能执行逻辑(例如,算术逻辑单元、加载存储单元(lsu)等)。在至少一个实施例中,可以以管线方式配置功能执行逻辑,其中可以在先前的指令完成之前发出新的指令。在至少一个实施例中,功能执行逻辑支持多种运算,包括整数和浮点算术、比较操作、布尔运算、移位和各种代数函数的计算。在至少一个实施例中,可以利用相同的功能单元硬件来执行不同的操作,并且可以存在功能单元的任何组合。
[0194]
在至少一个实施例中,传送到处理集群1694的指令构成线程。在至少一个实施例中,跨一组并行处理引擎执行的一组线程是线程组。在至少一个实施例中,线程组在不同的输入数据上执行程序。在至少一个实施例中,线程组内的每个线程可被分配给图形多处理器1634内的不同处理引擎。在至少一个实施例中,线程组可包括比图形多处理器1634内的多个处理引擎更少的线程。在至少一个实施例中,当线程组包括的线程数少于处理引擎的数量时,一个或更多个处理引擎在正在处理该线程组的循环期间可能是空闲的。在至少一个实施例中,线程组还可以包括比图形多处理器1634内的多个处理引擎更多的线程。在至少一个实施例中,当线程组包括比图形多处理器1634内的处理引擎的数量更多的线程时,可以在连续的时钟周期内执行处理。在至少一个实施例中,可以在图形多处理器1634上同时执行多个线程组。
[0195]
在至少一个实施例中,图形多处理器1634包括内部高速缓存存储器,以执行加载和存储操作。在至少一个实施例中,图形多处理器1634可以放弃内部高速缓存并使用处理集群1694内的高速缓存存储器(例如,l1高速缓存1648)。在至少一个实施例中,每个图形多处理器1634还可以访问分区单元(例如,图16a的分区单元1620a-1620n)内的l2高速缓存,这些分区单元在所有处理集群1694之间共享并且可以用于在线程之间传输数据。在至少一个实施例中,图形多处理器1634还可以访问片外全局存储器,其可以包括本地并行处理器存储器和/或系统存储器中的一个或更多个。在至少一个实施例中,并行处理单元1602外部的任何存储器都可以用作全局存储器。在至少一个实施例中,处理集群1694包括图形多处理器1634的多个实例,它们可以共享可以存储在l1高速缓存1648中的公共指令和数据。
[0196]
在至少一个实施例中,每个处理集群1694可以包括配置成将虚拟地址映射为物理地址的mmu 1645。在至少一个实施例中,mmu 1645的一个或更多个实例可以驻留在图16a的存储器接口1618内。在至少一个实施例中,mmu 1645包括一组页表条目(pte),其用于将虚拟地址映射到图块(谈论有关图块的更多信息)的物理地址以及可选地映射到高速缓存行索引。在至少一个实施例中,mmu 1645可以包括地址转换后备缓冲区(tlb)或可以驻留在图形多处理器1634或l1高速缓存1648或处理集群1694内的高速缓存。在至少一个实施例中,处理物理地址以分配表面数据访问局部性,以便在分区单元之间进行有效的请求交织。在至少一个实施例中,高速缓存行索引可以用于确定对高速缓存线的请求是命中还是未命中。
[0197]
在至少一个实施例中,可以配置处理集群1694,使得每个图形多处理器1634耦合到纹理单元1636,以执行纹理映射操作,例如,可以涉及确定纹理样本位置、读取纹理数据以及过滤纹理数据。在至少一个实施例中,根据需要从内部纹理l1高速缓存(未示出)或从图形多处理器1634内的l1高速缓存中读取纹理数据,并从l2高速缓存、本地并行处理器存储器或系统存储器中获取纹理数据。在至少一个实施例中,每个图形多处理器1634将处理
后的任务输出到数据交叉开关1640,以将处理后的任务提供给另一处理集群1694以进行进一步处理或将处理后的任务存储在l2高速缓存、本地并行处理器存储器、或经由存储器交叉开关1616的系统存储器中。在至少一个实施例中,光栅前操作单元(prerop)1642配置成从图形多处理器1634接收数据,将数据引导至rop单元,该rop单元可以与本文所述的分区单元(例如,图16a的分区单元1620a-1620n)一起定位。在至少一个实施例中,prerop 1642单元可以执行用于颜色混合的优化、组织像素颜色数据以及执行地址转换。
[0198]
图16c示出了根据至少一个实施例的图形多处理器1696。在至少一个实施例中,图形多处理器1696可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,图形多处理器1696是图16b的图形多处理器1634。在至少一个实施例中,图形多处理器1696与处理集群1694的管线管理器1632耦合。在至少一个实施例中,图形多处理器1696具有执行管线,该执行管线包括但不限于指令高速缓存1652、指令单元1654、地址映射单元1656、寄存器文件1658、一个或更多个gpgpu核心1662和一个或更多个lsu 1666。gpgpu核心1662和lsu 1666与高速缓存存储器1672和共享存储器1670通过存储器和高速缓存互连1668耦合。
[0199]
在至少一个实施例中,指令高速缓存1652从管线管理器1632接收要执行的指令流。在至少一个实施例中,将指令高速缓存在指令高速缓存1652中并将其分派以供指令单元1654执行。在一个实施例中,指令单元1654可以分派指令作为线程组(例如,线程束),将线程组的每个线程分配给gpgpu核心1662内的不同执行单元。在至少一个实施例中,指令可以通过在统一地址空间内指定地址来访问任何本地、共享或全局地址空间。在至少一个实施例中,地址映射单元1656可以用于将统一地址空间中的地址转换成可以由lsu 1666访问的不同的存储器地址。
[0200]
在至少一个实施例中,寄存器文件1658为图形多处理器1696的功能单元提供了一组寄存器。在至少一个实施例中,寄存器文件1658为连接到图形多处理器1696的功能单元(例如,gpgpu核心1662、lsu 1666)的数据路径的操作数提供了临时存储。在至少一个实施例中,在每个功能单元之间划分寄存器文件1658,使得为每个功能单元分配寄存器文件1658的专用部分。在至少一个实施例中,寄存器文件1658在图形多处理器1696正在执行的不同线程组之间划分。
[0201]
在至少一个实施例中,gpgpu核心1662可以各自包括用于执行图多处理器1696的指令的fpu和/或alu。gpgpu核心1662在架构上可以相似或架构可能有所不同。在至少一个实施例中,gpgpu核心1662的第一部分包括单精度fpu和整数alu,而gpgpu核心的第二部分包括双精度fpu。在至少一个实施例中,fpu可以实现用于浮点算法的ieee 754-1608标准或启用可变精度浮点算法。在至少一个实施例中,图形多处理器1696可以另外包括一个或更多个固定功能或特殊功能单元,以执行特定功能,诸如复制矩形或像素混合操作。在至少一个实施例中,gpgpu核心1662中的一个或更多个也可以包括固定或特殊功能逻辑。
[0202]
在至少一个实施例中,gpgpu核心1662包括能够对多组数据执行单个指令的simd逻辑。在至少一个实施例中,gpgpu核心1662可以物理地执行simd4、simd8和simd9指令,并且在逻辑上执行simd1、simd2和simd32指令。在至少一个实施例中,用于gpgpu核心的simd指令可以在编译时由着色器编译器生成,或者在执行针对单程序多数据(spmd)或simt架构编写和编译的程序时自动生成。在至少一个实施例中,可以通过单个simd指令来执行为
1750n、1760a-1760n(有时称为核心子切片)。在至少一个实施例中,图形处理器1700可以具有任意数量的图形核心1780a至1780n。在至少一个实施例中,图形处理器1700包括具有至少第一子核心1750a和第二子核心1760a的图形核心1780a。在至少一个实施例中,图形处理器1700是具有单个子核心(例如1750a)的低功率处理器。在至少一个实施例中,图形处理器1700包括多个图形核心1780a-1780n,每个图形核心包括一组第一子核心1750a-1750n和一组第二子核心1760a-1760n。在至少一个实施例中,第一子核心1750a-1750n中的每个子核心至少包括第一组执行单元(eu)1752a-1752n和媒体/纹理采样器1754a-1754n。在至少一个实施例中,第二子核心1760a-1760n中的每个子核心至少包括第二组执行单元1762a-1762n和采样器1764a-1764n。在至少一个实施例中,每个子核心1750a-1750n、1760a-1760n共享一组共享资源1770a-1770n。在至少一个实施例中,共享资源包括共享高速缓冲存储器和像素操作逻辑。
[0208]
图18示出了根据至少一个实施例的用于处理器1800。在至少一个实施例中,处理器1800可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,处理器1800可以包括但不限于用于执行指令的逻辑电路。在至少一个实施例中,处理器1800可以执行指令,包括x86指令、arm指令、用于asic的专用指令等。在至少一个实施例中,处理器1810可以包括用于存储封装数据的寄存器,例如作为加利福尼亚州圣克拉拉市英特尔公司采用mmx技术启用的微处理器中的64位宽mmxtm寄存器。在至少一个实施例中,整数和浮点数形式可用的mmx寄存器可以与封装的数据元素一起运行,所述封装的数据元素伴随simd和流式simd扩展(“sse”)指令。在至少一个实施例中,与sse2、sse3、sse4、avx或更高版本(一般称为“ssex”)技术有关的128位宽xmm寄存器可以保存此类封装数据操作数。在至少一个实施例中,处理器1810可以执行指令以加速cuad程序。
[0209]
在至少一个实施例中,处理器1800包括有序前端(“前端”)1801,以提取要执行的指令并准备稍后在处理器管线中使用的指令。在至少一个实施例中,前端1801可以包括几个单元。在至少一个实施例中,指令预取器1826从存储器中获取指令并将指令提供给指令解码器1828,指令解码器1828又对指令进行解码或解释。例如,在至少一个实施例中,指令解码器1828将接收到的指令解码用于执行的所谓的“微指令”或“微操作”(也称为“微操作”或“微指令”)的一个或更多个操作。在至少一个实施例中,指令解码器1828将指令解析为操作码以及相应的数据和控制字段,其可以由微架构用来使用以执行操作。在至少一个实施例中,跟踪高速缓存1830可以将解码的微指令组装成微指令队列1834中的程序排序的序列或追踪以供执行。在至少一个实施例中,当追踪高速缓存1830遇到复杂指令时,微码rom 1832提供完成操作所需的微指令。
[0210]
在至少一个实施例中,可以将一些指令转换成单个微操作,而另一些指令则需要几个微操作来完成全部操作。在至少一个实施例中,如果需要多于四个的微指令来完成一条指令,则指令解码器1828可以访问微码rom 1832以执行指令。在至少一个实施例中,可以将指令解码为少量的微指令以在指令解码器1828处进行处理。在至少一个实施例中,如果需要多个微指令完成操作,则可以将指令存储在微码rom 1832中。在至少一个实施例中,追踪高速缓存器1830参考入口点可编程逻辑阵列(“pla”)以确定正确的微指令指针,用于根据至少一个实施例从微码rom 1832读取微码序列以完成一个或更多个指令。在至少一个实
施例中,在微码rom 1832完成对指令的微操作排序之后,机器的前端1801可以恢复从追踪高速缓存1830获取微操作。
[0211]
在至少一个实施例中,乱序执行引擎(“乱序引擎”)1803可以准备用于执行的指令。在至少一个实施例中,乱序执行逻辑具有多个缓冲区,以使指令流平滑并重新排序,以在指令沿管线下降并被调度执行时优化性能。乱序执行引擎1803包括但不限于分配器/寄存器重命名器1840、存储器微指令队列1842、整数/浮点微指令队列1844、存储器调度器1846、快速调度器1802、慢速/通用浮点调度器(“慢速/通用fp调度器”)1804和简单浮点调度器(“简单fp调度器”)1806。在至少一个实施例中,快速调度器1802、慢速/通用浮点调度器1804和简单浮点调度器1806也统称为“微指令调度器1802、1804、1806”。分配器/寄存器重命名器1840分配每个微指令按顺序执行所需要的机器缓冲区和资源。在至少一个实施例中,分配器/寄存器重命名器1840将逻辑寄存器重命名为寄存器文件中的条目。在至少一个实施例中,分配器/寄存器重命名器1840还为两个微指令队列之一中的每个微指令分配条目,存储器微指令队列1842用于存储器操作和整数/浮点微指令队列1844用于非存储器操作,在存储器调度器1846和微指令调度器1802、1804、1806的前面。在至少一个实施例中,微指令调度器1802、1804、1806基于它们的从属输入寄存器操作数源的就绪性和需要完成的执行资源微指令的可用性来确定何时准备好执行微指令。在至少一个实施例中,至少一个实施例的快速调度器1802可以在主时钟周期的每个一半上调度,而慢速/通用浮点调度器1804和简单浮点调度器1806可以在每个主处理器时钟周期调度一次。在至少一个实施例中,微指令调度器1802、1804、1806对调度端口进行仲裁,以调度用于执行的微指令。
[0212]
在至少一个实施例中,执行块1811包括但不限于整数寄存器文件/支路网络1808、浮点寄存器文件/支路网络(“fp寄存器文件/支路网络”)1810、地址生成单元(“agu”)1812和1814、快速算术逻辑单元(“快速alu”)1816和1818、慢速alu 1820、浮点alu(“fp”)1822和浮点移动单元(“fp移动”)1824。在至少一个实施例中,整数寄存器文件/支路网络1808和浮点寄存器文件/旁路网络1810在本文中也称为“寄存器文件1808、1810”。在至少一个实施例中,agus 1812和1814、快速alu 1816和1818、慢速alu 1820、浮点alu 1822和浮点移动单元1824在本文中也称为“执行单元1812、1814、1816、1818、1820、1822和1824”。在至少一个实施例中,执行框可以包括但不限于任意数量(包括零)和类型的寄存器文件、支路网络、地址生成单元和执行单元(以任何组合)。
[0213]
在至少一个实施例中,寄存器文件1808、1810可以布置在微指令调度器1802、1804、1806与执行单元1812、1814、1816、1818、1820、1822和1824之间。在至少一个实施例中,整数寄存器文件/支路网络1808执行整数运算。在至少一个实施例中,浮点寄存器文件/支路网络1810执行浮点操作。在至少一个实施例中,寄存器文件1808、1810中的每一个可以包括但不限于支路网络,该支路网络可以绕过或转发尚未写入寄存器文件中的刚刚完成的结果到新的从属对象。在至少一个实施例中,寄存器文件1808、1810可以彼此通信数据。在至少一个实施例中,整数寄存器文件/支路网络1808可以包括但不限于两个单独的寄存器文件、一个寄存器文件用于低阶32位数据,第二寄存器文件用于高阶32位数据。在至少一个实施例中,浮点寄存器文件/支路网络1810可以包括但不限于128位宽的条目,因为浮点指令通常具有宽度为64至128位的操作数。
[0214]
在至少一个实施例中,执行单元1812、1814、1816、1818、1820、1822、1824可以执行
指令。在至少一个实施例中,寄存器文件1808、1810存储微指令需要执行的整数和浮点数据操作数值。在至少一个实施例中,处理器1800可以包括但不限于任意数量的执行单元1812、1814、1816、1818、1820、1822、1824及其组合。在至少一个实施例中,浮点alu 1822和浮点移动单元1824,可以执行浮点、mmx、simd、avx和sse或其他操作,包括专门的机器学习指令。在至少一个实施例中,浮点alu 1822可以包括但不限于64位乘64位浮点除法器,以执行除法、平方根和余数微操作。在至少一个实施例中,可以用浮点硬件来处理涉及浮点值的指令。在至少一个实施例中,可以将alu操作传递给快速alu 1816、1818。在至少一个实施例中,快速alus 1816、1818可以以半个时钟周期的有效延迟执行快速操作。在至少一个实施例中,大多数复杂的整数运算进入慢速alu 1820,因为慢速alu 1820可以包括但不限于用于长延迟类型操作的整数执行硬件,例如乘法器、移位、标志逻辑和分支处理。在至少一个实施例中,存储器加载/存储操作可以由agus 1812、1814执行。在至少一个实施例中,快速alu 1816、快速alu 1818和慢速alu 1820可以对64位数据操作数执行整数运算。在至少一个实施例中,可以实现快速alu 1816、快速alu 1818和慢速alu 1820以支持包括16、32、128、256等的各种数据位大小。在至少一个实施例中,浮点alu 1822和浮点移动单元1824可以实现为支持具有各种宽度的位的一定范围的操作数。在至少一个实施例中,浮点alu 1822和浮点移动单元1824可以结合simd和多媒体指令对128位宽封装数据操作数进行操作。
[0215]
在至少一个实施例中,微指令调度器1802、1804、1806在父加载完成执行之前调度从属操作。在至少一个实施例中,由于可以在处理器1800中推测性地调度和执行微指令,处理器1800还可以包括用于处理存储器未命中的逻辑。在至少一个实施例中,如果数据高速缓存中的数据加载未命中,则可能存在在管线中正在运行的从属操作,其使调度器暂时没有正确的数据。在至少一个实施例中,一种重放机制追踪踪并重新执行使用不正确数据的指令。在至少一个实施例中,可能需要重放从属操作并且可以允许完成独立操作。在至少一个实施例中,处理器的至少一个实施例的调度器和重放机制也可以设计为捕获用于文本串比较操作的指令序列。
[0216]
在至少一个实施例中,术语“寄存器”可以指代可以用作识别操作数的指令的一部分的机载处理器存储位置。在至少一个实施例中,寄存器可以是那些可以从处理器外部使用的寄存器(从程序员的角度来看)。在至少一个实施例中,寄存器可能不限于特定类型的电路。相反,在至少一个实施例中,寄存器可以存储数据、提供数据并执行本文描述的功能。在至少一个实施例中,本文描述的寄存器可以通过处理器内的电路使用多种不同技术来实现,例如专用物理寄存器、使用寄存器重命名动态分配的物理寄存器、专用和动态分配的物理寄存器的组合等。在至少一个实施例中,整数寄存器存储32位整数数据。至少一个实施例的寄存器文件还包含八个用于封装数据的多媒体simd寄存器。
[0217]
图19示出了根据至少一个实施例的处理器1900。在至少一个实施例中,处理器1900可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,处理器1900包括但不限于一个或更多个处理器核心(核心)1902a-1902n、集成存储器控制器1914和集成图形处理器1908。在至少一个实施例中,处理器1900可以包括直至并包括由虚线框表示的附加处理器核心1902n的附加核心。在至少一个实施例中,每个处理器核心1902a-1902n包括一个或更多个内部高速缓存单元1904a-1904n。在至少一个实施例中,每个处理器核心还可以访问一个或更多个共享高速
缓存的单元1906。
[0218]
在至少一个实施例中,内部高速缓存单元1904a-1904n和共享高速缓存单元1906表示处理器1900内的高速缓存存储器层次结构。在至少一个实施例中,高速缓存存储器单元1904a-1904n可以包括每个处理器核心内的至少一级指令和数据以及共享中级缓存中的一级或更多级缓存,例如l2、l3、4级(l4)或其他级别的缓存,其中在外部存储器之前将最高级别的缓存归类为llc。在至少一个实施例中,高速缓存一致性逻辑维持各种高速缓存单元1906和1904a-1904n之间的一致性。
[0219]
在至少一个实施例中,处理器1900还可包括一组一个或更多个总线控制器单元1916和系统代理核心1910。在至少一个实施例中,一个或更多个总线控制器单元1916管理一组外围总线,例如一个或更多个pci或pciexpress总线。在至少一个实施例中,系统代理核心1910为各种处理器组件提供管理功能。在至少一个实施例中,系统代理核心1910包括一个或更多个集成存储器控制器1914,以管理对各种外部存储器设备(未示出)的访问。
[0220]
在至少一个实施例中,一个或更多个处理器核心1902a-1902n包括对多线程同时进行的支持。在至少一个实施例中,系统代理核心1910包括用于在多线程处理期间协调和操作处理器核心1902a-1902n的组件。在至少一个实施例中,系统代理核心1910可以另外包括电源控制单元(pcu),该电源控制单元包括逻辑和组件以调节处理器核心1902a-1902n和图形处理器1908的一个或更多个电源状态。
[0221]
在至少一个实施例中,处理器1900另外包括图形处理器1908以执行图处理操作。在至少一个实施例中,图形处理器1908与共享高速缓存单元1906和包括一个或更多个集成存储器控制器1914的系统代理核心1910耦合。在至少一个实施例中,系统代理核心1910还包括用于驱动图形处理器输出到一个或更多个耦合的显示器的显示器控制器1911。在至少一个实施例中,显示器控制器1911也可以是经由至少一个互连与图形处理器1908耦合的独立模块,或者可以集成在图形处理器1908内。
[0222]
在至少一个实施例中,基于环的互连单元1912用于耦合处理器1900的内部组件。在至少一个实施例中,可以使用替代性互连单元,例如点对点互连、交换互连或其他技术。在至少一个实施例中,图形处理器1908经由i/o链路1913与环形互连1912耦合。
[0223]
在至少一个实施例中,i/o链路1913代表多种i/o互连中的至少一种,包括促进各种处理器组件与高性能嵌入式存储器模块1918(例如edram模块)之间的通信的封装i/o互连。在至少一个实施例中,处理器核心1902a-1902n和图形处理器1908中的每一个使用嵌入式存储器模块1918作为共享的llc。
[0224]
在至少一个实施例中,处理器核心1902a-1902n是执行公共指令集架构的同质核心。在至少一个实施例中,处理器核心1902a-1902n在isa方面是异构的,其中一个或更多个处理器核心1902a-1902n执行公共指令集,而一个或更多个其他处理器核心1902a-1902n执行公共指令集或不同指令集的子集。在至少一个实施例中,就微架构而言,处理器核心1902a-1902n是异构的,其中具有相对较高功耗的一个或更多个核心与具有较低功耗的一个或更多个功率核心耦合。在至少一个实施例中,处理器1900可以实现在一个或更多个芯片上或被实现为soc集成电路。
[0225]
图20示出了根据所描述的至少一个实施例的图形处理器核心2000。在至少一个实施例中,图形处理器核心2000可以包括在图1-3中公开的一个或更多个系统中或是其一部
分,并且可以执行图4中的所有过程400的一部分,例如,图形处理器核心2000可以是gpu 116的一部分。例如,图形处理器核心2000可以是图1中的gpu核心125、130和135。在至少一个实施例中,图形处理器核心2000包括在图形核心阵列中。在至少一个实施例中,图形处理器核心2000(有时称为核心切片)可以是模块化图形处理器内的一个或更多个图形核心。在至少一个实施例中,图形处理器核心2000是一个图形核心切片的示例,并且本文所述的图形处理器可以基于目标功率和性能包络线包括多个图形核心切片。在至少一个实施例中,每个图形核心2000可以包括与多个子核心2001a-2001f耦合的固定功能块2030,也称为子切片,其包括通用和固定功能逻辑的模块块。
[0226]
在至少一个实施例中,固定功能块2030包括几何/固定功能管线2036,例如,在较低性能和/或较低功率的图形处理器实施方式中,该几何/固定功能管线2036可以由图形处理器2000中的所有子核心共享。在至少一个实施例中,几何/固定功能管线2036包括3d固定功能管线、视频前端单元,线程产生器和线程分派器以及管理统一返回缓冲区的统一返回缓冲区管理器。
[0227]
在至少一个实施例中,固定功能块2030还包括图形soc接口2037、图形微控制器2038和媒体管线2039。图形soc接口2037提供了图形核心2000以及soc集成电路系统中的其他处理器核心之间的接口。在至少一个实施例中,图形微控制器2038是可编程子处理器,其可配置为管理图形处理器2000的各种功能,包括线程分派、调度和抢占。在至少一个实施例中,媒体管线2039包括有助于对包括图像和视频数据的多媒体数据进行解码、编码、预处理和/或后处理的逻辑。在至少一个实施例中,媒体管线2039经由对子核心2001-2001f内的计算或采样逻辑的请求来实现媒体操作。
[0228]
在至少一个实施例中,soc接口2037使图形核心2000能够与通用应用处理器核心(例如,cpu)和/或soc内的其他组件通信,包括存储器层次结构元素,诸如共享的llc存储器、系统ram和/或嵌入式片上或封装dram。在至少一个实施例中,soc接口2037还可以使得能够与soc内的固定功能设备(例如,相机成像管线)进行通信,并且使得能够使用和/或实现可以在图形核心2000和soc内部的cpu之间共享的全局存储器原子。在至少一个实施例中,soc接口2037还可以实现用于图形核心2000的电源管理控制,并且启用图形核心2000的时钟域与soc内的其他时钟域之间的接口。在至少一个实施例中,soc接口2037使得能够从命令流转化器和全局线程分派器接收命令缓冲区,其配置为向图形处理器内的一个或更多个图形核心中的每一个提供命令和指令。在至少一个实施例中,当要执行媒体操作时,可以将命令和指令分派给媒体管线2039,或者当要执行图处理操作时,可以将其分配给几何形状和固定功能管线(例如,几何形状和固定功能管线2036、几何形状和固定功能管线2014)。
[0229]
在至少一个实施例中,图形微控制器2038可以配置为对图形核心2000执行各种调度和管理任务。在至少一个实施例中,图形微控制器2038可以在子核心2001a-2001f中的执行单元(eu)阵列2002a-2002f、2004a-2004f内的各种图形并行引擎上执行图和/或计算工作负载调度。在至少一个实施例中,在包括图形核心2000的soc的cpu核心上执行的主机软件可以提交多个图形处理器门铃之一的工作负载,其调用适当的图形引擎上的调度操作。在至少一个实施例中,调度操作包括确定接下来要运行哪个工作负载、将工作负载提交给命令流转化器、抢先在引擎上运行的现有工作负载、监控工作负载的进度以及在工作负载完成时通知主机软件。在至少一个实施例中,图形微控制器2038还可以促进图形核心2000
的低功率或空闲状态,从而为图形核心2000提供在图形核心2000内独立于操作系统和/或系统上的图形驱动器软件的跨低功率状态转换的保存和恢复寄存器的能力。
[0230]
在至少一个实施例中,图形核心2000可以具有比所示的子核心2001a-2001f更多或更少的子核心,达n个模块化子核心。对于每组n个子核心,在至少一个实施例中,图形核心2000还可以包括共享功能逻辑2010、共享和/或高速缓存存储器2012、几何/固定功能管线2014以及附加的固定功能逻辑2016以加速各种图形和计算处理操作。在至少一个实施例中,共享功能逻辑2010可以包括可由图形核心2000内的每个n个子核心共享的逻辑单元(例如,采样器、数学和/或线程间通信逻辑)。共享和/或高速缓存存储器2012可以是图形核心2000内的n个子核心2001a-2001f的llc,并且还可以用作可由多个子核心访问的共享存储器。在至少一个实施例中,可以包括几何/固定功能管线2014来代替固定功能块2030内的几何/固定功能管线2036,并且可以包括相同或相似的逻辑单元。
[0231]
在至少一个实施例中,图形核心2000包括附加的固定功能逻辑2016,其可以包括供图形核心2000使用的各种固定功能加速逻辑。在至少一个实施例中,附加的固定功能逻辑2016包括用于仅位置着色中使用的附加的几何管线。在仅位置着色中,存在至少两个几何管线,而在几何/固定功能管线2016、2036内的完整几何管线和剔除管线中,其是可以包括在附加的固定功能逻辑2016中的附加几何管线。在至少一个实施例中,剔除管线是完整几何管线的修整版。在至少一个实施例中,完整管线和剔除管线可以执行应用程序的不同实例,每个实例具有单独的环境。在至少一个实施例中,仅位置着色可以隐藏被丢弃的三角形的长剔除运行,从而在某些情况下可以更早地完成着色。例如,在至少一个实施例中,附加固定功能逻辑2016中的剔除管线逻辑可以与主应用程序并行执行位置着色器,并且通常比完整管线更快地生成关键结果,因为剔除管线获取并遮蔽顶点的位置属性,无需执行光栅化和将像素渲染到帧缓冲区。在至少一个实施例中,剔除管线可以使用生成的临界结果来计算所有三角形的可见性信息,而与这些三角形是否被剔除无关。在至少一个实施例中,完整管线(在这种情况下可以称为重播管线)可以消耗可见性信息来跳过剔除的三角形以仅遮盖最终传递到光栅化阶段的可见三角形。
[0232]
在至少一个实施例中,附加的固定功能逻辑2016还可包括通用目标处理加速逻辑,例如固定功能矩阵乘法逻辑,用于实现减速cuad程序。
[0233]
在至少一个实施例中,在每个图形子核心2001a-2001f内包括一组执行资源,其可用于响应于图形管线、媒体管线或着色器程序的请求来执行图、媒体和计算操作。在至少一个实施例中,图形子核心2001a-2001f包括多个eu阵列2002a-2002f、2004a-2004f,线程分派和线程间通信(td/ic)逻辑2003a-2003f,3d(例如,纹理)采样器2005a-2005f,媒体采样器2006a-2006f,着色器处理器2007a-2007f和共享本地存储器(slm)2008a-2008f。eu阵列2002a-2002f、2004a-2004f每个都包含多个执行单元,这些执行单元是gugpu,能够为图形、媒体或计算操作提供服务,执行浮点和整数/定点逻辑运算,包括图形、媒体或计算着色器程序。在至少一个实施例中,td/ic逻辑2003a-2003f为子核心内的执行单元执行本地线程分派和线程控制操作,并促进在子核心的执行单元上执行的线程之间的通信。在至少一个实施例中,3d采样器2005a-2005f可以将与纹理或其他3d图形相关的数据读取到存储器中。在至少一个实施例中,3d采样器可以基于与给定纹理相关联的配置的采样状态和纹理格式来不同地读取纹理数据。在至少一个实施例中,媒体采样器2006a-2006f可以基于与媒体数
据相关联的类型和格式来执行类似的读取操作。在至少一个实施例中,每个图形子核心2001a-2001f可以可替代地包括统一的3d和媒体采样器。在至少一个实施例中,在每个子核心2001a-2001f内的执行单元上执行的线程可以利用每个子核心内的共享本地存储器2008a-2008f,以使在线程组内执行的线程能够使用片上存储器的公共池来执行。
[0234]
图21示出了根据至少一个实施例的并行处理单元(“ppu”)2100。在至少一个实施例中,ppu 2100可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,ppu 2100配置有机器可读代码,该机器可读代码如果由ppu 2100执行,则使得ppu 2100执行贯穿本文描述的一些或全部过程和技术。在至少一个实施例中,ppu 2100是在一个或更多个集成电路设备上实现的多线程处理器,并且利用多线程作为被设计为处理在多个线程上并行执行的计算机可读指令(也称为机器可读指令或简单的指令)的延迟隐藏技术。在至少一个实施例中,线程是指执行线程,并且是被配置为由ppu 2100执行的一组指令的实例。在至少一个实施例中,ppu 2100是图形处理单元(“gpu”),图形处理单元配置为实现用于处理三维(“3d”)图形数据的图形渲染管线,以便生成用于在显示设备(诸如lcd设备)上显示的二维(“2d”)图像数据。在至少一个实施例中,ppu 2100用于执行计算,诸如线性代数运算和机器学习运算。图21仅出于说明性目的示出了示例并行处理器,并且应被解释为在至少一个实施例中实现的处理器架构的非限制性示例。
[0235]
在至少一个实施例中,一个或更多个ppu 2100配置成加速高性能计算(“hpc”)、数据中心和机器学习应用程序。在至少一个实施例中,一个或更多个ppu 2100配置成加速cuda程序。在至少一个实施例中,ppu 2100包括但不限于i/o单元2106、前端单元2110、调度器单元2112、工作分配单元2114、集线器2116、交叉开关(“xbar”)2120、一个或更多个通用处理集群(“gpc”)2118和一个或更多个分区单元(“存储器分区单元”)2122。在至少一个实施例中,ppu 2100通过一个或更多个高速gpu互连(“gpu互连”)2108连接到主机处理器或其他ppu 2100。在至少一个实施例中,ppu 2100通过互连2102连接到主机处理器或其他外围设备。在一实施例中,ppu 2100连接到包括一个或更多个存储器设备(“存储器”)2104的本地存储器。在至少一个实施例中,存储器设备2104包括但不限于一个或更多个动态随机存取存储器(“dram”)设备。在至少一个实施例中,一个或更多个dram设备配置和/或可配置为高带宽存储器(“hbm”)子系统,并且在每个设备内堆叠有多个dram管芯。
[0236]
在至少一个实施例中,高速gpu互连2108可以指代系统使用其来进行缩放的基于线的多通道通信链路,并包括与一个或更多个cpu结合的一个或更多个ppu2100(“cpu”),支持ppu2100和cpu之间的高速缓存一致性以及cpu主控。在至少一个实施例中,高速gpu互连2108通过集线器2116将数据和/或命令传输到ppu2100的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元和/或在图21中可能未明确示出的其他组件。
[0237]
在至少一个实施例中,i/o单元2106配置为通过系统总线2102从主机处理器(图21中未示出)发送和接收通信(例如,命令、数据)。在至少一个实施例中,i/o单元2106直接通过系统总线2102或通过一个或更多个中间设备(例如存储器桥)与主机处理器通信。在至少一个实施例中,i/o单元2106可以经由系统总线2102与一个或更多个其他处理器(例如一个或更多个ppu2100)通信。在至少一个实施例中,i/o单元2106实现pcie接口,用于通过pcie总线进行通信。在至少一个实施例中,i/o单元2106实现用于与外部设备通信的接口。
[0238]
在至少一个实施例中,i/o单元2106对经由系统总线2102接收的分组进行解码。在至少一个实施例中,至少一些分组表示被配置为使ppu 2100执行各种操作的命令。在至少一个实施例中,i/o单元2106如命令所指定的那样将解码的命令发送到ppu 2100的各种其他单元。在至少一个实施例中,命令被发送到前端单元2110和/或被发送到集线器2116或ppu 2100的其他单元,例如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(图21中未明确示出)。在至少一个实施例中,i/o单元2106配置为在ppu 2100的各种逻辑单元之间路由通信。
[0239]
在至少一个实施例中,由主机处理器执行的程序在缓冲区中对命令流进行编码,该缓冲区将工作负载提供给ppu 2100以进行处理。在至少一个实施例中,工作负载包括指令和要由那些指令处理的数据。在至少一个实施例中,缓冲区是可由主机处理器和ppu 2100两者访问(例如,读/写)的存储器中的区域—主机接口单元可以配置为访问经由i/o单元2106通过系统总线2102传输的存储器请求连接到系统总线2102的系统存储器中的缓冲区。在至少一个实施例中,主机处理器将命令流写入缓冲区,然后将指示命令流开始的指针发送给ppu 2100,使得前端单元2110接收指向一个或更多个命令流指针并管理一个或更多个命令流,从命令流中读取命令并将命令转发到ppu 2100的各个单元。
[0240]
在至少一个实施例中,前端单元2110耦合到调度器单元2112,该调度器单元2112配置各种gpc 2118以处理由一个或更多个命令流定义的任务。在至少一个实施例中,调度器单元2112配置为跟踪与调度器单元2112管理的各种任务有关的状态信息,其中状态信息可以指示任务被分配给哪个gpc 2118,任务是活跃的还是非活跃的,与任务相关联的优先级等等。在至少一个实施例中,调度器单元2112管理在一个或更多个gpc 2118上执行的多个任务。
[0241]
在至少一个实施例中,调度器单元2112耦合到工作分配单元2114,该工作分配单元2114配置为分派任务以在gpc 2118上执行。在至少一个实施例中,工作分配单元2114跟踪从调度器单元2112接收到的多个调度任务并且工作分配单元2114管理每个gpc 2118的待处理任务池和活跃任务池。在至少一个实施例中,待处理任务池包括多个时隙(例如32个时隙),这些时隙包含分配给要由特定的gpc 2118处理的任务;活跃任务池可包括用于由gpc 2118主动处理的任务的多个时隙(例如4个时隙),以使随着gpc 2118中的一个完成任务的执行,该任务将从gpc 2118的活动任务池中逐出,并且从待处理任务池中选择其他任务之一,并安排其在gpc 2118上执行。在至少一个实施例中,如果活跃任务在gpc 2118上处于空闲状态,例如在等待数据依赖性解决时,则活跃任务从gpc 2118中驱逐并返回到待处理任务池,同时选择了待处理任务池中的另一个任务并调度在gpc 2118上执行。
[0242]
在至少一个实施例中,工作分配单元2114经由xbar 2120与一个或更多个gpc 2118通信。在至少一个实施例中,xbar 2120是互连网络,其将ppu 2100的许多单元耦合到ppu 2100的其他单元,并且可以配置为将工作分配单元2114耦合到特定的gpc 2118。在至少一个实施例中,一个或更多个ppu 2100的其他单元也可以通过集线器2116连接到xbar 2120。
[0243]
在至少一个实施例中,任务由调度器单元2112管理,并由工作分配单元2114分配给gpc 2118之一。gpc 2118配置为处理任务并产生结果。在至少一个实施例中,结果可以由gpc 2118中的其他任务消耗,通过xbar2120路由到不同的gpc 2118或存储在存储器2104
中。在至少一个实施例中,结果可以通过分区单元2122写到存储器2104中,其实现了用于向存储器2104写入数据或从存储器2104读取数据的存储器接口。在至少一个实施例中,结果可以经由高速gpu互连2108传输到另一ppu 2100或cpu。在至少一个实施例中,ppu 2100包括但不限于u个分区单元2122,其等于耦合到ppu 2100的分离且不同的存储器设备2104的数量。
[0244]
在至少一个实施例中,主机处理器执行驱动器核心,该驱动器核心实现应用程序编程接口(api),该应用程序编程接口使在主机处理器上执行的一个或更多个应用程序能够调度操作以在ppu 2100上执行。在一个实施例中,多个计算应用由ppu 2100同时执行,并且ppu 2100为多个计算应用程序提供隔离、服务质量(“qos”)和独立的地址空间。在至少一个实施例中,应用程序生成指令(例如,以api调用的形式),该指令使驱动器核心生成一个或更多个任务以供ppu 2100执行,并且驱动器核心将任务输出至由ppu 2100处理的一个或更多个流。在至少一个实施例中,每个任务包括一个或更多个相关线程组,其可以被称为线程束(warp)。在至少一个实施例中,线程束包括可以并行执行的多个相关线程(例如32个线程)。在至少一个实施例中,协作线程可以指代多个线程,包括用于执行任务并且通过共享存储器交换数据的指令。
[0245]
图22示出了根据至少一个实施例的gpc 2200。在至少一个实施例中,gpc 2200可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,gpc 2200是图21的gpc 2118。在至少一个实施例中,每个gpc 2200包括但不限于用于处理任务的多个硬件单元,并且每个gpc 2200包括但不限于管线管理器2202、预光栅操作单元(“prop”)2204、光栅引擎2208、工作分配交叉开关(“wdx”)2216、存储器管理单元(“mmu”)2218、一个或更多个数据处理集群(“dpc”)2206,以及部件的任何合适组合。
[0246]
在至少一个实施例中,gpc 2200的操作由管线管理器2202控制。在至少一个实施例中,管线管理器2202管理一个或更多个dpc 2206的配置,以处理分配给gpc 2200的任务。在至少一个实施例中,管线管理器2202配置一个或更多个dpc 2206中的至少一个以实现图形渲染管线的至少一部分。在至少一个实施例中,dpc 2206配置为在可编程流式多处理器(“sm”)2214上执行顶点着色器程序。在至少一个实施例中,管线管理器2202配置为将从工作分配单元接收的数据包路由到gpc 2200内的适当逻辑单元,以及在至少一个实施例中,可以将一些数据包路由到prop 2204和/或光栅引擎2208中的固定功能硬件单元,而可以将其他数据包路由到dpc 2206以由原始引擎2212或sm 2214进行处理。在至少一个实施例中,管线管理器2202配置dpc 2206中的至少一个以实现神经网络模型和/或计算管线。在至少一个实施例中,管线管理器2202配置dpc 2206中的至少一个以执行cuda程序的至少一部分。
[0247]
在至少一个实施例中,prop单元2204配置为将由光栅引擎2208和dpc 2206生成的数据路由到分区单元中的光栅操作(“rop”)单元,例如上面结合图21更详细描述的存储器分区单元2122等。在至少一个实施例中,prop单元2204配置为执行用于颜色混合的优化、组织像素数据、执行地址转换等等。在至少一个实施例中,光栅引擎2208包括但不限于配置为执行各种光栅操作的多个固定功能硬件单元,并且在至少一个实施例中,光栅引擎2208包括但不限于设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎、图块聚合引擎及其
任意合适的组合。在至少一个实施例中,设置引擎接收变换后的顶点并生成与由顶点定义的几何图元相关联的平面方程;平面方程式被传送到粗光栅引擎以生成基本图元的覆盖信息(例如,图块的x、y覆盖范围掩码);粗光栅引擎的输出将传输到剔除引擎,在剔除引擎中与z测试失败的图元相关联的片段将被剔除,并传输到剪切引擎,在剪切引擎中剪切位于视锥范围之外的片段。在至少一个实施例中,将经过裁剪和剔除的片段传递给精细光栅引擎,以基于设置引擎生成的平面方程式生成像素片段的属性。在至少一个实施例中,光栅引擎2208的输出包括将由任何适当的实体(例如,由在dpc 2206内实现的片段着色器)处理的片段。
[0248]
在至少一个实施例中,包括在gpc 2200中的每个dpc 2206包括但不限于m管线控制器(“mpc”)2210;图元引擎2212;一个或更多个sm 2214;及其任何合适的组合。在至少一个实施例中,mpc 2210控制dpc2206的操作,将从管线管理器2202接收的分组路由到dpc 2206中的适当单元。在至少一个实施例中,将与顶点相关联的分组路由到图元引擎2212,图元引擎2212配置为从存储器中获取与顶点关联的顶点属性;相反,可以将与着色器程序相关联的数据包发送到sm 2214。
[0249]
在至少一个实施例中,sm 2214包括但不限于可编程流式处理器,其配置为处理由多个线程表示的任务。在至少一个实施例中,sm 2214是多线程的并且配置为同时执行来自特定线程组的多个线程(例如32个线程),并且实现单指令、多数据(“simd”)架构,其中将一组线程(例如,线程束)中的每个线程配置为基于相同的指令集来处理不同的数据集。在至少一个实施例中,线程组中的所有线程执行相同的指令。在至少一个实施例中,sm 2214实施单指令、多线程(“simt”)架构,其中一组线程中的每个线程配置为基于相同的指令集来处理不同的数据集,但是其中线程组中的各个线程允许在执行期间发散。在至少一个实施例中,为每个线程束维护程序计数器、调用栈和执行状态,从而当线程束中的线程发散时,实现线程束和线程束内的串行执行之间的并发性。在另一个实施例中,为每个单独的线程维护程序计数器、调用栈和执行状态,从而使得在线程束内和线程束之间的所有线程之间具有相等的并发性。在至少一个实施例中,为每个单独的线程维持执行状态,并且可以收敛并并行地执行执行相同指令的线程以提高效率。下面结合图23更详细地描述sm 2214的至少一个实施例。
[0250]
在至少一个实施例中,mmu 2218在gpc 2200和存储器分区单元(例如,图21的分区单元2122)之间提供接口,并且mmu 2218提供虚拟地址到物理地址的转换、存储器保护以及存储器请求的仲裁。在至少一个实施例中,mmu 2218提供一个或更多个转换后备缓冲区(“tlb”),用于执行虚拟地址到存储器中的物理地址的转换。
[0251]
图23示出了根据至少一个实施例的流式多处理器(“sm”)2300。在至少一个实施例中,sm 2300可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,sm 2300是图22的sm 2214。在至少一个实施例中,sm 2300包括但不限于指令高速缓存2302;一个或更多个调度器单元2304;寄存器文件2308;一个或更多个处理核心(“核心”)2310;一个或更多个特殊功能单元(“sfu”)2312;一个或更多个加载/存储单元(“lsu”)2314;互连网络2316;共享存储器/一级(“l1”)高速缓存2318;及其任何合适的组合。在至少一个实施例中,工作分配单元调度任务以在并行处理单元(“ppu”)的通用处理集群(“gpc”)上执行,并且每个任务被分配给gpc内部的特
矩阵。
[0256]
在至少一个实施例中,矩阵乘法输入a和b是16位浮点矩阵,并且累加矩阵c和d是16位浮点或32位浮点矩阵。在至少一个实施例中,张量核心对16位浮点输入数据进行32位浮点累加运算。在至少一个实施例中,16位浮点乘法使用64个运算,并得到全精度乘积,然后使用32位浮点加法与其他中间乘积累加起来,以进行4x4x4矩阵乘法。在至少一个实施例中,张量核心用于执行由这些较小的元件构成的更大的二维或更高维度的矩阵运算。在至少一个实施例中,api(诸如cuda-c api)公开专门的矩阵加载、矩阵乘法和累加以及矩阵存储操作,以有效地使用来自cuda-c 程序的张量核心。在至少一个实施例中,在cuda级别,线程束级别接口假定跨越所有32个线程束线程的16
×
16大小的矩阵。
[0257]
在至少一个实施例中,每个sm 2300包括但不限于执行特殊功能(例如,属性评估、倒数平方根等)的m个sfu 2312。在至少一个实施例中,sfu 2312包括但不限于配置为遍历分层树数据结构的树遍历单元。在至少一个实施例中,sfu 2312包括但不限于配置为执行纹理映射过滤操作的纹理单元。在至少一个实施例中,纹理单元配置为从存储器中加载纹理映射(例如,纹理像素的2d阵列)和采样纹理映射,以产生采样的纹理值以供由sm 2300执行的着色器程序使用。在至少一个实施例中,将纹理映射存储在共享存储器/l1高速缓存2318中。在至少一个实施例中,纹理单元使用mip映射(mip-maps)(例如,细节级别不同的纹理映射)来实现纹理操作(诸如过滤操作)。在至少一个实施例中,每个sm 2300包括但不限于两个纹理单元。
[0258]
在至少一个实施例中,每个sm 2300包括但不限于实现共享存储器/l1高速缓存2318与寄存器文件2308之间的加载和存储操作的n个lsu 2314。在至少一个实施例中,每个sm 2300包括但不限于互连网络2316,互连网络2316将每个功能单元连接到寄存器文件2308,并且lsu 2314连接到寄存器文件2308和共享存储器/l1高速缓存2318。在至少一个实施例中,互连网络2316是交叉开关,其可以配置为将任何功能单元连接到寄存器文件2308中的任何寄存器,并且将lsu 2314连接到寄存器文件2308和共享存储器/l1高速缓存2318中的存储器位置。
[0259]
在至少一个实施例中,共享存储器/l1高速缓存2318是片上存储器的阵列,其在至少一个实施例中允许sm 2300与图元引擎之间以及sm 2300中的线程之间的数据存储和通信。在至少一个实施例中,共享存储器/l1高速缓存2318包括但不限于128kb的存储容量,并且位于从sm 2300到分区单元的路径中。在至少一个实施例中,共享存储器/l1高速缓存2318在至少一个实施例中用于高速缓存读取和写入。在至少一个实施例中,共享存储器/l1高速缓存2318、l2高速缓存和存储器中的一个或更多个是后备存储。
[0260]
在至少一个实施例中,将数据高速缓存和共享存储器功能组合到单个存储器块中,为两种类型的存储器访问提供了改进的性能。在至少一个实施例中,容量由不使用共享存储器的程序使用或将其用作高速缓存,例如如果共享存储器配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。根据至少一个实施例,在共享存储器/l1高速缓存2318内的集成使共享存储器/l1高速缓存2318能够用作用于流传输数据的高吞吐量管线,同时提供对频繁重用的数据的高带宽和低延迟访问。在至少一个实施例中,当配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。在至少一个实施例中,绕过固定功能gpu,从而创建了更加简单的编程模型。在至少一个实施例中,在通用并行计算配置中,
工作分配单元直接将线程的块分配和分布给dpc。在至少一个实施例中,块中的线程执行相同的程序,在计算中使用唯一的线程id以确保每个线程生成唯一的结果,使用sm 2300执行程序并执行计算,使用共享存储器/l1高速缓存2318在线程之间进行通信,以及使用lsu 2314通过共享存储器/l1高速缓存2318和存储器分区单元来读写全局存储器。在至少一个实施例中,当被配置用于通用并行计算时,sm 2300向调度器单元2304写入可以用来在dpc上启动新工作的命令。
[0261]
在至少一个实施例中,ppu被包括在台式计算机、膝上型计算机、平板电脑、服务器、超级计算机、智能电话(例如,无线、手持设备)、pda、数码相机、车辆、头戴式显示器、手持式电子设备等中或与之耦合。在至少一个实施例中,ppu被实现在单个半导体衬底上。在至少一个实施例中,ppu与一个或更多个其他设备(例如附加的ppu、存储器、risccpu,mmu、数模转换器(“dac”)等)一起被包括在片上系统(“soc”)中。
[0262]
在至少一个实施例中,ppu可以被包括在包括一个或更多个存储设备的图形卡上。图形卡可以配置为与台式计算机主板上的pcie插槽相连接。在至少一个实施例中,ppu可以是包括在主板的芯片组中的集成gpu(“igpu”)。
[0263]
通用计算的软件构造
[0264]
以下各图阐述但不限于用于实现至少一个实施例的示例性软件构造。
[0265]
图24示出了根据至少一个实施例的编程平台的软件栈。在至少一个实施例中,编程平台的软件栈可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,编程平台是用于利用计算系统上的硬件来加速计算任务的平台。在至少一个实施例中,软件开发人员可以通过库、编译器指令和/或对编程语言的扩展来访问编程平台。在至少一个实施例中,编程平台可以是但不限于cuda,radeon开放计算平台(“rocm”),opencl(由khronosgroup开发的opencl
tm
),sycl或inteloneapi。
[0266]
在至少一个实施例中,编程平台的软件栈2400为应用程序2401提供执行环境。在至少一个实施例中,应用程序2401可以包括能够在软件栈2400上启动的任何计算机软件。在至少一个实施例中,应用程序2401可以包括但不限于人工智能(“ai”)/机器学习(“ml”)应用程序,高性能计算(“hpc”)应用程序,虚拟桌面基础架构(“vdi”)或数据中心工作负载。
[0267]
在至少一个实施例中,应用程序2401和软件栈2400在硬件2407上运行。在至少一个实施例中,硬件2407可以包括一个或更多个gpu,cpu,fpga,ai引擎和/或支持编程平台的其他类型的计算设备。在至少一个实施例中,例如采用cuda,软件栈2400可以是厂商专用的,并且仅与来自特定厂商的设备兼容。在至少一个实施例中,例如在采用opencl中,软件栈2400可以与来自不同供应商的设备一起使用。在至少一个实施例中,硬件2407包括连接到一个或更多个设备的主机,该设备可经由应用程序编程接口(api)调用被访问以执行计算任务。在至少一个实施例中,与硬件2407内的主机相比,其可以包括但不限于cpu(但还可以包括计算设备)及其存储器,硬件2407内的设备可以包括但不限于gpu,fpga,ai引擎或其他计算设备(但还可以包括cpu)及其存储器。
[0268]
在至少一个实施例中,编程平台的软件栈2400包括但不限于多个库2403,运行时(runtime)2405和设备内核驱动器2406。在至少一个实施例中,库2403中的每个库可以包括可以由计算机程序使用并在软件开发期间利用的数据和编程代码。在至少一个实施例中,
库2403可以包括但不限于预写的代码和子例程,类,值,类型规范,配置数据,文档,帮助数据和/或消息模板。在至少一个实施例中,库2403包括被优化用于在一种或更多种类型的设备上执行的函数。在至少一个实施例中,库2403可以包括但不限于用于在设备上执行数学、深度学习和/或其他类型的运算的函数。在至少一个实施例中,库2503与对应的api2502相关联,api2502可包括一个或更多个api,其暴露在库2503中实现的函数。
[0269]
在至少一个实施例中,将应用程序2401编写为源代码,该源代码被编译成可执行代码,如下面结合图29-31更详细讨论的。在至少一个实施例中,应用程序2401的可执行代码可以至少部分地在由软件栈2400提供的执行环境上运行。在至少一个实施例中,在应用程序2401的执行期间,可以得到需要在设备(与主机相比)上运行的代码。在这种情况下,在至少一个实施例中,可以调用运行时2405以在设备上加载和启动必需的代码。在至少一个实施例中,运行时2405可以包括能够支持应用程序2401的执行的任何技术上可行的运行时系统。
[0270]
在至少一个实施例中,运行时2405被实现为与对应的api(其被示为api 2404)相关联的一个或更多个运行时库。在至少一个实施例中,一个或更多个这样的运行时库可以包括但不限于用于存储器管理,执行控制,设备管理,错误处理和/或同步等等的函数。在至少一个实施例中,存储器管理函数可以包括但不限于用于分配、解除分配和复制设备存储器以及在主机存储器和设备存储器之间传输数据的函数。在至少一个实施例中,执行控制函数可以包括但不限于在设备上启动函数(当函数是可从主机调用的全局函数时,有时称为“内核”)的函数,和用于在运行时库为要在设备上执行的给定函数维护的缓冲区中设置属性值的函数。
[0271]
在至少一个实施例中,可以任何技术上可行的方式来实现运行时库和相应的api 2404。在至少一个实施例中,一个(或任意数量的)api可以公开用于设备的细粒度控制的低级函数集,而另一(或任意数量的)api可以公开这样的较高级的函数集。在至少一个实施例中,可以在低级api之上构建高级运行时api。在至少一个实施例中,一个或更多个运行时api可以是在与语言无关的运行时api之上分层的特定于语言的api。
[0272]
在至少一个实施例中,设备内核驱动器2406被配置为促进与底层设备的通信。在至少一个实施例中,设备内核驱动器2406可以提供诸如api 2404之类的api和/或其他软件所依赖的低级函数。在至少一个实施例中,设备内核驱动器2406可以被配置为在运行时将中间表示(“ir”)代码编译成二进制代码。在至少一个实施例中,对于cuda,设备内核驱动器2406可以在运行时将非硬件专用的并行线程执行(“ptx”)ir代码编译为用于特定目标设备的二进制代码(高速缓存已编译的二进制代码),其有时也称为“最终”代码。在至少一个实施例中,这样做可以允许最终代码在目标设备上运行,而当源代码最初被编译为ptx代码时,该目标设备可能不存在。备选地,在至少一个实施例中,设备源代码可以离线地编译成二进制代码,而不需要设备内核驱动器2406在运行时编译ir代码。
[0273]
图25示出了根据至少一个实施例的图24的软件栈2400的cuda实现。在至少一个实施例中,可在其上启动应用程序2501的cuda软件栈2500包括cuda库2503,cuda运行时2505,cuda驱动器2507和设备内核驱动器2508。在至少一个实施例中,cuda软件栈2500在硬件2509上执行,该硬件2509可以包括支持cuda的gpu,其由加利福尼亚州圣克拉拉市的nvidia公司开发。
[0274]
在至少一个实施例中,应用程序2501、cuda运行时2505和设备内核驱动器2508可以分别执行与应用程序2401、运行时2405和设备内核驱动器2406类似的功能,以上结合图24对其进行了描述。在至少一个实施例中,cuda驱动器2507包括实现cuda驱动器api 2506的库(libcuda.so)。在至少一个实施例中,类似于由cuda运行时库(cudart)实现的cuda运行时api 2504,cuda驱动器api 2506可以公开但不限于用于存储器管理、执行控制、设备管理、错误处理、同步和/或图形互操作性等的函数。在至少一个实施例中,cuda驱动器api 2506与cuda运行时api 2504的不同之处在于,cuda运行时api 2504通过提供隐式初始化、上下文(类似于进程)管理和模块(类似于动态加载的库)管理来简化设备代码管理。与高级cuda运行时api 2504相反,在至少一个实施例中,cuda驱动器api 2506是提供对设备的更细粒度控制的低级api,特别是关于上下文和模块加载。在至少一个实施例中,cuda驱动器api 2506可以公开没有由cuda运行时api 2504公开的用于上下文管理的函数。在至少一个实施例中,cuda驱动器api 2506也与语言无关,并且除了支持cuda运行时api 2504之外,还支持例如opencl。此外,在至少一个实施例中,包括cuda运行时2505在内的开发库可被视为与驱动器组件分离,包括用户模式的cuda驱动器2507和内核模式的设备驱动器2508(有时也称为“显示”驱动器)。
[0275]
在至少一个实施例中,cuda库2503可以包括但不限于数学库,深度学习库,并行算法库和/或信号/图像/视频处理库,并行计算应用程序(例如应用程序2501)可以利用这些库。在至少一个实施例中,cuda库2503可包括数学库,例如cublas库,其是用于执行线性代数运算的基本线性代数子程序(“blas”)的实现;用于计算快速傅立叶变换(“fft”)的cufft库,以及用于生成随机数的curand库等。在至少一个实施例中,cuda库2503可以包括深度学习库,诸如用于深度神经网络的基元的cudnn库和用于高性能深度学习推理的tensorrt平台等等。
[0276]
图26示出了根据至少一个实施例的图24的软件栈2400的rocm实现。在至少一个实施例中,可在其上启动应用程序2601的rocm软件栈2600包括语言运行时2603,系统运行时2605,thunk2607,rocm内核驱动器2608和设备内核驱动器。在至少一个实施例中,rocm软件栈2600在硬件2609上执行,硬件2609可以包括支持rocm的gpu,其由加利福尼亚州圣克拉拉市的amd公司开发。
[0277]
在至少一个实施例中,应用程序2601可以执行与以上结合图24讨论的应用程序2401类似的功能。另外,在至少一个实施例中,语言运行时2603和系统运行时2605可以执行与以上结合图24讨论的运行时2405类似的功能。在至少一个实施例中,语言运行时2603和系统运行时2605的不同之处在于,系统运行时2605是实现rocr系统运行时api 2604并利用异构系统架构(“hsa”)运行时api的语言无关运行时。在至少一个实施例中,hsa运行时api是一种瘦用户模式api,它公开接口以供访问和与amd gpu交互,包括用于存储器管理、通过架构分派内核的执行控制、错误处理、系统和代理信息以及运行时初始化和关闭等的函数。在至少一个实施例中,与系统运行时2605相比,语言运行时2603是rocr系统运行时api 2604之上分层的特定于语言的运行时api 2602的实现。在至少一个实施例中,语言运行时api可以包括但不限于可移植异构计算接口(“hip”)语言运行时api,异构计算编译器(“hcc”)语言运行时api或opencl api等等。特别是,hip语言是c 编程语言的扩展,具有cuda机制的功能相似版本,并且在至少一个实施例中,hip语言运行时api包括与以上结合
图25讨论的cuda运行时api 2504相似的函数,例如用于存储器管理、执行控制、设备管理、错误处理和同步等的函数。
[0278]
在至少一个实施例中,thunk(roct)2607是可用于与底层rocm驱动器2608交互的接口。在至少一个实施例中,rocm驱动器2608是rock驱动器,其是amd gpu驱动器和h24内核驱动器(amdkfd)的组合。在至少一个实施例中,amd gpu驱动器是由amd开发的用于gpu的设备内核驱动器,其执行与以上结合图24讨论的设备内核驱动器2406类似的功能。在至少一个实施例中,hsa内核驱动器是允许不同类型的处理器经由硬件特征更有效地共享系统资源的驱动器。
[0279]
在至少一个实施例中,各种库(未示出)可以被包括在语言运行时2603上方的rocm软件栈2600中,并且提供与以上结合图25讨论的cuda库2503相似的功能。在至少一个实施例中,各种库可以包括但不限于数学、深度学习和/或其他库,例如实现与cuda cublas类似的函数的hipblas库,类似于cuda cufft用于计算fft的rocfft库等。
[0280]
图27示出了根据至少一个实施例的图24的软件栈2400的opencl实现。在至少一个实施例中,可以在其上启动应用程序2701的opencl软件栈2700包括opencl框架2705,opencl运行时2706和驱动器2707。在至少一个实施例中,opencl软件栈2700在不是特定于供应商的硬件2509上执行。在至少一个实施例中,由于由不同厂商开发的设备支持opencl,因此可能需要特定的opencl驱动器才能与来自此类厂商的硬件进行互操作。
[0281]
在至少一个实施例中,应用程序2701,opencl运行时2706,设备内核驱动器2707和硬件2708可以分别执行与上面结合图24讨论的应用程序2401、运行时2405、设备内核驱动器2406和硬件2407类似的功能。在至少一个实施例中,应用程序2701还包括具有将在设备上执行的代码的opencl内核2702。
[0282]
在至少一个实施例中,opencl定义了一种“平台”,其允许主机控制连接到该主机的设备。在至少一个实施例中,opencl框架提供平台层api和运行时api,示出为平台api 2703和运行时api 2705。在至少一个实施例中,运行时api 2705使用上下文来管理设备上内核的执行。在至少一个实施例中,每个标识的设备可以与各自的上下文相关联,运行时api 2705可以使用该上下文来管理该设备的命令队列、程序对象和内核对象、共享存储器对象等。在至少一个实施例中,平台api 2703公开了允许设备上下文用于选择和初始化设备,经由命令队列将工作提交给设备,以及使得能够进行来自和去往设备的数据传输等的函数。另外,在至少一个实施例中,opencl框架提供各种内置函数(未示出),包括数学函数、关系函数和图像处理函数等。
[0283]
在至少一个实施例中,编译器2704也被包括在opencl框架2705中。在至少一个实施例中,源代码可以在执行应用程序之前被离线编译或者在执行应用程序期间被在线编译。与cuda和rocm相反,至少一个实施例中的opencl应用程序可以由编译器2704在线编译,编译器2704被包括以代表可以用于将源代码和/或ir代码(例如标准可移植中间表示(“spir-v”)代码)编译为二进制代码的任意数量的编译器。可替代地,在至少一个实施例中,可以在执行这样的应用程序之前离线编译opencl应用程序。
[0284]
图28示出了根据至少一个实施例的由编程平台支持的软件。在至少一个实施例中,编程平台2804可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分。在至少一个实施例中,编程平台2804被配置为支持应
用程序2800可以依赖的各种编程模型2803,中间件和/或库2802以及框架2801。在至少一个实施例中,应用程序2800可以是使用例如深度学习框架(例如,mxnet,pytorch或tensorflow)实现的ai/ml应用,其可以依赖于诸如cudnn,nvidia集合通信库(“nccl”)”和/或nvidia开发人员数据加载库(“dali”)cuda库之类的库,以在底层硬件上提供加速的计算。
[0285]
在至少一个实施例中,编程平台2804可以是以上分别结合图25、图26和图27描述的cuda、rocm或opencl平台之一。在至少一个实施例中,编程平台2804支持多个编程模型2803,其是底层计算系统的抽象,其允许算法和数据结构的表达。在至少一个实施例中,编程模型2803可以暴露底层硬件的特征以便改善性能。在至少一个实施例中,编程模型2803可以包括但不限于cuda,hip,opencl,c 加速大规模并行性(“c amp”),开放多处理(“openmp”),开放加速器(“openacc”)和/或vulcan计算(vulcan compute)。
[0286]
在至少一个实施例中,库和/或中间件2802提供编程模型2804的抽象的实现。在至少一个实施例中,这样的库包括可由计算机程序使用并在软件开发期间利用的数据和编程代码。在至少一个实施例中,除了可以从编程平台2804获得的那些之外,这样的中间件还包括向应用程序提供服务的软件。在至少一个实施例中,库和/或中间件2802可以包括但不限于cublas、cufft、curand和其他cuda库,或rocblas、rocfft、rocrand和其他rocm库。另外,在至少一个实施例中,库和/或中间件2802可以包括nccl和rocm通信集合库(“rccl”)库,其提供用于gpu的通信例程,用于深度学习加速的miopen库和/或用于线性代数、矩阵和向量运算、几何变换、数值求解器以及相关算法的本征库。
[0287]
在至少一个实施例中,应用程序框架2801依赖于库和/或中间件2802。在至少一个实施例中,每个应用程序框架2801是用于实现应用软件的标准结构的软件框架。回到上面讨论的ai/ml示例,在至少一个实施例中,可以使用框架(诸如caffe,caffe2,tensorflow,keras,pytorch或mxnet深度学习框架)来实现ai/ml应用。
[0288]
图29示出了根据至少一个实施例的编译代码以在图24-27的编程平台之一上执行。在至少一个实施例中,编译器2901接收源代码2900,其包括主机代码以及设备代码两者。在至少一个实施例中,编译器2901被配置为将源代码2900转换为用于在主机上执行的主机可执行代码2902以及用于在设备上执行的设备可执行代码2903。在至少一个实施例中,源代码2900可以在执行应用程序之前离线编译,或者在执行应用程序期间在线编译。
[0289]
在至少一个实施例中,源代码2900可以包括编译器2901支持的任何编程语言的代码,例如c 、c、fortran等。在至少一个实施例中,源代码2900可以包括在单源(single-source)文件中,其具有主机代码和设备代码的混合,并在其中指示了设备代码的位置。在至少一个实施例中,单源文件可以是包括cuda代码的.cu文件或包括hip代码的.hip.cpp文件。备选地,在至少一个实施例中,源代码2900可以包括多个源代码文件,而不是单源文件,在该单源文件中主机代码和设备代码是分开的。
[0290]
在至少一个实施例中,编译器2901被配置为将源代码2900编译成用于在主机上执行的主机可执行代码2902和用于在设备上执行的设备可执行代码2903。在至少一个实施例中,编译器2901执行操作,包括将源代码2900解析为抽象系统树(ast),执行优化以及生成可执行代码。在源代码2900包括单源文件的至少一个实施例中,编译器2901可以将设备代码与主机代码在这种单源文件中分开,将设备代码和主机代码分别编译成设备可执行代码
2903和主机可执行代码2902,以及将设备可执行代码2903和主机可执行代码2902在单个文件中链接到一起,如下面关于图30更详细讨论的。
[0291]
在至少一个实施例中,主机可执行代码2902和设备可执行代码2903可以是任何合适的格式,例如二进制代码和/或ir代码。在cuda的情况下,在至少一个实施例中,主机可执行代码2902可以包括本地对象代码,而设备可执行代码2903可以包括ptx中间表示的代码。在至少一个实施例中,在rocm的情况下,主机可执行代码2902和设备可执行代码2903都可以包括目标二进制代码。
[0292]
图30是根据至少一个实施例的编译代码以在图24-27的编程平台之一上执行的更详细图示。在至少一个实施例中,图24-27的编程平台之一可以包括在图1-3中公开的一个或更多个系统中或是其一部分,并且可以执行图4中的所有过程400的一部分,例如,第一编译器106和第二编译器110。在至少一个实施例中,编译器3001被配置为接收源代码3000,编译源代码3000,并输出可执行文件3008。在至少一个实施例中,源代码3000是单源文件,例如.cu文件,.hip.cpp文件或其他格式的文件,其包括主机代码和设备代码两者。在至少一个实施例中,编译器3001可以是但不限于用于在.cu文件中编译cuda代码的nvidiacuda编译器(“nvcc”),或用于在.hip.cpp文件中编译hip代码的hcc编译器。
[0293]
在至少一个实施例中,编译器3001包括编译器前端3002,主机编译器3005,设备编译器3006和链接器3009。在至少一个实施例中,编译器前端3002被配置为在源代码3000中将设备代码3004与主机代码3003分开。在至少一个实施例中,设备代码3004由设备编译器3006编译成设备可执行代码3008,如所描述的,其可以包括二进制代码或ir代码。在至少一个实施例中,主机代码3003由主机编译器3005单独地编译成主机可执行代码3007。在至少一个实施例中,对于nvcc,主机编译器3005可以是但不限于输出本机目标代码的通用c/c 编译器,而设备编译器3006可以是但不限于基于低级虚拟机(“llvm”)的编译器,其将llvm编译器基础架构分叉,并输出ptx代码或二进制代码。在至少一个实施例中,对于hcc,主机编译器3005和设备编译器3006两者可以是但不限于输出目标二进制代码的基于llvm的编译器。
[0294]
在至少一个实施例中,在将源代码3000编译成主机可执行代码3007和设备可执行代码3008之后,链接器3009将主机和设备可执行代码3007和3008在可执行文件3010中链接到一起。在至少一个实施例中,主机和ptx的本机目标代码或设备的二进制代码可以在可执行和可链接格式(“elf”)文件中链接在一起,该文件是用于存储目标代码的容器格式。
[0295]
图31示出了根据至少一个实施例的在编译源代码之前转换源代码。在至少一个实施例中,源代码3100通过转换工具3101传递,转换工具3101将源代码3100转换成转换后的源代码3102。在至少一个实施例中,编译器3103用于将转换后的源代码3102编译成主机可执行代码3104和设备可执行代码3105,其过程类似于由编译器2901将源代码2900编译成主机可执行代码2902和设备可执行代码2903的过程,如以上结合图29所讨论的。
[0296]
在至少一个实施例中,由转换工具3101执行的转换被用于移植(port)源代码3100,以在与最初打算在其上运行的不同的环境中执行。在至少一个实施例中,转换工具3101可以包括但不限于hip转换器,其用于将用于cuda平台的cuda代码“移植(hipify)”为可以在rocm平台上编译和执行的hip代码。在至少一个实施例中,源代码3100的转换可以包括:解析源代码3100,并将对由一个编程模型(例如,cuda)提供的api的调用转换为对由另
3202可以包括但不限于在主机上执行的任意数量的函数,用于分配和解除分配设备存储器,在主机存储器和设备存储器之间传输数据,管理具有多个设备的系统等。在至少一个实施例中,cuda源代码3210还可以包括对在任意数量的其他cuda api中指定的任意数量的函数的任意数量的调用。在至少一个实施例中,cuda api可以是被设计为由cuda代码使用的任何api。在至少一个实施例中,cuda api包括但不限于cuda运行时api 3202,cuda驱动器api,用于任意数量的cuda库的api等。在至少一个实施例中并且相对于cuda运行时api 3202,cuda驱动器api是较低级别的api,但可以提供对设备的更细粒度的控制。在至少一个实施例中,cuda库的示例包括但不限于cublas,cufft,curand,cudnn等。
[0304]
在至少一个实施例中,cuda编译器3250编译输入的cuda代码(例如,cuda源代码3210)以生成主机可执行代码3270(1)和cuda设备可执行代码3284。在至少一个实施例中,cuda编译器3250是nvcc。在至少一个实施例中,主机可执行代码3270(1)是在cpu3290上可执行的输入源代码中包括的主机代码的编译版本。在至少一个实施例中,cpu 3290可以是针对顺序指令处理而优化的任何处理器。
[0305]
在至少一个实施例中,cuda设备可执行代码3284是在启用cuda的gpu 3294上可执行的输入源代码中包括的设备代码的编译版本。在至少一个实施例中,cuda设备可执行代码3284包括但不限于二进制代码。在至少一个实施例中,cuda设备可执行代码3284包括但不限于ir代码,例如ptx代码,该ir代码在运行时被设备驱动器进一步编译为用于特定目标设备(例如,启用cuda的gpu 3294)的二进制代码。在至少一个实施例中,启用cuda的gpu 3294可以是针对并行指令处理而优化并且支持cuda的任何处理器。在至少一个实施例中,启用cuda的gpu 3294由加利福尼亚州圣克拉拉市的nvidia公司开发。
[0306]
在至少一个实施例中,cuda到hip转换工具3220被配置为将cuda源代码3210转换成功能上相似的hip源代码3230。在至少一个实施例中,hip源代码3230是hip编程语言的人类可读代码的集合。在至少一个实施例中,hip代码是hip编程语言的人类可读代码。在至少一个实施例中,hip编程语言是c 编程语言的扩展,其包括但不限于cuda机制的功能上相似的版本,用于定义设备代码并区分设备代码和主机代码。在至少一个实施例中,hip编程语言可以包括cuda编程语言的功能的子集。在至少一个实施例中,例如,hip编程语言包括但不限于定义全局函数3212的机制,但是这样的hip编程语言可能缺乏对动态并行性的支持,因此,在hip代码中定义的全局函数3212仅可从主机调用。
[0307]
在至少一个实施例中,hip源代码3230包括但不限于任意数量(包括零)的全局函数3212,任意数量(包括零)的设备函数3214,任意数量(包括零)的主机函数3216以及任意数量(包括零)的主机/设备函数3218。在至少一个实施例中,hip源代码3230还可以包括对在hip运行时api 3232中指定的任意数量的函数的任意数量的调用。在一个实施例中,hip运行时api 3232包括但不限于cuda运行时api 3202中包括的函数的子集的功能上相似的版本。在至少一个实施例中,hip源代码3230还可以包括对在任意数量的其他hip api中指定的任意数量的函数的任意数量的调用。在至少一个实施例中,hip api可以是被设计为供hip代码和/或rocm使用的任何api。在至少一个实施例中,hip api包括但不限于hip运行时api 3232,hip驱动器api,用于任意数量的hip库的api,用于任意数量的rocm库的api等。
[0308]
在至少一个实施例中,cuda到hip转换工具3220将cuda代码中的每个内核调用从cuda语法转换为hip语法,并将cuda代码中的任意数量的其他cuda调用转换为任意数量的
其他功能上相似的hip调用。在至少一个实施例中,cuda调用是对在cuda api中指定的函数的调用,并且hip调用是对在hip api中指定的函数的调用。在至少一个实施例中,cuda到hip转换工具3220将对在cuda运行时api 3202中指定的函数的任意数量的调用转换为对在hip运行时api 3232中指定的函数的任意数量的调用。
[0309]
在至少一个实施例中,cuda到hip转换工具3220是被称为hipify-perl的工具,其执行基于文本的转换过程。在至少一个实施例中,cuda到hip转换工具3220是被称为hipify-clang的工具,相对于hipify-perl,其执行更复杂且更鲁棒的转换过程,该过程涉及使用clang(编译器前端)解析cuda代码,然后转换得到的符号。在至少一个实施例中,除了由cuda到hip转换工具3220执行的那些修改之外,将cuda代码正确地转换成hip代码可能还需要修改(例如,手动编辑)。
[0310]
在至少一个实施例中,hip编译器驱动器3240是确定目标设备3246,然后配置与目标设备3246兼容的编译器以编译hip源代码3230的前端。在至少一个实施例中,目标设备3246是针对并行指令处理而优化的处理器。在至少一个实施例中,hip编译器驱动器3240可以以任何技术上可行的方式确定目标设备3246。
[0311]
在至少一个实施例中,如果目标设备3246与cuda兼容(例如,启用cuda的gpu 3294),则hip编译器驱动器3240生成hip/nvcc编译命令3242。在至少一个实施例中并且结合图32b更详细地描述的,hip/nvcc编译命令3242配置cuda编译器3250以使用但不限于hip到cuda转换头和cuda运行时库来编译hip源代码3230。在至少一个实施例中并且响应于hip/nvcc编译命令3242,cuda编译器3250生成主机可执行代码3270(1)和cuda设备可执行代码3284。
[0312]
在至少一个实施例中,如果目标设备3246与cuda不兼容,则hip编译器驱动器3240生成hip/hcc编译命令3244。在至少一个实施例中并且如结合图32c更详细地描述的,hip/hcc编译命令3244配置hcc 3260以使用hcc头和hip/hcc运行时库编译hip源代码3230。在至少一个实施例中并且响应于hip/hcc编译命令3244,hcc 3260生成主机可执行代码3270(2)和hcc设备可执行代码3282。在至少一个实施例中,hcc设备可执行代码3282是hip源代码3230中包含的可在gpu 3292上执行的设备代码的编译版本。在至少一个实施例中,gpu 3292可以是针对并行指令处理而优化的、与cuda不兼容且与hcc兼容的任何处理器。在至少一个实施例中,gpu 3292由加利福尼亚州圣克拉拉市的amd公司开发。在至少一个实施例中,gpu 3292是不启用cuda的gpu 3292。
[0313]
仅出于说明性目的,在图32a中描绘了在至少一个实施例中可以实现为编译cuda源代码3210以在cpu 3290和不同设备上执行的三个不同流程。在至少一个实施例中,直接cuda流程编译cuda源代码3210以在cpu 3290和启用cuda的gpu 3294上执行,而无需将cuda源代码3210转换为hip源代码3230。在至少一个实施例中,间接cuda流程将cuda源代码3210转换为hip源代码3230,然后编译hip源代码3230以在cpu 3290和启用cuda的gpu 3294上执行。在至少一个实施例中,cuda/hcc流程将cuda源代码3210转换为hip源代码3230,然后编译hip源代码3230以在cpu 3290和gpu 3292上执行。
[0314]
可以通过虚线和一系列气泡注释a1-a3描绘可以在至少一个实施例中实现的直接cuda流程。在至少一个实施例中,并且如气泡注释a1所示,cuda编译器3250接收cuda源代码3210和配置cuda编译器3250以编译cuda源代码3210的cuda编译命令3248。在至少一个实施
例中,直接cuda流程中使用的cuda源代码3210是用cuda编程语言编写的,该cuda编程语言基于除c 之外的其他编程语言(例如c,fortran,python,java等)。在至少一个实施例中,并且响应于cuda编译命令3248,cuda编译器3250生成主机可执行代码3270(1)和cuda设备可执行代码3284(用气泡注释a2表示)。在至少一个实施例中并且如用气泡注释a3所示,主机可执行代码3270(1)和cuda设备可执行代码3284可以分别在cpu 3290和启用cuda的gpu 3294上执行。在至少一个实施例中,cuda设备可执行代码3284包括但不限于二进制代码。在至少一个实施例中,cuda设备可执行代码3284包括但不限于ptx代码,并且在运行时被进一步编译成用于特定目标设备的二进制代码。
[0315]
可以通过虚线和一系列气泡注释b1-b6来描述可以在至少一个实施例中实现的间接cuda流程。在至少一个实施例中并且如气泡注释b1所示,cuda到hip转换工具3220接收cuda源代码3210。在至少一个实施例中并且如气泡注释b2所示,cuda到hip转换工具3220将cuda源代码3210转换为hip源代码3230。在至少一个实施例中并如气泡注释b3所示,hip编译器驱动器3240接收hip源代码3230,并确定目标设备3246是否启用了cuda。
[0316]
在至少一个实施例中并且如气泡注释b4所示,hip编译器驱动器3240生成hip/nvcc编译命令3242,并将hip/nvcc编译命令3242和hip源代码3230两者都发送到cuda编译器3250。在至少一个实施例中并且如结合图32b更详细地描述的,hip/nvcc编译命令3242配置cuda编译器3250以使用但不限于hip到cuda转换头和cuda运行时库来编译hip源代码3230。在至少一个实施例中并且响应于hip/nvcc编译命令3242,cuda编译器3250生成主机可执行代码3270(1)和cuda设备可执行代码3284(用气泡注释b5表示)。在至少一个实施例中并且如气泡注释b6所示,主机可执行代码3270(1)和cuda设备可执行代码3284可以分别在cpu 3290和启用cuda的gpu 3294上执行。在至少一个实施例中,cuda设备可执行代码3284包括但不限于二进制代码。在至少一个实施例中,cuda设备可执行代码3284包括但不限于ptx代码,并且在运行时被进一步编译成用于特定目标设备的二进制代码。
[0317]
可以通过实线和一系列气泡注释c1-c6来描述可以在至少一个实施例中实现的cuda/hcc流程。在至少一个实施例中并且如气泡注释c1所示,cuda到hip转换工具3220接收cuda源代码3210。在至少一个实施例中并且如气泡注释c2所示,cuda到hip转换工具3220将cuda源代码3210转换为hip源代码3230。在至少一个实施例中并且如气泡注释c3所示,hip编译器驱动器3240接收hip源代码3230,并确定目标设备3246未启用cuda。
[0318]
在至少一个实施例中,hip编译器驱动器3240生成hip/hcc编译命令3244,并且将hip/hcc编译命令3264和hip源代码3230两者发送到hcc 3260(用气泡注释c4表示)。在至少一个实施例中并且如结合图32c更详细地描述的,hip/hcc编译命令3264配置hcc3260以使用但不限于hcc头和hip/hcc运行时库编译hip源代码3230。在至少一个实施例中并且响应于hip/hcc编译命令3244,hcc 3260生成主机可执行代码3270(2)和hcc设备可执行代码3282(用气泡注释c5表示)。在至少一个实施例中并且如气泡注释c6所示,主机可执行代码3270(2)和hcc设备可执行代码3282可以分别在cpu 3290和gpu 3292上执行。
[0319]
在至少一个实施例中,在将cuda源代码3210转换为hip源代码3230之后,hip编译器驱动器3240可随后用于生成用于启用cuda的gpu 3294或gpu 3292的可执行代码,而无需将cuda重新执行为hip转换工具3220。在至少一个实施例中,cuda到hip转换工具3220将cuda源代码3210转换为hip源代码3230,然后将其存储在存储器中。在至少一个实施例中,
hip编译器驱动器3240然后配置hcc 3260以基于hip源代码3230生成主机可执行代码3270(2)和hcc设备可执行代码3282。在至少一个实施例中,hip编译器驱动器3240随后配置cuda编译器3250以基于存储的hip源代码3230生成主机可执行代码3270(1)和cuda设备可执行代码3284。
[0320]
图32b示出了根据至少一个实施例的被配置为使用cpu 3290和启用cuda的gpu 3294来编译和执行图32a的cuda源代码3210的系统3204。在至少一个实施例中,系统3204包括但不限于cuda源代码3210,cuda到hip转换工具3220,hip源代码3230,hip编译器驱动器3240,cuda编译器3250,主机可执行代码3270(1),cuda设备可执行代码3284,cpu 3290和启用cuda的gpu 3294。
[0321]
在至少一个实施例中并且如本文先前结合图32a所描述的,cuda源代码3210包括但不限于任意数量(包括零)的全局函数3212,任意数量(包括零)的设备函数3214,任意数量(包括零)的主机函数3216以及任意数量(包括零)的主机/设备函数3218。在至少一个实施例中,cuda源代码3210还包括但不限于对在任意数量的cuda api中指定的任意数量的函数的任意数量的调用。
[0322]
在至少一个实施例中,cuda到hip转换工具3220将cuda源代码3210转换成hip源代码3230。在至少一个实施例中,cuda到hip转换工具3220将cuda源代码3210中的每个内核调用从cuda语法转换为hip语法,并将cuda源代码3210中任意数量的其他cuda调用转换为任意数量的其他功能上相似的hip调用。
[0323]
在至少一个实施例中,hip编译器驱动器3240确定目标设备3246是启用cuda的,并且生成hip/nvcc编译命令3242。在至少一个实施例中,然后hip编译器驱动器3240经由hip/nvcc编译命令3242配置cuda编译器3250以编译hip源代码3230。在至少一个实施例中,作为配置cuda编译器3250的一部分,hip编译器驱动器3240提供对hip到cuda转换头3252的访问。在至少一个实施例中,hip到cuda转换头3252将任意数量的hipapi中指定的任意数量的机制(例如,函数)转换为任意数量的cuda api中指定的任意数量的机制。在至少一个实施例中,cuda编译器3250将hip到cuda转换头3252与对应于cuda运行时api 3202的cuda运行时库3254结合使用,以生成主机可执行代码3270(1)和cuda设备可执行代码3284。在至少一个实施例中,然后可以分别在cpu 3290和启用cuda的gpu 3294上执行主机可执行代码3270(1)和cuda设备可执行代码3284。在至少一个实施例中,cuda设备可执行代码3284包括但不限于二进制代码。在至少一个实施例中,cuda设备可执行代码3284包括但不限于ptx代码,并且在运行时被进一步编译成用于特定目标设备的二进制代码。
[0324]
图32c示出了根据至少一个实施例的系统3206,该系统3206被配置为使用cpu 3290和未启用cuda的gpu 3292来编译和执行图32a的cuda源代码3210。在至少一个实施例中,系统3206包括但不限于cuda源代码3210,cuda到hip转换工具3220,hip源代码3230,hip编译器驱动器3240,hcc 3260,主机可执行代码3270(2),hcc设备可执行代码3282,cpu 3290和gpu 3292。
[0325]
在至少一个实施例中,并且如本文先前结合图32a所描述的,cuda源代码3210包括但不限于任意数量(包括零)的全局函数3212,任意数量(包括零)的设备函数3214,任意数量(包括零)的主机函数3216以及任意数量(包括零)的主机/设备函数3218。在至少一个实施例中,cuda源代码3210还包括但不限于对在任意数量的cuda api中指定的任意数量的函
数的任意数量的调用。
[0326]
在至少一个实施例中,cuda到hip转换工具3220将cuda源代码3210转换成hip源代码3230。在至少一个实施例中,cuda到hip转换工具3220将cuda源代码3210中的每个内核调用从cuda语法转换为hip语法,并将源代码3210中任意数量的其他cuda调用转换为任意数量的其他功能上相似的hip调用。
[0327]
在至少一个实施例中,hip编译器驱动器3240随后确定目标设备3246不是启用cuda的,并生成hip/hcc编译命令3244。在至少一个实施例中,然后hip编译器驱动器3240配置hcc 3260以执行hip/hcc编译命令3244,从而编译hip源代码3230。在至少一个实施例中,hip/hcc编译命令3244将hcc 3260配置为使用但不限于hip/hcc运行时库3258和hcc头3256来生成主机可执行代码3270(2)和hcc设备可执行代码3282。在至少一个实施例中,hip/hcc运行时库3258对应于hip运行时api 3232。在至少一个实施例中,hcc头3256包括但不限于用于hip和hcc的任意数量和类型的互操作性机制。在至少一个实施例中,主机可执行代码3270(2)和hcc设备可执行代码3282可以分别在cpu3290和gpu3292上执行。
[0328]
图33示出了根据至少一个实施例的由图32c的cuda到hip转换工具3220转换的示例性内核。在至少一个实施例中,cuda源代码3210将给定内核被设计为解决的总体问题划分为可以使用线程块独立解决的相对粗糙的子问题。在至少一个实施例中,每个线程块包括但不限于任意数量的线程。在至少一个实施例中,每个子问题被划分为相对细小的部分(pieces),这些部分可以由线程块中的线程协作并行地解决。在至少一个实施例中,线程块内的线程可以通过共享存储器共享数据并通过同步执行以协调存储器访问来协作。
[0329]
在至少一个实施例中,cuda源代码3210将与给定内核相关联的线程块组织成线程块的一维、二维或三维网格。在至少一个实施例中,每个线程块包括但不限于任意数量的线程,并且网格包括但不限于任意数量的线程块。
[0330]
在至少一个实施例中,内核是使用“__global__”声明说明符(specifier)定义的设备代码中的函数。在至少一个实施例中,使用cuda内核启动语法3310来指定针对给定内核调用执行内核的网格的尺寸以及相关联的流。在至少一个实施例中,cuda内核启动语法3310被指定为“kernelname《《《gridsize,blocksize,sharedmemorysize,stream》》》(kernelarguments);”。在至少一个实施例中,执行配置语法是“《《《...》》》”构造,其被插入在内核名称(“kernelname”)和内核参数的括号列表(“kernelarguments”)之间。在至少一个实施例中,cuda内核启动语法3310包括但不限于cuda启动函数语法而不是执行配置语法。
[0331]
在至少一个实施例中,“gridsize”是dim3类型的,并且指定网格的尺寸和大小。在至少一个实施例中,类型dim3是cuda定义的结构,其包括但不限于无符号整数x,y和z。在至少一个实施例中,如果未指定z,则z默认为1。在至少一个实施例中,如果未指定y,则y默认为1。在至少一个实施例中,网格中的线程块的数量等于gridsize.x、gridsize.y和gridsize.z的乘积。在至少一个实施例中,“blocksize”是dim3类型的,并且指定每个线程块的尺寸和大小。在至少一个实施例中,每线程块的线程数等于blocksize.x、blocksize.y和blocksize.z的乘积。在至少一个实施例中,给定执行内核的每个线程唯一的线程id,该线程id可通过内置变量(例如“threadidx”)在内核内访问。
[0332]
在至少一个实施例中,关于cuda内核启动语法3310,“sharedmemorysize”是一可
选参数,它指定共享存储器中除静态分配的存储器外,针对给定内核调用为每个线程块动态分配的字节数。在至少一个实施例中并且关于cuda内核启动语法3310,sharedmemorysize默认为零。在至少一个实施例中并且关于cuda内核启动语法3310,“流”是可选的参数,其指定相关联的流并且默认为零以指定默认流。在至少一个实施例中,流是按顺序执行的命令序列(其可能由不同的主机线程发出)。在至少一个实施例中,不同的流可以相对于彼此无序地或同时地执行命令。
[0333]
在至少一个实施例中,cuda源代码3210包括但不限于用于示例性内核“matadd”的内核定义和主函数。在至少一个实施例中,主函数是在主机上执行的主机代码,并且包括但不限于使内核matadd在设备上执行的内核调用。在至少一个实施例中,如图所示,内核matadd将大小为nxn的两个矩阵a和b相加,其中n为正整数,并将结果存储在矩阵c中。在至少一个实施例中,主函数将threadsperblock变量定义为16x16,numblocks变量为n/16xn/16。在至少一个实施例中,然后主函数指定内核调用“matadd《《《numblocks,threadsperblock》》》(a,b,c);”。在至少一个实施例中,并且根据cuda内核启动语法3310,使用尺寸为n/16
×
n/16的线程块网格来执行内核matadd,其中每个线程块的尺寸为16
×
16。在至少一个实施例中,每个线程块包括256个线程,创建具有足够块的网格以使每个矩阵元素具有一个线程,并且该网格中的每个线程执行内核matadd以执行一个逐对的加法。
[0334]
在至少一个实施例中,在将cuda源代码3210转换成hip源代码3230的同时,cuda到hip转换工具3220将cuda源代码3210中的每个内核调用从cuda内核启动语法3310转换成hip内核启动语法3320,并将源代码3210中的任意数量的其他cuda调用转换为任意数量的其他功能上相似的hip调用。在至少一个实施例中,hip内核启动语法3320被指定为“hiplaunchkernelggl(kernelname,gridsize,blocksize,sharedmemorysize,stream,kernelarguments);”。在至少一个实施例中,kernelname,gridsize,blocksize,sharememorysize,stream和kernelarguments中的每一个在hip内核启动语法3320中具有与在cuda内核启动语法3310中(本文先前描述)相同的含义。在至少一个实施例中,参数sharedmemorysize和stream在hip内核启动语法3320中是必需的,而在cuda内核启动语法3310中是可选的。
[0335]
在至少一个实施例中,除了使内核matadd在设备上执行的内核调用之外,图33中描绘的hip源代码3230的一部分与图33中描绘的cuda源代码3210的一部分相同。在至少一个实施例中,在hip源代码3230中定义内核matadd,具有与在cuda源代码3210中定义内核matadd相同的“__global__”声明说明符。在至少一个实施例中,在hip源代码3230中的内核调用是“hiplaunchkernelggl(matadd,numblocks,threadsperblock,0、0,a,b,c);”,而cuda源代码3210中的相应内核调用是“matadd《《《numblocks,threadsperblock》》》(a,b,c);”。
[0336]
图34更详细地示出了根据至少一个实施例的图32c的未启用cuda的gpu 3292。在至少一个实施例中,gpu 3292由圣塔克拉拉市的amd公司开发。在至少一个实施例中,gpu 3292可以被配置为以高度并行的方式执行计算操作。在至少一个实施例中,gpu 3292被配置为执行图形管线操作,诸如绘制命令、像素操作、几何计算以及与将图像渲染到显示器相关联的其他操作。在至少一个实施例中,gpu 3292被配置为执行与图形无关的操作。在至少一个实施例中,gpu 3292被配置为执行与图形有关的操作和与图形无关的操作两者。在至
3292实现了高速缓存子系统,该高速缓存子系统包括但不限于一个或更多个高速缓存存储器(例如,l2高速缓存3422),每个高速缓存存储器可以是私有的或在任意数量的组件(例如,simd单元3450,计算单元3440和可编程处理单元3420)之间共享。
[0342]
图35示出了根据至少一个实施例的示例性cuda网格3520的线程如何被映射到图34的不同计算单元3440。在至少一个实施例中,并且仅出于说明目的,网格3520具有bx乘以by乘以1的gridsize和tx乘以ty乘以1的blocksize。因此,在至少一个实施例中,网格3520包括但不限于(bx*by)线程块3530,每个线程块3530包括但不限于(tx*ty)线程3540。线程3540在图35中被描绘为弯曲箭头。
[0343]
在至少一个实施例中,网格3520被映射到可编程处理单元3420(1),该可编程处理单元3420(1)包括但不限于计算单元3440(1)-3440(c)。在至少一个实施例中并且如图所示,将(bj*by)线程块3530映射到计算单元3440(1),并且将其余线程块3530映射到计算单元3440(2)。在至少一个实施例中,每个线程块3530可以包括但不限于任意数量的线程束,并且每个线程束被映射到图34的不同的simd单元3450。
[0344]
在至少一个实施例中,给定线程块3530中的线程束可以一起同步并通过关联的计算单元3440中包括的共享存储器3460进行通信。例如并且在至少一个实施例中,线程块3530(bj,1)中的线程束可以一起同步并通过共享存储器3460(1)进行通信。例如并且在至少一个实施例中,线程块3530(bj 1,1)中的线程束可以一起同步并通过共享存储器3460(2)进行通信。
[0345]
图36示出了根据至少一个实施例的如何将现有cuda代码迁移到数据并行c 代码。数据并行c (dpc )可能指的是一种开放的、基于标准的单一体系结构专有语言的替代方案,它允许开发人员跨硬件目标(cpu和加速器,诸如gpu和fpga)重用代码,还可以为特定加速器执行自定义调整。dpc 根据开发人员可能熟悉的isoc 使用相似和/或相同的c和c 结构。dpc 结合了来自khronos集团的标准sycl,以支持数据并行和异构编程。sycl指的是一个跨平台抽象层,它建立在opencl的底层概念、可移植性和效率的基础上,使异构处理器的代码能够使用标准c 以“单源”风格编写。sycl可以实现单一源代码开发,其中c 模板函数可以包含主机和设备代码,以构造使用opencl加速的复杂算法,然后在不同类型数据的源代码中重复使用它们。
[0346]
在至少一个实施例中,dpc 编译器用于编译可以跨不同硬件目标部署的dpc 源代码。在至少一个实施例中,dpc 编译器用于生成可以跨不同硬件目标部署的dpc 应用程序,并且dpc 兼容性工具可用于将cuda应用程序迁移到dpc 中的多平台程序。在至少一个实施例中,dpc 基础工具包包括dpc 编译器,用于跨不同硬件目标部署应用程序;dpc 库,用于提高cpu、gpu和fpga的生产力和性能;dpc 兼容工具,用于将cuda应用程序迁移到多平台应用程序;及其任何适当组合。
[0347]
在至少一个实施例中,dpc 编程模型通过使用现代c 特性来简单地用于与编程cpu和加速器相关的一个或更多个方面,以使用一种称为数据并行c 的编程语言来表达并行性。dpc 编程语言可用于使用单一源语言对主机(例如,cpu)和加速器(例如,gpu或fpga)进行代码重用,并清楚地传达执行和存储器依赖关系。dpc 代码中的映射可用于将应用程序转换为在最能加速工作负载的硬件或一组硬件设备上运行。即使在没有可用加速器的平台上,也可以使用主机来简化设备代码的开发和调试。
[0348]
在至少一个实施例中,提供cuda源代码3600作为dpc 兼容性工具3602的输入,以生成人类可读的dpc 3604。在至少一个实施例中,人类可读的dpc 3604包括由dpc 兼容性工具3602生成的内嵌注释,其指导开发人员如何和/或在何处修改dpc 代码以完成编码和调优到期望的性能3606,从而生成dpc 源代码3608。
[0349]
在至少一个实施例中,cuda源代码3600是或包括cuda编程语言中的人类可读源代码的集合。在至少一个实施例中,cuda源代码3600是cuda编程语言中的人类可读源代码。在至少一个实施例中,cuda编程语言是c 编程语言的扩展,包括但不限于定义设备代码和区分设备代码和主机代码的机制。在至少一个实施例中,设备代码是在编译之后可在设备(例如,gpu或fpga)上可执行的源代码,并且可以包括一个或更多个可在设备的一个或更多个处理器核上执行的并行工作流。在至少一个实施例中,设备可以是针对并行指令处理进行优化的处理器,诸如支持cuda的gpu、gpu或另一gpgpu等。在至少一个实施例中,主机代码是编译后可在主机上执行的源代码。在至少一个实施例中,可以跨cpu和gpu/fpga并行执行部分或全部主机代码和设备代码。在至少一个实施例中,主机是针对顺序指令处理进行优化的处理器,诸如cpu。结合图36描述的cuda源代码3600可以与本文其他地方讨论的源代码一致。
[0350]
在至少一个实施例中,dpc 兼容性工具3602是指可执行工具、程序、应用程序或任何其他合适类型的工具,其用于促进cuda源代码3600到dpc 源代码3608的迁移。至少在在一个实施例中,dpc 兼容性工具3602是基于命令行的代码迁移工具,可作为dpc 工具包的一部分,用于将现有cuda源移植到dpc 。在至少一个实施例中,dpc 兼容性工具3602将cuda应用程序的部分或全部源代码从cuda转换为dpc ,并生成至少部分用dpc 编写的结果文件,称为人类可读的dpc 3604。在至少一个实施例中,人类可读的dpc 3604包括由dpc 兼容性工具3602生成的注释,以指示可能需要用户干预的地方。在至少一个实施例中,当cuda源代码3600调用没有类似dpc api的cudaapi时,需要用户干预;稍后将更详细地讨论需要用户干预的其他示例。
[0351]
在至少一个实施例中,用于迁移cuda源代码3600(例如,应用程序或其一部分)的工作流包括创建一个或更多个编译数据库文件;使用dpc 兼容性工具3602将cuda迁移到dpc ;完成迁移并验证正确性,从而生成dpc 源代码3608;以及使用dpc 编译器编译dpc 源代码3608,生成dpc 应用程序。在至少一个实施例中,一种兼容性工具提供了一种实用程序,该实用程序拦截在makefile执行时使用的命令,并将其存储在编译数据库文件中。在至少一个实施例中,文件以json格式存储。在至少一个实施例中,拦截构建(intercept-build)命令将makefile命令转换为dpc兼容性命令。
[0352]
在至少一个实施例中,拦截构建是一种实用程序脚本,它拦截构建过程以捕获编译选项、宏定义和包含路径,并将该数据写入编译数据库文件。在至少一个实施例中,编译数据库文件是json文件。在至少一个实施例中,dpc 兼容性工具3602解析编译数据库并在迁移输入源时应用选项。在至少一个实施例中,拦截构建的使用是可选的,但强烈建议用于基于make或cmake的环境。在至少一个实施例中,迁移数据库包括命令、目录和文件:命令可以包括必要的编译标志;目录可能包括头文件的路径;文件可能包括cuda文件的路径。
[0353]
在至少一个实施例中,dpc 兼容性工具3602通过尽可能生成dpc 来将用cuda编写的cuda代码(例如,应用程序)迁移到dpc 。在至少一个实施例中,dpc 兼容性工具3602
可用作工具包的一部分。在至少一个实施例中,dpc 工具包包括拦截构建工具。在至少一个实施例中,拦截构建工具创建编译数据库,该编译数据库捕获编译命令以迁移cuda文件。在至少一个实施例中,dpc 兼容性工具3602使用由拦截构建工具生成的编译数据库将cuda代码迁移到dpc 。在至少一个实施例中,非cudac 代码和文件按原样迁移。在至少一个实施例中,dpc 兼容性工具3602生成人类可读的dpc 3604,其可以是dpc 代码,如由dpc 兼容性工具3602生成的,不能由dpc 编译器编译,并且需要额外的管道来验证未正确迁移的代码部分,并且可能涉及手动干预,诸如由开发人员进行的干预。在至少一个实施例中,dpc 兼容性工具3602提供嵌入在代码中的提示或工具,以帮助开发人员手动迁移无法自动迁移的附加代码。在至少一个实施例中,迁移是源文件、项目或应用程序的一次性活动。
[0354]
在至少一个实施例中,dpc 兼容性工具3602能够成功地将cuda代码的所有部分迁移到dpc ,并且可能存在一个可选步骤,用于手动验证和调整所生成的dpc 源代码的性能。在至少一个实施例中,dpc 兼容性工具3602直接生成由dpc 编译器编译的dpc 源代码3608,而不需要或利用人工干预来修改由dpc 兼容性工具3602生成的dpc 代码。在至少一个实施例中,dpc 兼容性工具生成可编译的dpc 代码,开发人员可以根据性能、可读性、可维护性和其他各种考虑因素进行选择性调优;或其任何组合。
[0355]
在至少一个实施例中,至少部分地使用dpc 兼容性工具3602将一个或更多个cuda源文件迁移到dpc 源文件。在至少一个实施例中,cuda源代码包括一个或更多个头文件,该头文件可以包括cuda头文件。在至少一个实施例中,cuda源文件包括《cuda.h》头文件和可用于打印文本的《stdio.h》头文件。在至少一个实施例中,向量加法核心cuda源文件的一部分可以写成或相关于:
[0356]
[0357][0358]
在至少一个实施例中并结合上述cuda源文件,dpc 兼容性工具3602解析cuda源代码,并用适当的dpc 和sycl头文件替换头文件。在至少一个实施例中,dpc 头文件包括助手声明。在cuda中,有一个线程id的概念,相应地,在dpc 或sycl中,每个元素都有一个本地标识符。
[0359]
在至少一个实施例中并结合上述cuda源文件,有两个向量a和b被初始化,并且向量相加结果作为vectoraddkernel()的一部分放入向量c中。在至少一个实施例中,作为将cuda代码迁移到dpc 代码的一部分,dpc 兼容性工具3602通过本地id将用于索引工作元素的cuda线程id转换为工作元素的sycl标准寻址。在至少一个实施例中,可以优化由dpc 兼容性工具3602生成的dpc 代码,例如,通过减少nd_项的维度,从而增加存储器和/或处理器利用率。
[0360]
在至少一个实施例中并结合上述cuda源文件,迁移存储器分配。在至少一个实施例中,cudamalloc()被迁移到统一的共享存储器sycl调用malloc_device(),设备和上下文被传递到该调用,依赖于诸如平台、设备、上下文和队列的sycl概念。在至少一个实施例中,sycl平台可以具有多个设备(例如,主机和gpu设备);一个设备可具有多个队列,作业可以提交到这些队列;每个设备可以具有上下文;并且一个上下文可能有多个设备并管理共享存储器对象。
[0361]
在至少一个实施例中并结合上述cuda源文件,main()函数调用或调用vectoraddkernel(),以将两个向量a和b加在一起,并将结果存储在向量c中。在至少一个实施例中,调用vectoraddkernel()的cuda代码被dpc 代码替换,以将核心提交到命令队列以供执行。在至少一个实施例中,命令组处理程序cgh传递提交给队列的数据、同步和计算,parallel_for被调用用于调用vectoraddkernel()的该工作组中的多个全局元素和多个工作项。
[0362]
在至少一个实施例中并结合上述cuda源文件,复制设备存储器的cuda调用,然后将向量a、b和c的空闲存储器迁移到相应的dpc 调用。在至少一个实施例中,c 代码(例如,用于打印浮点变量向量的标准isoc 代码)按原样迁移,而不被dpc 兼容性工具3602修改。在至少一个实施例中,dpc 兼容性工具3602修改cuda用于存储器设置和/或主机调用以在加速设备上执行核心的api。在至少一个实施例中并结合上述cuda源文件,相应的人类可读dpc 3604(例如,可以编译)被写入或与之相关:
[0363]
[0364]
[0365][0366]
在至少一个实施例中,人类可读的dpc 3604是指由dpc 兼容性工具3602生成的输出,并且可以以一种或另一种方式进行优化。在至少一个实施例中,由dpc 兼容性工具3602生成的人类可读dpc 3604可以在迁移之后由开发人员手动编辑,以使其更易于维护、性能或其他考虑因素。在至少一个实施例中,由dpc 兼容性工具3602生成的dpc 代码(诸如所公开的dpc )可以通过移除对每个malloc_device()调用的get_current_device()和/或get_default_context()的重复调用来优化。在至少一个实施例中,上面生成的dpc 代码使用三维nd_范围,该范围可以重构为仅使用单个维度,从而减少存储器使用量。在至少一个实施例中,开发人员可以手动编辑由dpc 兼容性工具生成的dpc 代码3602使用访问器替换统一共享存储器的使用。在至少一个实施例中,dpc 兼容性工具3602具有改变其将cuda代码迁移到dpc 代码的方式的选项。在至少一个实施例中,dpc 兼容性工具3602是冗长的,因为它使用通用模板将cuda代码迁移到适用于大量情况的dpc 代码。
[0367]
在至少一个实施例中,cuda到dpc 迁移工作流包括以下步骤:使用拦截构建脚本准备迁移;使用dpc 兼容性工具3602将cuda项目迁移到dpc ;手动检查和编辑迁移的源文件,以确保其完整性和正确性;并编译最终的dpc 代码以生成dpc 应用程序。在至少一
个实施例中,在一种或更多种情况下可能需要对dpc 源代码进行人工审查,包括但不限于:迁移的api不返回错误代码(cuda代码可以返回错误代码,然后应用程序可以使用该代码,但sycl使用异常来报告错误,因此不使用错误代码来显示错误);dpc 不支持cuda计算能力依赖逻辑;无法删除声明。在至少一个实施例中,dpc 代码需要人工干预的场景可以包括但不限于:错误代码逻辑替换为(*,0)代码或注释掉;等效的dpc api不可用;cuda计算能力依赖逻辑;硬件相关api(clock());缺少不支持api的功能;执行时间测量逻辑;处理内置向量类型冲突;cublas api的迁移;还有更多。
[0368]
在至少一个实施例中,本文描述的一种或更多种技术利用oneapi编程模型。在至少一个实施例中,oneapi编程模型是指用于与各种计算加速器架构交互的编程模型。在至少一个实施例中,oneapi是指设计用于与各种计算加速器架构交互的应用程序编程接口(api)。在至少一个实施例中,oneapi编程模型利用dpc 编程语言。在至少一个实施例中,dpc 编程语言是指用于数据并行编程生产力的高级语言。在至少一个实施例中,dpc 编程语言至少部分地基于c和/或c 编程语言。在至少一个实施例中,oneapi编程模型是诸如由加利福尼亚州圣克拉拉的英特尔公司开发的那些编程模型。
[0369]
在至少一个实施例中,oneapi和/或oneapi编程模型用于与各种加速器、gpu、处理器和/或其变体、架构交互。在至少一个实施例中,oneapi包括一组实现各种功能的库。在至少一个实施例中,oneapi至少包括oneapi dpc 库、oneapi数学核心库、oneapi数据分析库、oneapi深度神经网络库、oneapi集体通信库、oneapi线程构建块库、oneapi视频处理库和/或其变体。
[0370]
在至少一个实施例中,oneapi dpc 库(也称为onedpl)是实现算法和函数以加速dpc 核心编程的库。在至少一个实施例中,onedpl实现一个或更多个标准模板库(stl)函数。在至少一个实施例中,onedpl实现一个或更多个并行stl功能。在至少一个实施例中,onedpl提供一组库类和函数,例如并行算法、迭代器、函数对象类、基于范围的api和/或其变体。在至少一个实施例中,onedpl实现了c 标准库的一个或更多个类和/或函数。在至少一个实施例中,onedpl实现一个或更多个随机数生成器功能。
[0371]
在至少一个实施例中,oneapi数学核心库(也称为onemkl)是实现各种数学函数和/或操作的各种优化和并行例程的库。在至少一个实施例中,onemkl实现一个或更多个基本线性代数子程序(blas)和/或线性代数包(lapack)密集线性代数例程。在至少一个实施例中,onemkl实现一个或更多个稀疏blas线性代数例程。在至少一个实施例中,onemkl实现一个或更多个随机数生成器(rng)。在至少一个实施例中,onemkl实现了一个或更多个向量数学(vm)例程,用于对向量进行数学运算。在至少一个实施例中,onemkl实现一个或更多个快速傅立叶变换(fft)函数。
[0372]
在至少一个实施例中,oneapi数据分析库(也称为onedal)是实现各种数据分析应用程序和分布式计算的库。在至少一个实施例中,onedal以批处理、在线和分布式计算处理模式实现用于数据分析的预处理、转换、分析、建模、验证和决策制定的各种算法。在至少一个实施例中,onedal实现了各种c 和/或javaapi以及到一个或更多个数据源的各种连接器。在至少一个实施例中,onedal实现了对传统c 接口的dpc api扩展,并使gpu能够用于各种算法。
[0373]
在至少一个实施例中,oneapi深度神经网络库(也称为onednn)是实现各种深度学
习功能的库。在至少一个实施例中,onednn实现各种神经网络、机器学习和深度学习功能、算法和/或其变体。
[0374]
在至少一个实施例中,oneapi集体通信库(也称为oneccl)是实现用于深度学习和机器学习工作负载的各种应用程序的库。在至少一个实施例中,oneccl构建在较低级别的通信中间件上,诸如消息传递接口(mpi)和libfabrics。在至少一个实施例中,oneccl启用一组深度学习特定优化,诸如优先级、持久操作、无序执行和/或其变体。在至少一个实施例中,oneccl实现各种cpu和gpu功能。
[0375]
在至少一个实施例中,oneapi线程构建块库(也称为onebb)是为各种应用实现各种并行过程的库。在至少一个实施例中,onetbb用于主机上基于任务的共享并行编程。在至少一个实施例中,onetbb实现通用并行算法。在至少一个实施例中,onetbb实现并发容器。在至少一个实施例中,onetbb实现可扩展存储器分配器。在至少一个实施例中,onetbb实现了窃取工作的任务调度器。在至少一个实施例中,onetbb实现低级同步原语。在至少一个实施例中,onetbb独立于编译器并且可用于各种处理器,诸如gpu、ppu、cpu和/或其变体。
[0376]
在至少一个实施例中,oneapi视频处理库(也称为onevpl)是用于在一个或更多个应用中加速视频处理的库。在至少一个实施例中,onevpl实现各种视频解码、编码和处理功能。在至少一个实施例中,onevpl为cpu、gpu和其他加速器上的媒体管道实现各种功能。在至少一个实施例中,onevpl在以媒体为中心和视频分析工作负载中实现设备发现和选择。在至少一个实施例中,onevpl实现了用于零拷贝缓冲区共享的api原语。
[0377]
在至少一个实施例中,oneapi编程模型利用dpc 编程语言。在至少一个实施例中,dpc 编程语言是一种编程语言,其包括但不限于功能相似的cuda机制版本,用于定义设备代码并区分设备代码和主机代码。在至少一个实施例中,dpc 编程语言可以包括cuda编程语言的功能子集。在至少一个实施例中,使用dpc 编程语言而使用oneapi编程模型来执行一个或更多个cuda编程模型操作。
[0378]
应当注意,虽然本文描述的示例实施例可涉及cuda编程模型,但是本文描述的技术可以与任何合适的编程模型一起使用,例如hip、oneapi(例如,使用基于oneapi的编程来执行或实现本文公开的方法)和/或其变体。
[0379]
在至少一个实施例中,上述系统和/或处理器的一个或更多个组件可以与一个或更多个cpu、asic、gpu、fpga或其他硬件、电路或集成电路组件通信,这些硬件、电路或集成电路组件包括,例如,用于提高图像比例的增倍器或增采样器,用于将图像混合、混合或相加在一起的图像混合器或图像混合器组件,用于对图像进行采样(例如,作为dsp的一部分)的采样器、被配置为执行放大程序以放大图像(例如,从低分辨率图像到高分辨率图像)的神经网络电路、或用于修改或生成图像、帧或视频以调整其分辨率、大小或像素的其他硬件;上述公开的系统和/或处理器的一个或更多个组件可以使用本公开中描述的组件来执行生成或修改图像的方法、操作或指令。
[0380]
可以鉴于以下条款来描述本公开的至少一个实施例:
[0381]
条款集一
[0382]
1.一种处理器,包括:
[0383]
一个或更多个电路,用于执行操作以指示一个或更多个数据矩阵内的一个或更多个非零值。
[0384]
2.根据条款1所述的处理器,其中所述一个或更多个电路用于通过至少使一个或更多个处理器将所述一个或更多个非零值的索引值存储在一个或更多个图形处理核心可访问的存储器中来指示所述一个或更多个非零值。
[0385]
3.根据前述条款中任一项所述的处理器,其中用于指示的所述操作包括所述一个或更多个电路生成指令,所述指令使一个或更多个处理器在并行执行一个或更多个稀疏矩阵乘法运算时将所述一个或更多个非零值的索引存储在一个或更多个线程可访问的存储器中。
[0386]
4.根据前述条款中任一项所述的处理器,其中所述操作是稀疏矩阵乘法运算,并且其中所述一个或更多个电路用于执行编译器以生成可执行指令,以执行所述操作。
[0387]
5.根据前述条款中任一项所述的处理器,其中所述操作用于使编译器接收具有所述一个或更多个数据矩阵的稀疏信息的一个或更多个第一指令,并编译所述一个或更多个第一指令以生成一个或更多个第二指令,所述一个或更多个第二指令能够由图形处理单元(gpu)执行以使用所述稀疏信息执行矩阵乘法运算。
[0388]
6.根据前述条款中任一项所述的处理器,其中所述操作包括半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加(imma)运算、单精度矩阵乘法运算或浮点乘法和累加运算。
[0389]
7.根据前述条款中任一项所述的处理器,其中执行所述操作用于使编译器修改有向无环图(dag)接口以接收具有所述一个或更多个数据矩阵的稀疏信息的一个或更多个指令。
[0390]
8.根据前述条款中任一项所述的处理器,其中指示一个或更多个数据矩阵内的一个或更多个非零值包括:使所述一个或更多个电路执行编译器,以生成将由一个或更多个图形处理核心使用以执行一个或更多个矩阵乘法运算的操作数,并且其中所述操作数包括所述一个或更多个非零值的索引信息。
[0391]
9.一种系统,包括存储器,其用于存储指令,所述指令作为由一个或更多个处理器执行的结果,使所述系统:
[0392]
执行操作以指示一个或更多个数据矩阵内的一个或更多个非零值。
[0393]
10.根据条款9所述的系统,其中指示包括使一个或更多个处理器将所述一个或更多个非零值的索引值存储在一个或更多个图形处理核心可访问的存储器中。
[0394]
11.根据前述条款中任一项所述的系统,其中所述系统用于生成指令,所述指令使一个或更多个处理器在并行执行矩阵乘法运算时将所述一个或更多个非零值的索引存储在一个或更多个线程可访问的存储器中。
[0395]
12.根据前述条款中任一项所述的系统,其中所述操作是稀疏矩阵乘法运算,其中所述系统用于接收一个或更多个指令以执行所述稀疏矩阵乘法运算,并且其中所述系统用于生成将由一个或更多个驱动器使用以执行所述操作的可执行指令。
[0396]
13.根据前述条款中任一项所述的系统,其中所述操作用于使编译器接收具有稀疏信息的一个或更多个第一指令,并编译所述一个或更多个第一指令以生成一个或更多个第二指令,所述一个或更多个第二指令能够由图形处理单元(gpu)执行以利用所述稀疏信息执行矩阵乘法运算。
[0397]
14.根据前述条款中任一项所述的系统,其中所述操作包括半精度矩阵乘法和累
加(hmma)运算、整数矩阵乘法和累加(imma)运算、单精度矩阵乘法运算或浮点乘法和累加运算。
[0398]
15.根据前述条款中任一项所述的系统,其中执行所述操作包括使编译器修改有向无环图(dag)接口,以接收具有所述一个或更多个数据矩阵的稀疏信息的一个或更多个指令。
[0399]
16.根据前述条款中任一项所述的系统,其中指示一个或更多个数据矩阵内的一个或更多个非零值包括:使所述一个或更多个电路执行编译器,以生成将由一个或更多个图形处理核心使用以执行一个或更多个矩阵乘法运算的操作数,其中所述操作数包括所述一个或更多个矩阵的索引信息。
[0400]
17.一种机器可读介质,其上存储有一个或更多个指令,所述一个或更多个指令如果由一个或更多个处理器执行,则使一个或更多个处理器至少:
[0401]
执行操作以指示一个或更多个数据矩阵内的一个或更多个非零值。
[0402]
18.根据条款17所述的机器可读介质,其中指示包括使一个或更多个处理器将所述一个或更多个非零值的索引值存储在一个或更多个图形处理核心可访问的存储器中。
[0403]
19.根据前述条款中任一项所述的机器可读介质,其中所述系统用于生成指令,所述指令使一个或更多个处理器在并行执行矩阵乘法运算时将所述一个或更多个非零值的索引存储在一个或更多个线程可访问的存储器中。
[0404]
20.根据前述条款中任一项所述的机器可读介质,其中所述操作是稀疏矩阵乘法运算,并且其中执行所述稀疏矩阵乘法包括生成将由一个或更多个驱动器使用以执行所述操作的可执行指令。
[0405]
21.根据前述条款中任一项所述的机器可读介质,其中所述操作用于使编译器接收具有稀疏信息的一个或更多个第一指令,并编译所述一个或更多个第一指令以生成一个或更多个第二指令,所述一个或更多个第二指令能够由图形处理单元(gpu)执行以利用所述稀疏信息执行矩阵乘法运算。
[0406]
22.根据前述条款中任一项所述的机器可读介质,其中所述操作包括执行半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加运算(imma)、单精度矩阵乘法运算或乘法和累加运算。
[0407]
23.根据前述条款中任一项所述的机器可读介质,其中执行所述操作用于使编译器修改有向无环图(dag)接口,以接收具有稀疏信息的一个或更多个指令。
[0408]
24.根据前述条款中任一项所述的机器可读介质,其中指示一个或更多个数据矩阵内的一个或更多个非零值包括:使编译器生成将由一个或更多个图形处理核心使用以执行包括稀疏矩阵的一个或更多个矩阵乘法运算的操作数。
[0409]
25.一种方法,包括:
[0410]
执行操作以指示一个或更多个数据矩阵内的一个或更多个非零值。
[0411]
26.根据条款25所述的方法,所述方法还包括:
[0412]
将所述一个或更多个非零值的索引值存储在一个或更多个图形处理核心可访问的存储器中。
[0413]
27.根据前述条款中任一项所述的方法,其中所述方法进一步包括:
[0414]
生成指令,所述指令使一个或更多个处理器在并行执行矩阵乘法运算时将所述一
个或更多个非零值的索引存储在一个或更多个线程可访问的存储器中。
[0415]
28.根据前述条款中任一项所述的方法,其中所述操作是稀疏矩阵乘法运算,其中所述方法还包括:
[0416]
接收一个或更多个指令以执行所述稀疏矩阵乘法运算;以及
[0417]
生成将由一个或更多个图形处理单元的一个或更多个驱动器使用以执行所述操作的可执行指令。
[0418]
29.根据前述条款中任一项所述的方法,其中所述方法进一步包括:
[0419]
在编译器处接收具有稀疏信息的一个或更多个第一指令;以及
[0420]
编译所述一个或更多个第一指令以生成一个或更多个第二指令,所述一个或更多个第二指令能够由图形处理单元(gpu)执行以使用所述稀疏信息执行矩阵乘法运算。
[0421]
30.根据前述条款中任一项所述的方法,其中所述方法进一步包括:
[0422]
执行半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加(imma)运算、单精度矩阵乘法运算或浮点乘法和累加运算。
[0423]
31.根据前述条款中任一项所述的方法,其中所述方法进一步包括:
[0424]
由编译器修改有向无环图(dag)接口,以接收具有所述一个或更多个矩阵的稀疏信息的一个或更多个指令。
[0425]
32.根据前述条款中任一项所述的方法,其中所述方法进一步包括:
[0426]
生成将由一个或更多个图形处理核心使用以执行包括稀疏矩阵的一个或更多个矩阵乘法运算的操作数,其中所述操作数包括所述一个或更多个矩阵的非零元素的索引信息;以及
[0427]
将所述操作数存储在所述一个或更多个处理核心可访问的算术逻辑单元(alu)中。
[0428]
条款集二
[0429]
1.一种处理器,包括:
[0430]
一个或更多个电路,用于执行应用程序编程接口(api)以压缩一个或更多个数据矩阵。
[0431]
2.根据条款1所述的处理器,其中所述一个或更多个电路用于响应于所述api的一个或更多个输出生成用于压缩所述一个或更多个数据矩阵的一个或更多个指令。
[0432]
3.根据前述条款中任一项所述的处理器,其中压缩包括:将所述一个或更多个数据矩阵的非零值存储在数据结构中。
[0433]
4.根据前述条款中任一项所述的处理器,其中所述一个或更多个电路用于响应于接收到用于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算的一个或更多个指令来执行所述api。
[0434]
5.根据前述条款中任一项所述的处理器,其中压缩包括:将所述一个或更多个数据矩阵的非零值存储在一个或更多个图形处理单元可访问的数组中。
[0435]
6.根据前述条款中任一项所述的处理器,其中一个或更多个处理器执行所述api用于使一个或更多个图形处理单元的一个或更多个编译器生成一个或更多个指令以使一个或更多个图形处理单元执行压缩操作。
[0436]
7.根据前述条款中任一项所述的处理器,其中一个或更多个处理器执行所述api
用于通过压缩所述一个或更多个矩阵的一个或更多个行来压缩所述一个或更多个数据矩阵。
[0437]
8.根据前述条款中任一项所述的处理器,其中一个或更多个处理器用于通过使所述一个或更多个矩阵的一个或更多个列被压缩来执行所述api。
[0438]
9.根据前述条款中任一项所述的处理器,其中压缩用于使所述一个或更多个数据矩阵以压缩格式存储在向量、数组或表中,其中所述压缩格式能够由一个或更多个图形处理单元的一个或更多个驱动器访问。
[0439]
10.一种系统,包括存储器,其用于存储指令,所述指令作为由一个或更多个处理器执行的结果,使所述系统:
[0440]
执行应用程序编程接口(api)以压缩一个或更多个数据矩阵。
[0441]
11.根据条款10所述的系统,其中所述系统用于响应于所述api的一个或更多个输出生成用于压缩所述一个或更多个数据矩阵的一个或更多个指令。
[0442]
12.根据前述条款中任一项所述的系统,其中压缩包括:将所述一个或更多个数据矩阵的非零值存储在数据结构中。
[0443]
13.根据前述条款中任一项所述的系统,其中所述系统用于响应于接收到至少部分地基于所述稀疏矩阵的非零值的一个或更多个指示利用一个或更多个图形处理核心执行稀疏矩阵乘法运算的一个或更多个指令来执行所述api。
[0444]
14.根据前述条款中任一项所述的系统,其中压缩包括将所述一个或更多个数据矩阵的非零值存储在一个或更多个图形处理核心可访问的数组中。
[0445]
15.根据前述条款中任一项所述的系统,其中执行所述api用于使一个或更多个图形处理单元的一个或更多个编译器生成一个或更多个指令,以使一个或更多个图形处理单元执行压缩操作。
[0446]
16.根据前述条款中任一项所述的系统,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个行来压缩一个或更多个数据矩阵。
[0447]
17.根据前述条款中任一项所述的系统,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个列来压缩一个或更多个数据矩阵。
[0448]
18.一种机器可读介质,其上存储有一个或更多个指令,所述一个或更多个指令如果由一个或更多个处理器执行,则使一个或更多个处理器至少:
[0449]
执行应用程序编程接口(api)以压缩一个或更多个数据矩阵。
[0450]
19.根据条款18所述的机器可读介质,其中所述一个或更多个指令如果由一个或更多个处理器执行,则进一步使一个或更多个处理器至少:
[0451]
响应于所述api的一个或更多个输出生成用于压缩所述一个或更多个数据矩阵的一个或更多个指令。
[0452]
20.根据前述条款中任一项所述的机器可读介质,其中压缩包括将所述一个或更多个数据矩阵的非零值存储在一个或更多个图形处理核心的一个或更多个线程可访问的数据结构中。
[0453]
21.根据前述条款中任一项所述的机器可读介质,其中所述一个或更多个指令如果由一个或更多个处理器执行,则进一步使一个或更多个处理器至少:
[0454]
响应于接收到用于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算的一
个或更多个指令来执行所述api。
[0455]
22.根据前述条款中任一项所述的机器可读介质,其中压缩包括:将所述一个或更多个数据矩阵的非零值存储在一个或更多个图形处理核心可访问的数组中。
[0456]
23.根据前述条款中任一项所述的机器可读介质,其中执行所述api用于使一个或更多个图形处理单元的一个或更多个编译器生成一个或更多个指令,其中所述一个或更多个指令使所述一个或更多个图形处理单元执行一个或更多个压缩操作。
[0457]
24.根据前述条款中任一项所述的机器可读介质,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个行来压缩一个或更多个数据矩阵。
[0458]
25.根据前述条款中任一项所述的机器可读介质,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个列来压缩一个或更多个数据矩阵。
[0459]
26.一种方法,包括:
[0460]
执行应用程序编程接口(api)以压缩一个或更多个数据矩阵。
[0461]
27.根据条款26所述的方法,还包括:
[0462]
响应于所述api的一个或更多个输出生成用于压缩所述一个或更多个数据矩阵的一个或更多个指令。
[0463]
28.根据前述条款中任一项所述的方法,还包括:
[0464]
将所述一个或更多个数据矩阵的非零值存储在将由一个或更多个图形处理核心执行的一个或更多个线程可访问的数据结构中。
[0465]
29.根据前述条款中任一项所述的方法,其中执行所述api是响应于接收到用于利用一个或更多个图形处理单元执行稀疏矩阵乘法运算的一个或更多个指令。
[0466]
30.根据前述条款中任一项所述的方法,其中压缩包括:
[0467]
将所述一个或更多个数据矩阵的非零值存储在一个或更多个图形处理单元可访问的数组中;以及
[0468]
将所述一个或更多个数据矩阵的所述非零值的索引值存储在所述一个或更多个图形处理单元可访问的另一数组中。
[0469]
31.根据前述条款中任一项所述的方法,还包括:
[0470]
由编译器生成一个或更多个指令,其中所述一个或更多个指令使所述一个或更多个图形处理单元执行压缩操作;以及
[0471]
执行所述一个或更多个图形处理单元的一个或更多个驱动器以在所述一个或更多个图形处理单元上执行所述一个或更多个指令。
[0472]
32.根据前述条款中任一项所述的方法,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个行来压缩一个或更多个数据矩阵。
[0473]
33.根据前述条款中任一项所述的方法,其中所述api用于通过压缩所述一个或更多个矩阵的一个或更多个列来压缩一个或更多个数据矩阵。
[0474]
条款集三
[0475]
1.一种处理器,包括:
[0476]
一个或更多个电路,用于对两个或更多个数据矩阵执行矩阵乘法累加(mma)运算,其中所述两个或更多个矩阵中的至少一个矩阵包含压缩数据。
[0477]
2.如条款1所述的处理器,其中所述mma运算包括用于至少部分地基于稀疏矩阵的
非零值的一个或更多个指示以及所述两个或更多个矩阵包含压缩数据而利用一个或更多个图形处理单元执行乘法运算的一个或更多个指令。
[0478]
3.根据前述条款中任一项所述的处理器,其中一个或更多个电路用于至少部分地基于一个或更多个压缩矩阵来执行一个或更多个矩阵乘法运算。
[0479]
4.根据前述条款中任一项所述的处理器,其中所述压缩数据包括所述两个或更多个矩阵中的所述至少一个矩阵的非零值。
[0480]
5.根据前述条款中任一项所述的处理器,其中所述运算包括半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加(imma)运算、单精度矩阵乘法运算或浮点乘法和累加运算。
[0481]
6.根据前述条款中任一项所述的处理器,其中执行所述mma运算包括编译器接收一个或更多个指令以压缩稀疏矩阵、接收一个或更多个第二指令以存储所述一个或更多个矩阵的所述非零值的索引,以及接收一个或更多个第三指令以将所述mma运算的乘积扩展为等于输入矩阵大小的矩阵大小。
[0482]
7.根据前述条款中任一项所述的处理器,其中执行所述操作用于使编译器修改有向无环图(dag)接口,以接收具有稀疏信息的一个或更多个指令。
[0483]
8.根据前述条款中任一项所述的处理器,其中执行包括:所述一个或更多个电路生成指令,以利用一个或更多个图形处理核心并行执行所述mma运算。
[0484]
9.一种系统,包括用于存储指令的存储器,所述指令作为由一个或更多个处理器执行的结果,使所述系统:
[0485]
对两个或更多个数据矩阵执行矩阵乘法累加(mma)运算,其中所述两个或更多个矩阵中的至少一个矩阵包含压缩数据。
[0486]
10.根据条款9所述的系统,其中所述mma运算用于使编译器生成用于至少部分地基于稀疏矩阵的非零值的一个或更多个指示以及所述两个或更多个矩阵包含压缩数据来执行乘法运算的一个或更多个指令。
[0487]
11.根据前述条款中任一项所述的系统,其中所述系统用于至少部分地基于一个或更多个压缩矩阵来执行一个或更多个矩阵乘法运算。
[0488]
12.根据前述条款中任一项所述的系统,其中所述压缩数据包括所述两个或更多个矩阵中的所述至少一个矩阵的非零值。
[0489]
13.根据前述条款中任一项所述的系统,其中所述mma运算包括半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加运算(imma)或单精度矩阵乘法运算。
[0490]
14.根据前述条款中任一项所述的系统,其中执行所述mma运算包括:编译器接收一个或更多个指令以压缩稀疏矩阵,接收一个或更多个第二指令以存储所述一个或更多个矩阵的所述非零值的索引,以及接收一个或更多个第三指令以将所述mma运算的乘积扩展为等于输入矩阵大小的矩阵大小。
[0491]
15.根据前述条款中任一项所述的系统,其中执行所述操作用于使编译器修改有向无环图(dag)接口,以接收具有稀疏信息的一个或更多个指令。
[0492]
16.根据前述条款中任一项所述的系统,其中执行包括:所述一个或更多个电路生成指令,以利用一个或更多个图形处理核心并行执行所述mma运算。
[0493]
17.一种机器可读介质,其上存储有一个或更多个指令,如果由一个或更多个处理
器执行,则使一个或更多个处理器至少:
[0494]
对两个或更多个数据矩阵执行矩阵乘法累加(mma)运算,其中所述两个或更多个矩阵中的至少一个矩阵包含压缩数据。
[0495]
18.根据条款17所述的机器可读介质,其中所述一个或更多个指令如果由一个或更多个处理器执行,则进一步使一个或更多个处理器至少:
[0496]
生成用于至少部分地基于稀疏矩阵的非零值的一个或更多个指示和所述两个或更多个矩阵包含压缩数据来执行乘法运算的一个或更多个指令。
[0497]
19.根据前述条款中任一项所述的机器可读介质,其中所述一个或更多个指令如果由一个或更多个处理器执行,则进一步使一个或更多个处理器至少:
[0498]
至少部分地基于一个或更多个压缩矩阵执行一个或更多个矩阵乘法运算。
[0499]
20.根据前述条款中任一项所述的机器可读介质,其中所述压缩数据包括所述两个或更多个矩阵中的所述至少一个矩阵的非零值。
[0500]
21.根据前述条款中任一项所述的机器可读介质,其中所述mma运算包括半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加运算(imma)或单精度矩阵乘法运算。
[0501]
22.根据前述条款中任一项所述的机器可读介质,其中所述一个或更多个指令如果由一个或更多个处理器执行,则进一步使一个或更多个处理器至少:
[0502]
生成一个或更多个驱动器可访问的可执行指令,其中所述一个或更多个驱动器至少部分地基于所述可执行指令使一个或更多个图形核心执行所述mma运算。
[0503]
23.一种方法,包括:
[0504]
对两个或更多个数据矩阵执行矩阵乘法累加(mma)运算,其中所述两个或更多个矩阵中的至少一个矩阵包含压缩数据。
[0505]
24.根据条款23所述的方法,还包括:
[0506]
生成至少部分地基于稀疏矩阵的非零值的一个或更多个指示和所述两个或更多个矩阵中的至少一个矩阵包含压缩数据来执行乘法运算的一个或更多个指令。
[0507]
25.根据前述条款中任一项所述的方法,还包括:
[0508]
至少部分地基于一个或更多个压缩矩阵执行一个或更多个矩阵乘法运算。
[0509]
26.根据前述条款中任一项所述的方法,进一步包括:
[0510]
生成一个或更多个第一指令以压缩稀疏矩阵;
[0511]
生成一个或更多个第二指令以存储所述一个或更多个矩阵的非零值的索引;以及
[0512]
生成一个或更多个第三指令以将所述mma运算的乘积扩展为等于输入矩阵大小的矩阵大小。
[0513]
27.根据前述条款中任一项所述的方法,其中执行包括:
[0514]
生成将由一个或更多个驱动器使用的可执行指令,其中所述一个或更多个驱动器使一个或更多个图形核心执行所述mma运算。
[0515]
28.根据前述条款中任一项所述的方法,其中所述运算包括半精度矩阵乘法和累加(hmma)运算、整数矩阵乘法和累加(imma)运算、单精度矩阵乘法运算或浮点乘法和累加运算。
[0516]
条款集四
[0517]
1.一种处理器,包括:
[0518]
一个或更多个电路,用于执行应用程序编程接口(api)以解压缩一个或更多个数据矩阵。
[0519]
2.根据条款1所述的处理器,其中所述一个或更多个电路用于至少部分地基于一个或更多个第二指令来生成一个或更多个第一指令以解压缩一个或更多个矩阵。
[0520]
3.根据前述条款中任一项所述的处理器,其中用于解压缩的api是用于执行一个或更多个稀疏矩阵乘法运算的api库的一部分。
[0521]
4.根据前述条款中任一项所述的处理器,其中所述一个或更多个电路用于响应于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算来解压缩一个或更多个数据矩阵。
[0522]
5.根据前述条款中任一项所述的处理器,其中解压缩包括:基于存储在一个或更多个图形处理核心可访问的存储器中的非零值的指示将压缩矩阵转换为稀疏矩阵。
[0523]
6.根据前述条款中任一项所述的处理器,其中解压缩包括:至少部分地基于所存储的非零值的索引值,将零作为值存储为一个或更多个矩阵值。
[0524]
7.根据前述条款中任一项所述的处理器,其中解压缩包括:基于稀疏矩阵乘法运算的结果和压缩矩阵的非零值的索引值生成乘积矩阵。
[0525]
8.根据前述条款中任一项所述的处理器,其中解压缩包括:使用分散向量来生成包括稀疏矩阵的零值的乘积矩阵。
[0526]
9.根据前述条款中任一项所述的处理器,其中api的一个或更多个输出用于使一个或更多个处理器至少部分地基于压缩矩阵乘法的输入矩阵的非零元素的索引值将所述压缩矩阵乘法的结果转换为稀疏矩阵。
[0527]
10.一种系统,包括存储器,其用于存储指令,所述指令作为由一个或更多个处理器执行的结果,使所述系统:
[0528]
执行应用程序编程接口(api)以解压缩一个或更多个数据矩阵。
[0529]
11.根据条款10所述的系统,其中所述系统用于至少部分地基于一个或更多个第二指令来生成一个或更多个第一指令以解压缩一个或更多个矩阵。
[0530]
12.根据前述条款中任一项所述的系统,其中所述系统用于响应于接收到用于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算的一个或更多个指令,来解压缩一个或更多个数据矩阵。
[0531]
13.根据前述条款中任一项所述的系统,其中解压缩包括:至少部分地基于所存储的非零值的索引值生成零作为值。
[0532]
14.根据前述条款中任一项所述的系统,其中解压缩包括至少部分地基于所存储的非零值的索引值,将零作为值存储为一个或更多个矩阵值。
[0533]
15.根据前述条款中任一项所述的系统,其中解压缩包括:基于稀疏矩阵乘法运算的结果和压缩矩阵的非零值的索引值生成乘积矩阵。
[0534]
16.根据前述条款中任一项所述的系统,其中解压缩包括:使用分散向量来生成包括稀疏矩阵的零值的乘积矩阵。
[0535]
17.根据前述条款中任一项所述的系统,其中api的一个或更多个输出用于使一个或更多个处理器至少部分地基于压缩矩阵乘法的输入矩阵的非零元素的索引值将所述压缩矩阵乘法的结果转换为稀疏矩阵。
[0536]
18.一种机器可读介质,其上存储有一个或更多个指令,所述一个或更多个指令如
果由一个或更多个处理器执行,则使一个或更多个处理器至少:
[0537]
执行应用程序编程接口(api)以解压缩一个或更多个数据矩阵。
[0538]
19.根据条款18所述的机器可读介质,其中所述一个或更多个电路用于至少部分地基于一个或更多个第二指令来生成一个或更多个第一指令,以解压缩一个或更多个矩阵。
[0539]
20.根据前述条款中任一项所述的机器可读介质,其中用于解压缩的api是用于执行一个或更多个稀疏矩阵乘法运算的api库的一部分。
[0540]
21.根据前述条款中任一项所述的机器可读介质,其中所述一个或更多个电路用于响应于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算来解压缩一个或更多个数据矩阵。
[0541]
22.根据前述条款中任一项所述的机器可读介质,其中解压缩包括基于存储在一个或更多个图形处理核心可访问的存储器中的非零值的指示将压缩矩阵转换为稀疏矩阵。
[0542]
23.根据前述条款中任一项所述的机器可读介质,其中解压缩包括至少部分地基于所存储的非零值的索引值,将零作为值存储为一个或更多个矩阵值。
[0543]
24.根据前述条款中任一项所述的机器可读介质,其中解压缩包括:基于稀疏矩阵乘法运算的结果和压缩矩阵的非零值的索引值生成乘积矩阵。
[0544]
25.根据前述条款中任一项所述的机器可读介质,其中解压缩包括:使用分散向量来生成包括稀疏矩阵的零值的乘积矩阵。
[0545]
26.一种方法,包括:
[0546]
执行应用程序编程接口(api)以解压缩一个或更多个数据矩阵。
[0547]
27.根据条款26所述的方法,还包括:
[0548]
至少部分地基于一个或更多个第二指令生成一个或更多个第一指令以解压缩一个或更多个矩阵。
[0549]
28.根据前述条款中任一项所述的方法,其中用于解压缩的api是用于执行一个或更多个稀疏矩阵乘法运算的api库的一部分。
[0550]
29.根据前述条款中任一项所述的方法,还包括:
[0551]
响应于利用一个或更多个图形处理核心执行稀疏矩阵乘法运算,执行所述api以解压缩所述一个或更多个数据矩阵。
[0552]
30.根据前述条款中任一项所述的方法,还包括:
[0553]
基于存储在一个或更多个图形处理核心可访问的存储器中的非零值的指示将压缩矩阵转换为稀疏矩阵。
[0554]
31.根据前述条款中任一项所述的方法,还包括:
[0555]
至少部分地基于存储的非零值的索引值,将零作为值存储为一个或更多个矩阵值。
[0556]
其他变型在本公开的精神内。因此,尽管公开的技术易于进行各种修改和替代构造,但是某些示出的其实施例在附图中示出并且已经在上面进行了详细描述。然而,应理解,无意将公开内容限制为所公开的一种或更多种特定形式,而是相反,其意图是涵盖落入如所附权利要求书所定义的本公开内容的精神和范围内的所有修改、替代构造和等同物。
[0557]
除非另有说明或显然与上下文矛盾,否则在描述所公开的实施例的上下文中(特
别是在所附权利要求的上下文中),术语“一”和“一个”和“该”以及类似指代的使用应被解释为涵盖单数和复数,而不是作为术语的定义。除非另有说明,否则术语“包括”、“具有”、“包含”和“含有”应被解释为开放式术语(意味着“包括但不限于”)。术语“连接”(在未经修改时指的是物理连接)应解释为部分或全部包含在内、附接到或连接在一起,即使有某些介入。除非本文另外指出,否则本文中对数值范围的引用仅旨在用作分别指代落入该范围内的每个单独值的简写方法,并且每个单独值都被并入说明书中,就如同其在本文中被单独叙述一样。除非另外指出或与上下文矛盾,否则术语“集”(例如“项目集”)或“子集”的使用应解释为包括一个或更多个成员的非空集合。此外,除非另外指出或与上下文矛盾,否则术语相应集的“子集”不一定表示对应集的适当子集,而是子集和对应集可以相等。
[0558]
除非以其他方式明确指出或与上下文明显矛盾,否则诸如“a,b和c中的至少一个”或“a,b与c中的至少一个”形式的短语之类的连接语在上下文中理解为通常用来表示项目、条款等,其可以是a或b或c,也可以是a和b和c集的任何非空子集。例如,在具有三个成员的集的说明性示例中,连接短语“a,b和c中的至少一个”和“a,b与c中的至少一个”是指以下任意集:{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}。因此,这种连接语言通常不旨在暗示某些实施例要求存在a中的至少一个,b中的至少一个和c中的至少一个。另外,除非另有说明或与上下文矛盾,否则术语“多个”表示复数的状态(例如,“多个项目”表示多个项目)。多个项目中项目的数量至少为两个,但如果明确指示或通过上下文指示,则可以更多。此外,除非另有说明或从上下文中可以清楚得知,否则短语“基于”是指“至少部分基于”而不是“仅基于”。
[0559]
除非本文另外指出或与上下文明显矛盾,否则本文描述的过程的操作可以任何合适的顺序执行。在至少一个实施例中,诸如本文所述的那些过程(或其变形和/或其组合)之类的过程在配置有可执行指令的一个或更多个计算机系统的控制下执行,并且被实现为代码(例如,可执行指令,一个或更多个计算机程序或一个或更多个应用程序),该代码通过硬件或其组合在一个或更多个处理器上共同执行。在至少一个实施例中,代码以例如计算机程序的形式存储在计算机可读存储介质上,该计算机程序包括可由一个或更多个处理器执行的多个指令。在至少一个实施例中,计算机可读存储介质是非暂时性计算机可读存储介质,其排除了暂时性信号(例如,传播的瞬态电或电磁传输),但包括非暂时性数据存储电路(例如,缓冲区、高速缓存和队列)。在至少一个实施例中,代码(例如,可执行代码或源代码)被存储在其上存储有可执行指令的一组一个或更多个非暂时性计算机可读存储介质(或用于存储可执行指令的其他存储器)上,该可执行指令在由计算机系统的一个或更多个处理器执行时(即,作为被执行的结果),使得计算机系统执行本文所述的操作。在至少一个实施例中,一组非暂时性计算机可读存储介质包括多个非暂时性计算机可读存储介质,并且多个非暂时性计算机可读存储介质中的个体非暂时性存储介质中的一个或更多个缺少全部代码,而是多个非暂时性计算机可读存储介质共同存储全部代码。在至少一个实施例中,可执行指令被执行,以使得不同的指令由不同的处理器执行,例如,非暂时性计算机可读存储介质存储指令,并且主中央处理单元(“cpu”)执行一些指令,而图形处理单元(“gpu”)执行其他指令。在至少一个实施例中,计算机系统的不同组件具有单独的处理器,并且不同的处理器执行指令的不同子集。
[0560]
因此,在至少一个实施例中,计算机系统被配置为实现单独地或共同地执行本文
所述的过程的操作的一个或更多个服务,并且这样的计算机系统被配置有使能实施操作的适用的硬件和/或软件。此外,实现本公开的至少一个实施例的计算机系统是单个设备,并且在另一实施例中是分布式计算机系统,其包括以不同方式操作的多个设备,使得分布式计算机系统执行本文所述的操作,并且使得单个设备不执行所有操作。
[0561]
本文提供的任何和所有示例或示例性语言(例如,“诸如”)的使用仅旨在更好地阐明本公开的实施例,并且不对公开的范围构成限制,除非另有要求。说明书中的任何语言都不应被解释为表示任何未要求保护的要素对于实践公开内容是必不可少的。
[0562]
本文引用的所有参考文献,包括出版物、专利申请和专利,均通过引用并入本文,其程度就如同每个参考文献被单独且具体地指示为以引用的方式并入本文并且其全部内容在本文中阐述一样。
[0563]
在说明书和权利要求中,可以使用术语“耦合”和“连接”以及它们的派生词。应当理解,这些术语可能不旨在作为彼此的同义词。相反,在特定示例中,“连接”或“耦合”可用于指示两个或更多个元件彼此直接或间接物理或电接触。“耦合”也可能意味着两个或更多个元素彼此不直接接触,但仍彼此协作或交互。
[0564]
除非另有明确说明,否则可以理解,在整个说明书中,诸如“处理”、“计算”、“计算”、“确定”等之类的术语,是指计算机或计算系统或类似的电子计算设备的动作和/或过程,其将计算系统的寄存器和/或存储器中表示为物理量(例如电子)的数据处理和/或转换为类似表示为计算系统的存储器、寄存器或其他此类信息存储、传输或显示设备中的物理量的其他数据。
[0565]
以类似的方式,术语“处理器”可以指处理来自寄存器和/或存储器的电子数据并将该电子数据转换成可以存储在寄存器和/或存储器中的其他电子数据的任何设备或存储器的一部分。作为非限制性示例,“处理器”可以是cpu或gpu。“计算平台”可以包括一个或更多个处理器。如本文所使用的,“软件”进程可以包括例如随时间执行工作的软件和/或硬件实体,诸如任务、线程和智能代理。同样,每个过程可以指代多个过程,以连续地或间歇地顺序地或并行地执行指令。术语“系统”和“方法”在本文中可以互换使用,只要系统可以体现一种或更多种方法,并且方法可以被认为是系统。
[0566]
在至少一个实施例中,算术逻辑单元是一组组合逻辑电路,其采用一个或更多个输入来产生结果。在至少一个实施例中,处理器使用算术逻辑单元来实现诸如加法、减法或乘法之类的数学运算。在至少一个实施例中,算术逻辑单元用于实现逻辑运算,例如逻辑与/或(and/or)或异或(xor)。在至少一个实施例中,算术逻辑单元是无状态的,并且由诸如半导体晶体管之类的物理开关组件制成,所述半导体晶体管布置成形成逻辑门。在至少一个实施例中,算术逻辑单元可以作为具有相关时钟的有状态逻辑电路在内部操作。在至少一个实施例中,算术逻辑单元可以被构造为异步逻辑电路,其内部状态未保持在相关寄存器集中。在至少一个实施例中,处理器使用算术逻辑单元来组合存储在处理器的一个或更多个寄存器中的操作数,并产生可由处理器存储在另一寄存器或存储器位置中的输出。
[0567]
在至少一个实施例中,作为处理由处理器检索的指令的结果,处理器将一个或更多个输入或操作数呈现给算术逻辑单元,使得算术逻辑单元至少部分地基于提供给算术逻辑单元输入的指令代码来生成结果。在至少一个实施例中,由处理器提供给alu的指令代码至少部分地基于由处理器执行的指令。在至少一个实施例中,alu中的组合逻辑处理输入并
产生输出,该输出放置在处理器内的总线上。在至少一个实施例中,处理器在输出总线上选择目标寄存器、存储器位置、输出设备或输出存储位置,从而对处理器进行计时,使得由alu产生的结果被发送到期望的位置。
[0568]
系统、计算机系统或计算机实现的机器中。可以通过多种方式来完成获得、获取、接收或输入模拟和数字数据的过程,例如通过接收作为函数调用或对应用程序编程接口的调用的参数的数据。在一些实现方式中,可以通过经由串行或并行接口传输数据来完成获得、获取、接收或输入模拟或数字数据的过程。在另一实现方式中,可以通过经由计算机网络将数据从提供实体传输到获取实体来完成获得、获取、接收或输入模拟或数字数据的过程。也可以参考提供、输出、传送、发送或呈现模拟或数字数据。在各种示例中,提供、输出、传送、发送或呈现模拟或数字数据的过程可以通过将数据作为函数调用的输入或输出参数、应用程序编程接口或进程间通信机制的参数进行传输来实现。
[0569]
尽管上面的讨论阐述了所描述的技术的示例实现,但是其他架构可以用于实现所描述的功能,并且旨在落入本公开的范围内。此外,尽管出于讨论的目的在上面定义了具体的职责分配,但是根据情况,可以以不同的方式分配和划分各种功能和职责。
[0570]
此外,尽管已经用特定于结构特征和/或方法动作的语言描述了主题,但是应当理解,所附权利要求书所要求保护的主题不必限于所描述的特定特征或动作。而是,公开了特定的特征和动作作为实现权利要求的示例性形式。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表