CN109978751A - 多gpu帧渲染 - Google Patents
多gpu帧渲染 Download PDFInfo
- Publication number
- CN109978751A CN109978751A CN201811563306.2A CN201811563306A CN109978751A CN 109978751 A CN109978751 A CN 109978751A CN 201811563306 A CN201811563306 A CN 201811563306A CN 109978751 A CN109978751 A CN 109978751A
- Authority
- CN
- China
- Prior art keywords
- gpu
- memory
- data
- data page
- access request
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/60—Memory management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0842—Multiuser, multiprocessor or multiprocessing cache systems for multiprocessing or multitasking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/10—Address translation
- G06F12/1009—Address translation using page tables, e.g. page table structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/45—Caching of specific data in cache memory
- G06F2212/455—Image or video data
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Software Systems (AREA)
- Image Generation (AREA)
Abstract
一种用于渲染图形帧的方法,将渲染工作分配给多个图形处理单元(GPU),所述多个图形处理单元被配置为允许访问存储在对等GPU的本地附接存储器中的数据页。该方法包括以下步骤:由耦合到第一存储器电路的第一GPU生成用于渲染第一帧的第一图元的一个或更多个第一存储器访问请求,其中第一存储器访问请求中的至少一个以第一数据页为目标,所述第一数据页物理地驻留在耦合到第二GPU的第二存储器电路内;所述第一GPU通过将第一GPU耦合到第二GPU的第一数据链路请求第一数据页,以及所述第一GPU内的寄存器电路累加对所述第一数据页的访问请求计数。所述第一GPU通知驱动程序所述访问请求计数已达到指定阈值。
Description
技术领域
本发明涉及图像渲染,并且更具体地,涉及采用多个图形处理单元的帧渲染。
背景技术
图形渲染系统中的两个关键性能度量是帧速率和延迟。在许多应用(诸如增强现实)中,降低延迟对于真实般的用户体验非常重要。交替帧渲染(AFR)可以通过将交替帧指派给对应的交替图形处理单元(GPU)来提高帧速率。但是,AFR通常不会改善延迟,并且可能会导致在具有帧间数据依赖性的应用中性能下降。分帧渲染(SFR)是另一种可以提高某些应用的帧速率的技术。但是,SFR对于现代工作负载来说是不切实际的。此外,AFR和SFR都会施加某些计算和运行时间限制,其限制对许多当前图形应用的适用性。因此,具有解决与现有技术相关的这些问题和/或其他问题的需求。
发明内容
公开了一种用于使用多个图形处理单元(GPU)渲染图形帧的方法、计算机可读介质和系统。该方法包括由耦合到第一存储器电路的第一图形处理单元(GPU)生成与渲染第一帧的第一图元相关联的一个或更多个第一存储器访问请求,其中第一存储器访问请求中的至少一个以第一数据页为目标,所述第一数据页物理地驻留在耦合到第二GPU的第二存储器电路内。该方法还包括由所述第一GPU通过将第一GPU耦合到第二GPU的第一数据链路来请求第一数据页。另外,该方法包括由所述第一GPU内的寄存器电路累加所述第一数据页的访问请求计数。该方法还包括由所述第一GPU通知驱动程序所述访问请求计数已达到指定阈值。在一个实施例中,第一存储器访问请求中的至少一个以物理地驻留在耦合到第二GPU的第二存储器电路内的第一数据页为目标。
计算机可读介质包括指令,当由处理单元执行该指令时,执行该方法。此外,该系统包括被配置为执行该方法的电路。
附图说明
图1A示出了根据一个实施例的用于通知驱动程序请求计数已达到指定阈值的方法的流程图;
图1B示出了根据一个实施例的用于访问所复制的数据页的方法的流程图;
图1C示出了根据一个实施例的用于针对数据页调度复制命令的方法的流程图;
图1D示出了根据一个实施例的用于基于屏幕空间棋盘图案分配渲染工作的技术;
图1E示出了根据一个实施例的用于通过高速数据链路发送压缩数据的系统;
图1F示出了根据一个实施例的包括用于累加图形处理单元内的访问请求计数的硬件计数器的系统;
图1G示出了根据一个实施例的用于复制和访问数据页的示例性时间顺序;
图2示出了根据一个实施例的并行处理单元;
图3A示出了根据一个实施例的图2的并行处理单元的通用处理集群;
图3B示出了根据一个实施例的图2的并行处理单元的分区单元;
图4示出了根据一个实施例的图3A的流式多处理器;
图5示出了可以在其中实现各种先前实施例的各种架构和/或功能的示例性系统;
图6是根据一个实施例的由图2的并行处理单元实现的图形处理管线的概念图;
图7A是根据一个实施例的双处理器配置的概念图;
图7B是根据一个实施例的四处理器配置的概念图;以及
图7C是根据一个实施例的第二四处理器配置的概念图。
具体实施方式
如本文进一步描述的,在多个GPU上分布渲染减少了渲染延迟并且提供了相对于传统技术通用且可扩展的GPU计算环境。尤其是,在多个GPU上渲染提供了比传统的分帧渲染(SFR)或交替帧渲染(AFR)技术更通用和可扩展的GPU计算环境。
在一个实施例中,两个或更多个GPU被配置为作为对等体(peer)操作,其中一个对等体能够通过高速数据链路(例如,NVLINK、图1E的高速数据链路150)来访问另一个对等体的本地存储器中的数据(例如,表面)。例如,两个或更多个GPU中的第一GPU可以使用远程驻留在两个或更多个GPU的第二GPU的存储器内的表面数据来执行纹理映射操作。基于远程存储器访问跟踪数据,远程表面数据可以被复制到第一GPU的本地存储器,因为高速数据链路的带宽和/或延迟可能低于本地存储器接口的带宽和/或延迟。在某些实施例中,要渲染的给定帧被划分为形成棋盘图案的区域(例如,矩形区域),其中不重叠的相邻区域共享通常指派给不同GPU的棋盘图案中的共同边缘。在其他实施例中,帧被划分为可以由一个或更多个像素重叠的区域(例如,为了可能减少的处理器间通信而折衷冗余计算)。对于大型表面,区域与渲染目标和分布式纹理的存储器页边界对齐。在一个实施例中,针对新帧动态地确定和更新区域的数量,以减少远程传输并在两个或更多个GPU之间提供整体负载均衡。用于帧的矩形由不同GPU单独渲染,并在帧缓冲器中被组合以形成完整的帧。在一个实施例中,帧缓冲器位于两个或更多个GPU之一的本地存储器中。
在某些实施例中,用于渲染帧的图元(例如,由图元命令表示)被发送到两个或更多个GPU,并且其中的硬件电路提供用于选择哪个图元被包括在给定棋盘矩形中的裁剪窗口。早期丢弃未选择的图元以降低GPU资源利用率。在一个实施例中,在图元引擎处加速完整的图元丢弃,其中测试给定的三角形边界框与当前活动的所有权区域(例如,指派给给定的GPU的棋盘图案中的矩形)的相交。这种图元丢弃可以由硬件逻辑电路执行,硬件逻辑电路可以在位置变换管线阶段之后定位在渲染管线中。在一个实施例中,被丢弃的三角形的变换属性不被写入存储器,并且该三角形不被光栅化,从而节省了处理周期和存储器带宽二者。在一个实施例中,像素精确的丢弃在光栅化电路或光栅化着色器功能中实现。
两个或更多个GPU中的每一个在所指派区域内渲染所选择的图元。渲染可以包括多个渲染通道,并且来自存储在一个或更多个表面中的一个渲染通道的结果可以由两个或更多个GPU用于一个或更多个后续渲染通道。在第一GPU上为所指派区域渲染给定通道可能需要来自第二GPU的远程数据。响应于第一GPU的请求,可以根据需要从第二(远程)GPU取回(fetch)远程数据,或者可以在预期请求之前异步地复制远程数据以潜在地实现较低的总延迟。在许多常见场景中,顺序渲染的帧是自相似的,并且用于一帧的存储器访问请求模式基本上在后续帧中被复制,使得每个帧成为后续帧中的访问模式的良好预测器。例如,两个连续帧可以包括基本相同的命令图元,每个命令图元在被渲染时生成基本相同的存储器访问请求。因此,结合执行第一命令流以渲染第一帧而观察到的访问模式可用于预期在执行第二命令流以渲染第二帧之前应当复制哪些存储器块。在某些实施例中,存储器页内的数据以压缩格式存储,远程数据以压缩格式被复制,以降低高速数据链路的整体利用率。
图1A示出了根据一个实施例的用于向驱动程序通知请求计数已达到指定阈值的方法100的流程图。尽管结合图2-7的系统描述了方法100,但是实现方法100的任何处理系统都在本公开的实施例的范围和精神内。在各种实施例中,方法100在图形系统的上下文中实现,被配置为从包括图元的场景信息渲染图形帧。方法100的一个或更多个操作可以由任务专用电路或由任务专用电路和通用处理单元的组合来执行。在一个实施例中,方法100由处理系统执行,处理系统可包括通用中央处理单元(CPU)、并行处理单元(PPU)(例如图2的PPU 200)或其任何组合。
在一个实施例中,处理系统包括直接耦合到第一存储器电路的第一GPU,以及直接耦合到第二存储器电路的第二GPU。此外,第一GPU通过高速数据链路耦合到第二GPU。在一个实施例中,高速数据链路提供原子对等访问操作,并以每秒至少1千兆字节的速率传输数据。第一存储器电路不直接耦合到第二GPU,并且第二存储器电路不直接耦合到第一GPU。
在步骤102,第一GPU生成与渲染第一命令流的第一图元(例如,执行第一图元命令)相关联的一个或更多个第一存储器访问请求,其中第一存储器访问请求中的至少一个的目标是物理地驻留在第二存储器电路内的第一数据页。在这种情况下,第一图元与第一帧相关联。
在步骤104,第一GPU通过高速数据链路请求第一数据页。该请求可以包括但不限于读取访问请求。为了预测哪些数据页应该预先从远程存储器复制到第一GPU本地的第一存储器,跟踪每个GPU内的远程存储器访问。具体地,硬件计数器被配置为对存储器中不同数据页的访问请求进行计数,并将高流量页报告给GPU驱动程序。硬件计数器(寄存器)可以被配置为在渲染帧(当前帧)时选择性地累加(通过递增)对不同远程页的访问请求。例如,硬件计数器可以被配置为仅选择性地累加对指定渲染通道的某些上下文或子上下文的访问请求。给定的计数器可以被限制为累加对特定渲染通道的访问请求,并且可以在渲染通道的开始处重置。在一个实施例中,每个硬件计数器包括用于累加访问请求计数的可编程地址范围。只有具有可编程地址范围内地址的访问请求才能使任何给定的硬件计数器递增。
在步骤106,寄存器电路(例如,硬件计数器)累加对第一数据页的访问请求计数。例如,每次访问第一数据页可以使寄存器电路将累计计数递增1。在一个实施例中,计数以整数值N初始化,并且对于每次访问,计数递减1。在另一个实施例中,计数被初始化(例如,到零)并递增,直到达到编程的阈值计数。
在一个实施例中,当对特定远程页的访问计数超过某阈值时,通知GPU驱动程序并且将该页的标识符(例如,地址和渲染通道)添加到高流量页的集合中。GPU驱动程序可以被配置为从一个GPU的本地存储器调度高流量页以被复制(例如,使用硬件复制引擎),该GPU将该页写入读取该高流量页的第二GPU的本地存储器。通过将高流量页面复制到第二GPU的本地存储器,可以减少远程流量。通过根据渲染通道分离访问计数,GPU驱动程序能够更好地安排在给定帧的整个渲染序列中何时复制特定页。此外,通过限制计数哪些上下文,可以更有效地分配硬件计数器。
在步骤108,第一GPU通知驱动程序访问请求计数已达到指定阈值(即,阈值数值)。驱动程序可以包括软件驱动程序,其被配置为以给定系统架构内的任何技术上可行的位置中执行。例如,驱动程序可以在负责管理第一GPU和第二GPU的操作的中央处理单元(CPU)内执行。
在一个实施例中,第一图元由第一GPU根据包括在第一帧的第一命令流中的第一图元命令来渲染,第二帧在第一帧之后渲染。在一个实施例中,第一命令流指定结合渲染第一帧而执行的第一渲染通道,并且第二命令流指定随后结合渲染第二帧而执行的相同渲染通道,并且通知在渲染第一帧期间发生。
现在将根据用户的期望,阐述关于采用其可以或不可以实现前述框架的各种可选架构和特征的更多说明性信息。应该特别注意的是,出于说明性目的阐述了以下信息,并且不应该被解释为以任何方式进行限制。任何以下特征可以选择性地并入或不排除所描述的其他特征。
图1B示出了根据一个实施例的用于访问复制数据页的方法110的流程图。尽管结合图2-7的系统描述了方法110,但是实现方法110的任何处理系统都在本公开的实施例的范围和精神内。在各种实施例中,方法110在图形系统的上下文中实现,被配置为从包括图元的场景信息渲染图形帧。方法110的一个或更多个操作可以由任务专用电路或者由任务专用电路和通用处理单元的组合执行。在一个实施例中,方法110由处理系统执行,处理系统可包括通用中央处理单元(CPU)、并行处理单元(PPU)(例如图2的PPU 200)或其任何组合。在一个实施例中,响应于从驱动程序接收复制命令来执行方法110。此外,如方法100的步骤108所述,驱动程序在接收到通知时调度复制命令。
在步骤112,第一GPU通过高速数据链路从第二存储器电路接收第一复制命令以复制第一数据页,从而在第一存储器电路内产生第一数据页的副本。在一个实施例中,在第一GPU访问与渲染第一图元相关联的第一数据页之前执行第一复制命令。在一个实施例中,第一图元由第一GPU根据包括在第一帧的第一命令流中的第一图元命令来渲染,并且第二帧在第一帧之后被渲染。渲染第二帧的第一图元可以使第一GPU对驻留在第一存储器电路内的第一数据页的副本内的数据的一个或更多个第二存储器访问请求。
在步骤114,第一GPU执行第一复制命令,将第一数据页从第二存储器电路(第二GPU的本地存储器)复制到第一存储器电路(第一GPU的本地存储器)。在步骤116,第一GPU生成以驻留在与渲染第二帧的第一图元相关联的第一存储器电路内的第一数据页为目标的一个或更多个第二存储器访问请求。
图1C示出了根据一个实施例的用于为数据页调度复制命令的方法120的流程图。尽管结合图2-7的系统描述了方法120,但是实现方法120的任何处理系统都在本公开的实施例的范围和精神内。在各种实施例中,方法120在图形系统的上下文中实现,被配置为从包括图元的场景信息渲染图形帧。方法120的一个或更多个操作可以由任务专用电路或者由任务专用电路和通用处理单元的组合执行。在一个实施例中,方法120由处理系统执行,处理系统可包括通用中央处理单元(CPU),并行处理单元(PPU)(例如图2的PPU 200)或其任何组合。在一个实施例中,在CPU内执行的驱动程序被配置为执行方法120。
在步骤122,驱动程序接收第一数据页的访问请求计数已达到指定阈值的通知。例如,在渲染第一帧的过程中,第一GPU可以访问驻留在第二GPU的第二存储器电路中的第一数据页,如图1A的步骤104中所述。当第一GPU访问第一数据页的次数等于指定阈值时,第一GPU通知驱动程序,使驱动程序接收通知,如图1A的步骤108所述。或者,当第二GPU服务来自第一GPU的对第一数据页的阈值数个访问请求时,第二GPU可以通知驱动程序,使得驱动程序接收通知。
在步骤124,驱动程序调度复制命令以将第一数据页从第二GPU复制到第一GPU。实际上,第一数据页可以驻留在第二GPU的第二存储器电路内,或者在第二GPU的高速缓存电路内。第一数据页被发送到第一GPU并作为副本存储在第一GPU的第一存储器电路内,或者存储在第一GPU的高速缓存电路内。在步骤126,驱动程序在用于渲染第二帧的GPU命令流内包括复制命令。在一个实施例中,驱动程序将复制命令插入GPU命令流中。
在一个实施例中,GPU命令流是第一GPU的第二命令流,并且复制命令可以使第一GPU执行由复制命令指定的复制操作。在可选实施例中,GPU命令流是第二GPU的命令流,并且复制命令可以使第二GPU执行由复制命令指定的复制操作。
在一个实施例中,复制命令包括在用于复制命令的专用复制命令流中,而图元包括在通用命令流中。在这样的实施例中,信号量(semaphore)可以用于调解(mediate)和同步复制命令流和通用命令流的进度。例如,信号量机制可以被配置为在指定的渲染通道开始之前保证复制命令的完成,该指定的渲染通道包括来自将访问第一数据页的通用命令流的命令。除了用作同步屏障的渲染通道之外,各个图元和/或通用命令也可以以这种方式服务,并且特定命令的执行可以由信号量调解。
在另一实施例中,复制命令和图元包括在统一命令流中。给定的复制命令可以相对于统一命令流中的其他命令异步执行,并且可以实现任何技术上可行的技术(包括每个复制命令的信号量)以在其他异步复制完成和依赖于复制数据的命令的执行之间提供同步屏障。
在正常操作期间,驱动程序可以从第一GPU、第二GPU以及可选地附加GPU接收通知。在典型的使用模式中,第一GPU将数据写入给定的数据页(例如,在第一渲染通道中),并且第一GPU随后多次参考该数据以进行进一步处理(例如,在随后的渲染通道中)。通知将某些页标记为高流量(热)页,这可以从复制到本地存储器中受益,其中访问发生在本地而不是通过高速数据链路重复访问。利用通知信息,驱动程序能够为渲染第一帧期间确定的高流量数据页(例如,第一数据页)调度复制命令,以在通过与渲染第二帧相关联的高速数据链路访问之前发生。例如,驱动程序可以调度复制命令以基于对第一数据页的访问强度将第一数据页从第二存储器电路复制到第一存储器电路,同时在第一GPU需要访问第一数据页以渲染后续帧之前渲染一帧。通过这种方式,驱动程序能够自适应地管理数据驻留在何处以获得整体改进的性能。
可以使用任何技术上可行的技术来完成第一GPU和第二GPU之间的渲染工作的分配。一种这样的技术在图1D中示出。更一般地,在不脱离各种实施例的范围和精神的情况下,可以使用任何技术上可行的技术在两个或更多个GPU之间分配渲染工作。
图1D示出了根据一个实施例的用于基于屏幕空间棋盘图案分配渲染工作的技术。如图所示,屏幕空间场景130被划分为矩形区域132。可以将不同的矩形区域132分配给不同的GPU以被渲染。在一个实施例中,根据覆盖屏幕空间场景130的棋盘图案,每个矩形区域132被分配给两个不同GPU中的一个。例如,矩形区域132(1)、132(3)、132(5)和132(7)可以被指派给GPU 139(0)(例如,第一GPU),并且矩形区域132(0)、132(2)、132(4)、132(6)和132(8)可以被指派给GPU 139(1)(例如,第二GPU)。屏幕空间场景130可以包括诸如三角形134的图元(例如,几何图元),每个图元可以完全位于矩形区域132内,或者跨越一个或更多个矩形区域132。例如,三角形134(0)完全位于矩形区域132(0)内,而三角形134(2)横跨矩形区域132(3)和矩形区域132(4)。在可选实施例中,根据不同的模式,矩形区域132可以被分配给三个或更多个不同的GPU。
在一个实施例中,GPU 139(0)包括裁剪贴图(clip map)131(0),其指定GPU 139(0)将处理哪些矩形区域132。类似地,GPU 139(1)包括裁剪贴图131(1),其指定GPU 139(1)将处理哪些区域132。由GPU 139(0)处理的区域在裁剪贴图131(0)中以阴影示出,而由GPU139(1)处理的区域在裁剪贴图131(1)中以阴影示出。在该示例中,裁剪贴图131(0)和裁剪贴图131(1)的并集完全覆盖屏幕空间场景130。在另一实施例中,裁剪贴图131(0)相同地存储在GPU 139(0)和GPU 139(1)中,但GPU 139(1)具有反转比特集,其使GPU 139(1)使用裁剪贴图131(0)的反转表示。在又一个实施例中,裁剪贴图131由GPU 139以编程方式确定。例如,给定GPU被分配了哪些矩形区域132以进行渲染(即,GPU“拥有”)可以使用在图块坐标空间上操作的和/或缩放图块坐标空间的公式来导出。
几何图元(诸如三角形134)可以被发送到GPU 139(0)和GPU 139(1)两者,其中相应的裁剪电路138被配置为基于几何图元是否与被分配以在相应的GPU中处理的矩形区域132相交来保持或丢弃任何给定的几何图元。在一个实施例中,GPU 139(0)中的裁剪电路138(0)可以被配置为丢弃不覆盖将由GPU 139(0)处理的矩形区域或不与其相交的几何图元。类似地,GPU 139(1)中的裁剪电路138(1)可以被配置为丢弃不覆盖将由GPU 139(1)处理的矩形区域或不与其相交的几何图元。裁剪电路138可以执行任何必要的变换操作(例如,对图元顶点),以在屏幕空间中执行裁剪操作之前将几何图元从任意空间(例如,世界空间)映射到屏幕空间。
通过尽早丢弃整个几何图元,有利地节省了存储器和计算资源,并且每个GPU 139可以更有效地操作。可以在稍后在图元的渲染通道中对给定几何图元进行光栅化操作期间确定几何图元的细节像素或子像素覆盖。
在某些实施例中,使通用计算活动(“计算流量”)是分布式的,这使得协作线程阵列(MicrosoftTM DirectX术语中的“CTA”或“块”)被分成两半,其中一半线程在GPU 139(0)上执行,不同的另一半线程在GPU 139(1)上执行。CTA的拆分可以通过预置着色器代码来实现,以使得在每个GPU 139处尽早丢弃一半CTA。在一个实施例中,裁剪电路138被配置为丢弃CTA。
在一个实施例中,着色器编译器被配置为包括CTA中的指令,该指令执行对朝向CTA着色器程序的开始的表面的重要访问的测试,并且使用HW支持,指令可以确定所请求的与访问相关联的数据属于本地GPU。如果CTA中的大多数线程返回错误,则CTA将被终止。请注意,远程GPU对等效的CTA执行等效测试,因此CTA在远程GPU上存活。根据本公开,本领域普通技术人员将理解,利用该技术,CTA分区对于所选择的一个或更多存储器访问指令的存储器位置是最佳的。
工作负载136(0)包括分配给GPU 139(0)的矩形区域132。工作负载136(0)的矩形区域内的几何图元由裁剪电路138(0)选择以包括在工作负载136(0)中。裁剪电路138(0)丢弃未包括在分配给GPU 139(0)的矩形区域132中的几何图元。类似地,工作负载136(1)包括分配给GPU 139(1)的矩形区域132。要由给定GPU处理的几何图元被存储在GPU的存储器内,而其他几何图元(例如,要由不同GPU处理的)被GPU丢弃,从而节省存储器带宽和存储空间。由一个GPU丢弃的几何图元由不同的GPU保存和处理。在几何图元覆盖分配给两个或更多个GPU的两个或更多个矩形区域的情况下,几何图元在每个被覆盖的矩形区域中被实例化,并且几何图元的不同部分可以由适当的GPU渲染。例如,矩形区域132(1)内的三角形134(1)可以由GPU 139(0)渲染,矩形区域132(0)内的三角形134(0)可以由GPU 139(1)渲染,并且三角形134(2)的至少第一部分由GPU 139(0)渲染,而三角形134(2)的至少第二部分由GPU139(1)渲染。
在一个实施例中,矩形区域132的渲染结果在单个GPU内被合成在一起以生成最终渲染帧。在各种配置中,任何数量的GPU可以一起操作以生成最终渲染帧。在某些实施例中,生成两个或更多个最终渲染帧。例如,可以生成左帧和右帧以由虚拟现实头戴式装置分别呈现给用户的左眼和右眼。在另一示例中,多个监视器被配置为显示不同的渲染帧,例如来自不同摄像机位置(例如,以生成场景的全景视图)。
图1E示出了根据一个实施例的用于通过高速数据链路150发送压缩数据的系统140。系统140包括GPU 139(0)、GPU 139(1)和高速数据链路150。系统140还可以包括其他子系统,本文未示出。高速数据链路150被配置为在GPU 139(0)内的客户端148和GPU 139(1)内的客户端148之间传输数据。例如,GPU 139(0)内的客户端电路148(A)可以通过内部互连152将压缩数据发送至交叉开关(XBAR)146(0)和高速集线器(HSHUB)142(0)。压缩数据可以通过高速互连150以压缩格式传输到GPU 139(1)的HSBUB 142(1)内的解压缩电路144。解压缩电路144被配置为解压缩以压缩格式发送的数据,以生成解压缩数据。解压缩数据可以通过内部互连153传输到交叉开关146(1),交叉开关146(1)可以将解压缩数据路由到内部互连154,最后路由到客户端电路148(D)。在一个实施例中,高速数据链路150包括本领域中称为NVLink的商业高速互连。在某些实施例中,高速数据链路150被配置为发送压缩数据,从而减少高速数据链路150的传输时间和总体利用率。客户端电路148可以包括GPU 139内的任何技术上可行的子系统。例如,客户端电路148可以包括到本地存储器的存储器接口、高速缓存等等。在一个实施例中,压缩器块(未示出)可以沿着内部互连154设置并且被配置为压缩和/或解压缩遍历数据(traversing data)。压缩器块可以为XBAR 146提供适当的结构化的数据,以映射到不同的存储器分区(例如,针对源/目的地地址可以是不同的)。
图1F示出了根据一个实施例的系统160,其包括用于累加图形处理单元(例如,GPU139)内的访问请求计数的硬件计数器171、172。如图所示,系统160包括GPU 139和DRAM168,DRAM 168被配置为直接耦合到GPU 139的本地存储器。在一个实施例中,系统160包括一个或更多个CPU/对等处理单元178、179。
GPU 139包括集线器客户端162、帧缓冲集线器(FBHUB)163、HSHUB 142、至少一个交叉开关(XBAR)165、一个或更多个通用处理集群(GPC)166、一个或更多个二级(L2)高速缓存167、以及包括C个硬件计数器171、172的访问计数器子系统170。此外,GPU 139还可以包括循环缓冲器174,其被配置为存储D个缓冲器条目175。在一个实施例中,L2高速缓存167被配置为维护存储在DRAM 168内和/或存储在包括系统160的其他存储器电路内的某些数据的高速缓存副本。
DRAM 168被配置为提供本地数据的读/写存储,例如编程指令、图像数据、纹理数据和其他通用数据。集线器客户端162可以包括专用处理单元(例如,图元分配器或“PD”)和被配置成处理存储在DRAM 168、L2高速缓存167内的数据和/或存储在耦合到FBHUB 163和/或HSHUB 142的存储器电路内的数据的其他电路。在一个实施例中,FBHUB 163和/或HSHUB142被配置为提供与在系统接口161(例如,PCIe)、高速数据链路150和耦合到访问计数器子系统170的内部互连、集线器客户端162和至少一个交叉开关165之间传输数据相关的访问特定操作。在一个实施例中,GPC 166包括图2的GPC250,并且至少一个交叉开关165包括交叉开关270。此外,L2高速缓存167可以实现为图3B的L2高速缓存360。至少一个交叉开关165可以包括图1E的交叉开关146。
CPU/对等处理单元178、179可以包括一个或更多个GPU和/或一个或更多个CPU。GPU可以被配置为作为对等体操作。在一个实施例中,对等处理单元被配置为向至少一个其他对等处理单元提供对本地附接的存储器(例如,DRAM 168)的访问。给定的处理单元可以将存储器空间配置为在存储器空间的一个区域中包括本地存储器,并且将对等存储器配置为在存储器空间的不同区域内的孔径(aperture)。当在处理单元内发布存储器请求时,根据存储器请求的地址范围或基址,将存储器请求引导到本地存储器或对等处理单元。
可以使用通用存储器路由机制来提供来自执行着色器的对存储器的访问,其中存储器管理单元(未示出)确定所请求的页面是远程(对等)的还是本地的。对所请求页面的访问请求相应地作为本地或远程访问进行路由。在一个实施例中,对等孔径定义映射到对等GPU的存储器区域。存储在对等孔径内的数据可以高速缓存在本地高速缓存中,并且可以通过高速数据链路150执行到对等孔径存储器空间中的对等原子操作。该特征与行业标准互连技术(例如PCI express(PCIe))相反,其通常不支持孔径和对等原子操作的组合。
在一个实施例中,访问计数器子系统170包括硬件计数器171、172和控制电路173。每个硬件计数器171、172可以包括状态信息。状态信息可以包括但不限于当前请求计数、阈值计数、处理通道、信道掩码、上下文和地址范围。此外,硬件计数器171、172可以被配置为在虚拟地址或物理地址上操作。访问计数器子系统170被配置为具有对遍历至少HSHUB 142和FBHUB 163的所有访问请求的可见性。可见性可以包括但不限于地址、渲染通道标识符、上下文标识符和子上下文标识符。在一个实施例中,每个访问请求可以是对虚拟地址的物理地址,并且可见性包括物理请求模式设置或虚拟请求模式设置。
当请求地址落入为给定硬件计数器171、172指定的指定地址范围内,并且满足硬件计数器的其他条件时,硬件计数器的当前请求计数递增。其他条件可以包括但不限于当前处理通道匹配状态信息中指定的处理通道,当前上下文匹配状态信息中指定的处理上下文,当前子上下文匹配信道掩码中的至少一个真实状态位。
可以指定子上下文并将其与正在GPU 139内执行的线程的给定实例相关联。信道掩码可以包括任意数量的位(例如,64位),其可以被设置或清除为包括或排除特定线程不由给定硬件计数器171、172计数。
在一个实施例中,给定硬件计数器171与同伴硬件计数器172匹配。在正常操作中,硬件计数器171和硬件计数器172可在必要并满足相同条件(包括匹配的通道ID和匹配的地址范围)时递增。然而,当接收到不同的(新的)通道ID时,硬件计数器171可以重置当前请求计数。然而,当在同伴硬件计数器172中接收到新的通道ID时,不重置当前请求计数。以这种方式,可以识别与特定通道相关的数据以在特定通道之前预加载,而“热门”地址页可以单独且连续地被监控并识别为从一个GPU移动到对等GPU的潜在候选者。
当当前请求计数达到阈值计数时,访问计数器子系统170通知驱动程序。通知可以包括计数器标识符或其他标识信息,例如地址范围、页码或页码范围。对于每个硬件计数器171和/或172,阈值计数可以是固定的或可编程的。
在一个实施例中,当遇到新的地址范围时,分配来自硬件计数器池(171(0)到171(C))的硬件计数器171。同伴硬件计数器172也可以与硬件计数器171一起分配。如果硬件计数器池中没有可用的空闲硬件计数器,则根据替换策略释放当前分配的硬件计数器171。一个示例性替换策略是最近最少使用策略,其中清除最近最少访问的硬件计数器并将其分配为计数新的地址范围。也可以实现其他技术上可行的替换策略。
循环缓冲器174可以被配置为从硬件计数器171、172接收通知,并将通知排队为缓冲器条目175,以发送到DRAM 168,和/或进一步发送到驱动程序。在一个实施例中,驱动程序被配置为在CPU(例如CPU/对等处理单元178、179中的)上执行。循环缓冲器174可以包括控制电路176,其被配置为管理接收通知,从通知生成缓冲器条目175,以及将通知发送到DRAM 168和/或驱动程序。
图1G示出了根据一个实施例的用于复制和访问数据页的示例性时间顺序(chronology)180。时间顺序180描绘了沿时间线181渲染帧序列182(0)、182(1)等。渲染每个帧182包括渲染通道184,其包括命令流中的一系列命令(例如,图元命令)。如图所示,在帧182(0)中渲染通道184(0)的过程期间,从第一GPU 139生成到第二GPU 139的存储器中的相同数据页的阈值数量的访问请求,从而导致生成通知186。访问请求由硬件计数器171计数。除了匹配指定的地址范围之外,可能还需要访问请求匹配某些标准。例如,访问请求可能需要在给定帧的指定渲染通道(例如,渲染通道184)期间发生。另外,访问请求可能需要在指定上下文的执行期间发生。此外,访问请求可能需要由具有由硬件计数器171的信道掩码选择的子上下文的线程生成。驱动程序可以使用这些要求来安排何时应该执行复制操作187。
通知186指示对对等存储器数据的所识别页面(或多个页面)的访问计数已达到阈值访问次数,并且在执行后续帧182中的渲染通道184之前应该复制数据页(或多个数据页)。例如,在执行帧182(0)的渲染通道184(0)期间生成通知186。因此,驱动程序调度复制操作187以在帧182(1)的渲染通道184(1)之前发生。可以实现信号量以强制在完成复制操作187和渲染通道184(1)的开始之间进行排序。或者,信号量可以强制在完成复制操作187和执行访问所识别的数据页的渲染通道184(1)的第一命令之间进行排序。一旦复制操作187完成,可以从本地副本获得第一GPU 139对数据页的访问,从而有利地减少延迟并降低高速链路150的利用率。
在一个实施例中,阈值被计算为基本上等于与复制页面(或多个页面)相关联的数据量。可以根据用于利用高速链路150的特定字节数、全部页数或利用率因子来计算阈值。在一个实施例中,阈值由驱动程序计算。在另一个实施例中,阈值根据给定的系统设计计算。
在示例性实现中,第一GPU 139在第一GPU 139访问与帧182(1)的渲染通道184(1)相关联的所识别的数据页之前接收并执行复制命令,以在来自第二GPU 139的存储器的所识别的数据页上执行复制操作187。
并行处理架构
图2示出了根据一个实施例的并行处理单元(PPU)200。在一个实施例中,PPU 200是在一个或更多个集成电路设备上实现的多线程处理器。PPU 200是设计用于并行处理许多线程的延迟隐藏体系架构。线程(即,执行线程)是被配置为由PPU 200执行的一组指令的实例。在一个实施例中,PPU 200是图形处理单元(GPU),其被配置为实现用于处理三维(3D)图形数据,以便生成用于在显示装置(诸如液晶显示(LCD)设备)上显示的二维(2D)图像数据的图形渲染管线。在其他实施例中,PPU 200可以用于执行通用计算。尽管出于说明性目的在此提供了一个示例性并行处理器,但应特别指出的是,该处理器仅出于说明性目的进行阐述,并且可使用任何处理器来补充和/或替代该处理器。
如图2所示,PPU 200包括输入/输出(I/O)单元205、主机接口单元210、前端单元215、计算调度器单元(CSU)220、计算工作分配单元(CWDU)225、图元分配单元(GPDU)230、集线器235、交叉开关(Xbar)270、一个或更多个通用处理集群(GPC)250以及一个或更多个存储器分区单元280。PPU 200可以经由系统总线202连接到主机处理器或其他外围设备。PPU200还可以连接到包括多个存储器设备204的本地存储器。在一个实施例中,本地存储器可以包括多个动态随机存取存储器(DRAM)设备。
I/O单元205被配置为通过系统总线202从主机处理器(未示出)发送和接收通信(即,命令、数据等)。I/O单元205可以经由系统总线202直接与主机处理器通信或通过一个或更多个中间设备(例如,内存桥)与主机处理器通信。在一个实施例中,I/O单元205实现外围组件互连高速(PCIe)接口,用于通过PCIe总线进行通信。在替代的实施例中,I/O单元205可以实现其他类型的已知接口,用于与外部设备通信。
I/O单元205耦合到主机接口单元210,主机接口单元210对经由系统总线202接收的分组进行解码。在一个实施例中,分组表示被配置为使PPU 200执行各种操作的命令。主机接口单元210将经解码的命令发送到PPU 200的各种其他单元,如命令可指定的那样。例如,一些命令可以被发送到前端单元215。其他命令可以被发送到集线器235或PPU 200的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、电源管理单元等(未明确示出)。换句话说,主机接口单元210被配置为在PPU 200的各种逻辑单元之间和之中路由通信。
在一个实施例中,由主机处理器执行的程序对缓冲区中的命令流进行编码,该缓冲区向PPU 200提供工作负载以进行处理。工作负载可以包括许多指令和指向要由那些指令处理的数据的指针。缓冲区是存储器中的区域,其可由主机处理器和PPU 200两者访问(即,读/写)。例如,主机接口单元210可以被配置为经由I/O单元205通过系统总线202发送的存储器请求访问连接到系统总线202的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入缓冲区,然后将指向命令流开始的指针发送到PPU 200。主机接口单元210管理来自由PPU 200的各个子单元上的主机处理器(即,信道)写入的一个或更多个命令流的指令的调度。
前端单元215从一个或更多个命令流接收来自主机接口单元210的指令,并将这些指令转发到PPU 200的正确子单元。前端单元215可以接收与计算管线相关联的指令。然后,将这些计算指令转发到计算调度器单元220。计算调度器单元220被配置为跟踪与由计算调度器单元220管理的各种任务有关的状态信息。状态可以指示任务被指派给哪个GPC 250,任务是活动的还是不活动的,与任务相关联的优先级等等。计算调度器单元220管理一个或更多个GPC 250上的多个任务的执行。
计算调度器单元220耦合到计算工作分配单元225,计算工作分配单元225被配置为分派任务以在GPC 250上执行。计算工作分配单元225可以跟踪从计算调度器单元220接收的多个调度任务。在一个实施例中,计算工作分配单元225为每个GPC 250管理待处理(pending)任务池和活动任务池。待处理任务池可包括多个时隙(例如,16个时隙),其包含被指派为要由特定GPC 250处理的任务。活动任务池可以包括多个时隙(例如,4个时隙),用于正在由GPC 250主动处理的任务。当GPC 250完成任务的执行时,该任务从GPC 250的活动任务池被逐出,并且来自待处理任务池的其他任务之一被选择和调度以在GPC 250上执行。如果GPC 250上的活动任务已经空闲,例如在等待数据依赖性被解决时,那么活动任务可以从GPC 250中逐出并返回到待处理任务池,而待处理任务池中的另一个任务被选择并调度以在GPC 250上执行。
返回到前端单元215,可以由前端单元215接收与图形管线相关联的指令。然后将这些图形指令转发到图元分配单元230。图元分配单元230经由系统总线202从存储器204或系统存储器取回各种图元的顶点数据。图元可以包括点、线、三角形、四边形、三角形条等。图元分配单元230将顶点分组成多批图元,并将任务分派给GPC 250以处理各批图元。处理可以涉及在可编程处理单元上执行着色器(即,顶点着色器、曲面细分着色器、几何着色器等)以及使用固定功能单元对顶点执行固定功能操作,例如裁剪、剔除和视口变换。
计算工作分配单元225和图元分配单元230经由XBar 270与一个或更多个GPC 250通信。XBar 270是将PPU 200的许多单元耦合到PPU 200的其他单元的互连网络。例如,XBar270可以被配置为将计算工作分配单元225耦合到特定GPC 250。虽然没有明确示出,但是PPU 200的一个或更多个其他单元耦合到主机单元210。其他单元还可以经由集线器235连接到XBar 270。
与计算管线相关联的任务由计算调度器单元220管理,并由计算工作分配单元225分派给GPC 250。与图形管线相关联的任务由图元分配单元230管理并分派给GPC 250。GPC250被配置为处理任务并生成结果。结果可以由GPC 250内的其他任务消耗,经由XBar 270路由到不同的GPC 250,或者存储在存储器204中。结果可以经由存储器分区单元280写入存储器204,存储器分区单元280实现用于向/从存储器204读取和写入数据的存储器接口。在一个实施例中,PPU 200包括U个存储器分区单元280,其等于耦合到PPU 200的单独且不同的存储器设备204的数量。下面结合图3B更详细地描述存储器分区单元280。
在一个实施例中,主机处理器执行实现应用程序编程接口(API)的驱动程序内核,其使得能够在主机处理器上执行一个或更多个应用程序以调度操作用于在PPU 200上执行。应用程序可以生成指令(即,API调用),其使得驱动程序内核生成一个或更多个任务以由PPU 200执行。驱动程序内核将任务输出到由PPU 200处理的一个或更多个流。每个任务可包括一个或更多个相关线程组,本文称为线程束(warp)。线程块可以指代包括用于执行任务的指令的多个线程组。同一线程组中的线程可以通过共享存储器交换数据。在一个实施例中,一个线程组包括32个相关线程。
图3A示出了根据一个实施例的图2的PPU 200的GPC 250。如图3A所示,每个GPC250包括用于处理任务的多个硬件单元。在一个实施例中,每个GPC 250包括管线管理器310、预光栅操作单元(PROP)315、光栅引擎325、工作分配交叉开关(WDX)380、存储器管理单元(MMU)390以及一个或更多个纹理处理集群(TPC)320。应当理解,图3A的GPC 250可以包括代替图3A中所示的单元的其他硬件单元或者除了图3A中所示的单元之外的其他硬件单元。
在一个实施例中,GPC 250的操作由管线管理器310控制。管线管理器310管理用于处理分配给GPC 250的任务的一个或更多个TPC 320的配置。在一个实施例中,管线管理器310可以配置一个或更多个TPC 320中的至少一个以实现图形渲染管线的至少一部分。例如,TPC 320可以被配置为在可编程的流式多处理器(SM)340上执行顶点着色器程序。管线管理器310还可以被配置为将从Xbar 270接收的分组路由到GPC 250中适当的逻辑单元。例如,一些分组可以被路由到PROP 315和/或光栅引擎325中的固定功能硬件单元,而其他分组可以被路由到TPC 320以供图元引擎335或SM 340处理。
PROP单元315被配置为将由光栅引擎325和TPC 320生成的数据路由到存储器分区单元280中的光栅操作(ROP)单元,其在下面将更详细地描述。PROP单元315还可以被配置为执行颜色混合的优化,组织像素数据,执行地址转换等。
光栅引擎325包括被配置为执行各种光栅操作的多个固定功能硬件单元。在一个实施例中,光栅引擎325包括设置引擎、粗光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎和图块合并引擎。设置引擎接收变换后的顶点并生成与由顶点定义的几何图元相关联的平面方程。平面方程被发送到粗光栅引擎以生成图元的覆盖信息(例如,图块的x、y覆盖掩码)。粗光栅引擎的输出可以被发送到剔除引擎,其中与未通过z-测试的图元相关联的片段被剔除,并且被发送到裁剪引擎,其中位于视锥体之外的片段被裁剪掉。那些经过裁剪和剔除而留下来的片段可以被传递到精细光栅引擎,以基于由设置引擎生成的平面方程生成像素片段的属性。光栅引擎380的输出包括要由例如在TPC 320内实现的片段着色器处理的片段。
包括在GPC 250中的每个TPC 320包括M-管线控制器(MPC)330、图元引擎335、SM340和一个或更多个纹理单元345。MPC 330控制TPC 320的操作,将从管线管理器310接收到的分组路由到TPC 320中的适当单元。例如,与顶点相关联的分组可以被路由到图元引擎335,图元引擎335被配置为从存储器204取回与该顶点相关联的顶点属性。相反,与着色器程序相关联的分组可以被发送到SM 340。
在一个实施例中,纹理单元345被配置为从存储器204加载纹理映射(例如,2D纹理像素阵列)并对纹理映射进行采样以产生采样纹理值,以供在由SM 340执行的着色器程序中使用。纹理单元345实现纹理操作,诸如使用mip-map的滤波操作(即,具有不同细节水平的纹理映射)。在一个实施例中,每个TPC 320包括两个(2)纹理单元345。
SM 340包括被配置为处理由多个线程表示的任务的可编程流式处理器。每个SM340是多线程的并且被配置为同时执行来自特定线程组的多个线程(例如,32个线程)。在一个实施例中,SM 340实现SIMD(单指令、多数据)体系架构,其中线程组(即,warp)中的每个线程被配置为基于相同的指令集来处理不同的数据集。线程组中的所有线程都执行相同的指令。在另一实施例中,SM 340实现SIMT(单指令、多线程)体系架构,其中线程组中的每个线程被配置为基于相同的指令集处理不同的数据集,但是其中线程组中的各个线程在执行期间被允许发散。换句话说,当用于该线程组的指令被分派用于执行时,该线程组中的一些线程可以是活动的,从而执行该指令,而该线程组中的其他线程可以是不活动的,从而执行空操作(NOP)而不是执行指令。可以在下面结合图4更详细地描述SM 340。
MMU 390提供GPC 250和存储器分区单元280之间的接口。MMU 390可以提供虚拟地址到物理地址的转换、存储器保护和存储器请求的仲裁。在一个实施例中,MMU 390提供用于改进虚拟地址到存储器204中的物理地址的转换的一个或更多个转换后备缓冲器(TLB)。
图3B示出了根据一个实施例的图2的PPU 200的存储器分区单元280。如图3B所示,存储器分区单元280包括光栅操作(ROP)单元350、二级(L2)高速缓存360、存储器接口370和L2交叉开关(XBar)365。存储器接口370被耦合到存储器204。存储器接口370可以实现用于高速数据传输的16、32、64、128位数据总线等。在一个实施例中,PPU 200包括U个存储器接口370,每个存储器分区单元280有一个存储器接口370,其中每个存储器分区单元280连接到相应的存储器设备204。例如,PPU 200可以连接到多达U个存储器设备204,例如图形双倍数据速率,版本5,同步动态随机存取存储器(GDDR5SDRAM)。在一个实施例中,存储器接口370实现DRAM接口,并且U等于6。
在一个实施例中,PPU 200实现多级存储器分层结构。存储器204位于耦合到PPU200的SDRAM的片外。来自存储器204的数据可以被获取并存储在L2高速缓存360中,其位于芯片上并且在各种GPC 250之间共享。如图所示,每个存储器分区单元280包括与对应的存储器设备204相关联的L2高速缓存360的一部分。然后,可以在GPC 250内的各种单元中实现较低级别的高速缓存。例如,SM 340中的每一个可以实现一级(L1)高速缓存。L1高速缓存是专用于特定SM 340的专用存储器。可以获取来自L2高速缓存360的数据并将其存储在每个L1高速缓存中,以便在SM340的功能单元中进行处理。L2高速缓存360被耦合到存储器接口370和XBar 270。
ROP单元350包括ROP管理器355、颜色ROP(CROP)单元352和Z ROP(ZROP)单元354。CROP单元352执行与像素颜色相关的光栅操作,例如颜色压缩、像素混合等。ZROP单元354结合光栅引擎325实现深度测试。ZROP单元354接收与来自光栅引擎325的剔除引擎的像素片段相关联的样本位置的深度。ZROP单元354测试与片段相关联的样本位置相对于深度缓冲区中的相应深度的深度。如果片段通过样本位置的深度测试,则ZROP单元354更新深度缓冲器并将深度测试的结果发送到光栅引擎325。ROP管理器355控制ROP单元350的操作。应当理解,存储器分区单元280的数量可以与GPC 250的数量不同,因此,每个ROP单元350可以耦合到GPC 250中的每一个。因此,ROP管理器355跟踪从不同GPC 250接收的分组并且确定由ROP单元350生成的结果被路由到哪个GPC 250。CROP单元352和ZROP单元354经由L2XBar 365耦合到L2高速缓存360。
图4示出了根据一个实施例的图3A的流式多处理器340。如图4所示,SM 340包括指令高速缓存405、一个或更多个调度器单元410、寄存器文件420、一个或更多个处理核心450、一个或更多个特殊功能单元(SFU)452、一个或更多个加载/存储单元(LSU)454、互连网络480和共享存储器/L1高速缓存470。
如上所述,计算工作分配单元225和图元分配单元230分派任务以在PPU 200的GPC250上执行。任务被分配给GPC 250内的特定TPC 320,并且如果任务与着色器程序相关联,则该任务可以被分配给SM 340。调度器单元410从计算工作分配单元225和图元分配单元230接收任务,并管理指派给SM 340的一个或更多个线程组(即,warp)的指令调度。每个SM340可以包括K个调度器单元410(即410(0)...410(K-1))。调度器单元410调度并行线程组中的线程用于执行,其中每个组被称为线程束。在一个实施例中,每个线程束包括32个线程。调度器单元410可以管理多个不同的线程束,调度线程束用于执行,然后在每个时钟周期期间将指令从多个不同的线程束分派到各个功能单元(即,核350、SFU 352和LSU 354)。
在一个实施例中,每个调度器单元410包括一个或更多个指令分派单元415。每个分派单元415被配置为向一个或更多个功能单元发送指令。在图4所示的实施例中,调度器单元410包括两个分派单元415,其使得能够在每个时钟周期期间分派来自相同线程束的两个不同指令。在替代实施例中,每个调度器单元410可包括单个分派单元415或附加分派单元415。
每个SM 340包括寄存器文件420,其为SM 340的功能单元提供一组寄存器。在一个实施例中,寄存器文件420在每个功能单元之间被划分,使得每个功能单元被分配寄存器文件420的专用部分。在另一实施例中,寄存器文件420在由SM 340执行的不同线程束之间被划分。寄存器文件420为连接到功能单元的数据路径的操作数提供临时存储。
每个SM 340包括L个处理核心450(即,450(0)...450(L-1))。在一个实施例中,SM340包括大量(例如,192个等)不同的处理核心450。每个核心450可以包括完全管线化的单精度处理单元,其包括浮点算术逻辑单元和整数算术逻辑单元。核心450还可以包括双精度处理单元,其包括浮点算术逻辑单元。在一个实施例中,浮点算术逻辑单元实现用于浮点算术的IEEE 754-2008标准。每个SM 340还包括执行特殊功能(例如,像素混合操作等)的M个SFU 452(即,452(0)...452(M-1)),以及N个LSU 454(即,454(0)...454(N-1)),其在共享存储器/L1高速缓存470和寄存器文件420之间实现加载和存储操作。在一个实施例中,SM 340包括192个核心450、32个SFU 452和32个LSU 454。
每个SM 340包括互连网络480,互连网络480将每个功能单元连接到寄存器文件420和共享存储器/L1高速缓存470。在一个实施例中,互连网络480是可以被配置为将功能单元中的任何一个连接到寄存器文件420中的任何寄存器或共享存储器/L1高速缓存470中的存储器位置的交叉开关。
共享存储器/L1高速缓存470是片上存储器阵列,在一个实施例中,其可以按照应用程序要求被配置为共享存储器或L1高速缓存或两者的组合。例如,共享存储器/L1高速缓存470可以包括64kB的存储容量。共享存储器/L1高速缓存470可以被配置为64kB的共享存储器或64kB的L1高速缓存,或者两者的组合,诸如16kB的L1高速缓存和48kB的共享存储器。
上述PPU 200可以被配置为比传统CPU快得多地执行高度并行计算。并行计算在图形处理、数据压缩、生物识别、流处理算法等方面具有优势。
在一个实施例中,PPU 200包括图形处理单元(GPU)。PPU 200被配置为接收指定用于处理图形数据的着色器程序的命令。图形数据可以被定义为一组图元,例如点、线、三角形、四边形、三角形条等。通常,图元包括指定图元的多个顶点的数据(例如,在模型空间坐标系中)以及与图元的每个顶点相关联的属性。PPU 200可以被配置为处理图元以生成帧缓冲器(即,用于显示器的每个像素的像素数据)。
应用程序将场景的模型数据(即,顶点和属性的集合)写入存储器(诸如系统存储器或存储器204)。模型数据定义可在显示器上可见的每个对象。然后,应用程序对驱动程序内核进行API调用,其请求渲染和显示模型数据。驱动程序内核读取模型数据并将命令写入一个或更多个流以执行处理模型数据的操作。命令可以引用要在PPU 200的SM 340上实现的不同着色器程序,包括顶点着色器、外壳着色器、域着色器、几何着色器和像素着色器中的一个或更多个。例如,SM 340中的一个或更多个可以被配置为执行顶点着色器程序,其处理由模型数据定义的多个顶点。在一个实施例中,不同的SM 340可以被配置为同时执行不同的着色器程序。例如,SM 340的第一子集可以被配置为执行顶点着色器程序,而SM 340的第二子集可以被配置为执行像素着色器程序。SM 340的第一子集处理顶点数据以产生经处理的顶点数据,并将经处理的顶点数据写入L2高速缓存360和/或存储器204。在经处理的顶点数据被光栅化(即,从三维数据变换为屏幕空间中的二维数据)以产生片段数据之后,SM340的第二子集执行像素着色器以产生经处理的片段数据,然后将其与其他经处理的片段数据混合并写入存储器204中的帧缓冲器。顶点着色器程序和像素着色器程序可以同时执行,以管线化方式处理来自同一场景的不同数据,直到场景的所有模型数据都被渲染到帧缓冲器为止。然后,帧缓冲器的内容被发送到显示控制器以在显示设备上显示。
PPU 200可以包括在台式计算机、膝上型计算机、平板计算机、智能电话(例如,无线、手持设备)、个人数字助理(PDA)、数码相机、手持电子设备等中。在一个实施例中,PPU200包含在单个半导体衬底上。在另一个实施例中,PPU 200与一个或更多个其他逻辑单元(例如精简指令集计算机(RISC)CPU、存储器管理单元(MMU)、数模转换器(DAC)等)一起被包括在片上系统(SoC)中。
在一个实施例中,PPU 200可以包括在图形卡上,图形卡包括一个或更多个存储器设备204(诸如GDDR5SDRAM)。图形卡可以被配置为与台式计算机的主板上的PCIe插槽接口,该台式计算机包括例如北桥芯片组和南桥芯片组。在又一个实施例中,PPU 200可以是包括在主板的芯片组(即,北桥)中的集成图形处理单元(iGPU)。
图5示出了示例性系统500,其中可以实现各种先前实施例的各种体系架构和/或功能。如图所示,提供了系统500,其包括连接到通信总线502的至少一个中央处理器501。通信总线502可以使用任何合适的协议来实现,例如PCI(外围组件互连)、PCI-Express、AGP(加速图形端口)、超传输或任何其他总线或一个或更多点对点通信协议。系统500还包括主存储器504。控制逻辑(软件)和数据存储在主存储器504中,主存储器504可以采用随机存取存储器(RAM)的形式。
系统500还包括输入设备512、图形处理器506和显示器508,即传统的CRT(阴极射线管)、LCD(液晶显示器)、LED(发光二极管)、等离子显示器等。可以从输入设备512(例如键盘、鼠标、触摸板、麦克风等)接收用户输入。在一个实施例中,图形处理器506可以包括多个着色器模块、光栅化模块等。前述模块中的每一个甚至可以位于单个半导体平台上以形成图形处理单元(GPU)。
在本说明书中,单个半导体平台可以指代唯一的基于单一半导体的集成电路或芯片。应当注意,术语单个半导体平台还可以指具有增加的连接性的多芯片模块,其模拟片上操作,并且相对于利用传统的中央处理单元(CPU)和总线实现进行了实质性的改进。当然,根据用户的期望,各种模块也可以单独设置或者与半导体平台的各种组合设置。
系统500还可以包括辅助存储510。辅助存储510包括例如硬盘驱动程序和/或可移除存储驱动程序、代表软盘驱动程序、磁带驱动程序、光盘驱动程序、数字多功能盘(DVD)驱动程序、录音设备、通用串行总线(USB)闪存。可移除存储驱动程序以众所周知的方式从可移除存储单元读取和/或写入可移除存储单元。
计算机程序或计算机控制逻辑算法可以存储在主存储器504和/或辅助存储510中。这些计算机程序在被执行时使系统500能够执行各种功能。存储器504、存储510和/或任何其他存储是计算机可读介质的可能示例。
在一个实施例中,各种先前附图的体系架构和/或功能可以在中央处理器501、图形处理器506、能够具有中央处理器501和图形处理器506两者的能力的至少一部分的集成电路(未示出)、芯片组(即,设计为作为用于执行相关功能的单元工作和销售的一组集成电路等),和/或用于此的任何其它集成电路的上下文中实现。
此外,各种先前附图的体系架构和/或功能可以在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统和/或任何其他所需的系统的上下文中实现。例如,系统500可以采用台式计算机、膝上型计算机、服务器、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。此外,系统500可以采用各种其他设备的形式,包括但不限于个人数字助理(PDA)设备、移动电话设备、电视等。
此外,虽然未示出,但是系统500可以耦合到用于通信目的的网络(例如,电信网络、局域网(LAN)、无线网络、广域网(WAN)(诸如因特网)、对等网络、线缆网络等)。
图6是根据一个实施例的、由图2的PPU 200实现的图形处理管线600的概念图。图形处理管线600是实现为从3D几何数据生成2D计算机生成的图像的处理步骤的抽象流程图。众所周知,管线架构可以通过将操作分成多个阶段来更有效地执行长延迟操作,其中每个阶段的输出耦合到下一个连续阶段的输入。因此,图形处理管线600接收从图形处理管线600的一个阶段传输到下一个阶段的输入数据601,以生成输出数据602。在一个实施例中,图形处理管线600可以表示由API定义的图形处理管线。作为选项,图形处理管线600可以在前面附图和/或一个或更多任何后续附图的功能和体系架构的上下文中实现。
如图6所示,图形处理管线600包括包含多个阶段的管线架构。这些阶段包括但不限于数据组装阶段610、顶点着色阶段620、图元组装阶段630、几何着色阶段640、视口缩放、剔除和裁剪(VSCC)阶段650、光栅化阶段660、片段着色阶段670和光栅操作阶段680。在一个实施例中,输入数据601包括命令,其配置处理单元以实现图形处理管线600的阶段,并配置几何图元(例如,点、线、三角形、四边形、三角形带或扇形等)以由这些阶段处理。输出数据602可以包括像素数据(即,颜色数据),其被复制到存储器中的帧缓冲区或其他类型的表面数据结构中。
数据组装阶段610接收输入数据601,其指定用于高阶表面、图元等的顶点数据。数据组装阶段610收集临时存储或队列中的顶点数据,诸如通过从主机处理器接收包括指向存储器中的缓冲区的指针的命令并从该缓冲区读取顶点数据。顶点数据然后被传送到顶点着色阶段620以进行处理。
顶点着色阶段620通过对每个顶点每次执行一组操作(即,顶点着色器或程序)来处理顶点数据。例如,顶点可以被指定为与一个或更多个顶点属性(例如,颜色、纹理坐标、表面法线等)相关联的4坐标向量(即,<x,y,z,w>)。顶点着色阶段620可以操纵各个顶点属性,诸如位置、颜色、纹理坐标等。换句话说,顶点着色阶段620对与顶点相关联的顶点坐标或其他顶点属性执行操作。这些操作通常包括照明操作(即,修改顶点的颜色属性)和变换操作(即,修改顶点的坐标空间)。例如,可以使用对象坐标空间中的坐标来指定顶点,其通过将坐标乘以矩阵进行变换,该矩阵将坐标从对象坐标空间转换为世界空间或归一化设备坐标(NCD)空间。顶点着色阶段620生成被传送到图元组装阶段630的经变换的顶点数据。
图元组装阶段630收集由顶点着色阶段620输出的顶点,并将顶点分组为几何图元,以供几何着色阶段640处理。例如,图元组装阶段630可被配置为将每三个连续顶点分组为几何图元(即,三角形)用于传输到几何着色阶段640。在一些实施例中,特定顶点可以被重新用于连续几何图元(例如,三角形带中的两个连续三角形可以共享两个顶点)。图元组装阶段630将几何图元(即,相关联的顶点的集合)发送到几何着色阶段640。
几何着色阶段640通过对几何图元执行一组操作(即,几何着色器或程序)来处理几何图元。曲面细分操作可以从每个几何图元生成一个或更多个几何图元。换句话说,几何着色阶段640可以将每个几何图元细分为两个或更多个几何图元的更精细网格,以由图形处理管线600的其余部分处理。几何图形着色阶段640将几何图元传送到视口SCC阶段650。
在一个实施例中,图形处理管线600可以在流式多处理器和顶点着色阶段620、图元组装阶段630、几何着色阶段640、片段着色阶段670和/或与其相关联的硬件/软件内操作,可顺序执行处理操作。一旦顺序处理操作完成,在一个实施例中,视口SCC阶段650可以使用该数据。在一个实施例中,可以将由图形处理管线600中的一个或更多个阶段处理的图元数据写入高速缓存(例如,L1高速缓存、顶点高速缓存等)。在这种情况下,在一个实施例中,视口SCC阶段650可以访问高速缓存中的数据。在一个实施例中,视口SCC阶段650和光栅化阶段660被实现为固定功能电路。
视口SCC阶段650执行几何图元的视口缩放、剔除和裁剪。正被渲染的每个表面都与抽象相机位置相关联。相机位置表示正观看该场景的观看者的位置并定义了包围该场景的对象的视锥体。视锥体可以包括观看平面、后平面和四个裁剪平面。完全位于视锥体之外的任何几何图元可被剔除(即丢弃),因为这些几何图元将不会对最终渲染的场景做出贡献。部分位于视锥体内并且部分位于视锥体外的任何几何图元可以被裁剪(即,转换为被包围在视锥体内的新的几何图元)。此外,可以基于视锥体的深度来对每个几何图元进行缩放。然后将所有可能可见的几何图元传送到光栅化阶段660。
光栅化阶段660将3D几何图元转换成2D片段(例如,能够用于显示等)。光栅化阶段660可以被配置为利用几何图元的顶点来设置一组平面方程,从中可以内插各种属性。光栅化阶段660还可以计算多个像素的覆盖掩码,其指示像素的一个或更多个样本位置是否拦截几何图元。在一个实施例中,还可以执行z测试以确定几何图元是否被已经被光栅化的其他几何图元遮挡。光栅化阶段660生成片段数据(即,与每个被覆盖像素的特定样本位置相关联的内插顶点属性),其被传送到片段着色阶段670。
片段着色阶段670通过对片段中的每一个执行一组操作(即,片段着色器或程序)来处理片段数据。片段着色阶段670可以生成片段的像素数据(即,颜色值),诸如通过使用片段的内插纹理坐标执行照明操作或采样纹理映射。片段着色阶段670生成像素数据,其被发送到光栅操作阶段680。
光栅操作阶段680可对像素数据执行各种操作,诸如执行阿尔法测试、模板测试(stencil test)以及将像素数据与对应于与像素相关联的其他片段的其他像素数据混合。当光栅操作阶段680已经完成对像素数据(即,输出数据602)的处理时,可以将像素数据写入渲染目标,诸如帧缓冲区、颜色缓冲区等。
应当领会,除上述阶段中的一个或更多个以外或代替上述阶段中的一个或更多个,一个或更多个额外的阶段可以被包括在图形处理管线600中。抽象图形处理管线的各种实现方式可以实现不同的阶段。此外,在一些实施例中,上述阶段中的一个或更多个可以从图形处理管线中排除(诸如几何着色阶段640)。其他类型的图形处理管线被认为在本公开的范围内。此外,图形处理管线600的任何阶段可以由图形处理器(诸如PPU 200)内的一个或更多个专用硬件单元来实现。图形处理管线600的其他阶段可以由可编程硬件单元(诸如PPU 200的SM 340)来实现。
图形处理管线600可以经由由主机处理器(诸如CPU 501)执行的应用程序来实现。在一个实施例中,设备驱动程序可以实现应用程序编程接口(API),其定义可以被应用程序利用以生成用于显示的图形数据的各种功能。设备驱动程序是包括控制PPU 200的操作的多个指令的软件程序。API为程序员提供抽象,允许程序员利用专用图形硬件(例如PPU200)来生成图形数据而不要求程序员利用PPU 200的特定指令集。应用程序可以包括被路由到PPU 200的设备驱动程序的API调用。设备驱动程序解释API调用并执行各种操作以响应API调用。在一些实例中,设备驱动程序可以通过在CPU 501上执行指令来执行操作。在其他情况下,设备驱动程序可以至少部分地通过利用CPU 501和PPU 200之间的输入/输出接口在PPU 200上启动操作来执行操作。在一个实施例中,设备驱动程序被配置为利用PPU200的硬件来实现图形处理管线600。
可以在PPU 200内执行各种程序以便实现图形处理管线600的各个阶段。例如,设备驱动程序可以启动PPU 200上的内核以在一个SM 340(或多个SM 340)上执行顶点着色阶段620。设备驱动程序(或由PPU 200执行的初始内核)还可以在PPU 200上启动其他内核以执行图形处理管线600的其他阶段,例如几何着色阶段640和片段着色阶段670。此外,图形处理管线600的一些阶段可以在固定单元硬件(例如在PPU 200内实现的光栅化器或数据汇编器)上实现。应当理解,在被SM 340上的后续内核处理之前,来自一个内核的结果可以由一个或更多个中间固定功能硬件单元处理。
图7A是根据一个实施例的双处理器配置700的概念图。如图所示,第一GPU 139(0)和第二GPU 139(1)被配置为通过高速链路150和系统接口(诸如PCIe接口710)进行通信。通过高速链路150的通信包括但不限于,将数据页从一个GPU 139处的源存储器电路发送、复制和/或移动到另一个GPU 139处的目标存储器电路。数据可以以压缩格式或不压缩格式表示。在一个实施例中,PCIe接口710耦合到CPU(未示出),并且CPU被配置为执行GPU 139的至少一个驱动程序。该至少一个驱动程序被配置为执行本文描述的各种技术,例如图1C的方法120。此外,GPU 139被配置为执行图1A的方法100和/或图1B的方法110。
在一个实施例中,第一GPU和第二GPU使用第一高速链路150(例如,NVLINK)耦合在一起并且被配置为渲染用于第一显示设备(未示出)的帧。在另一个实施例中,如图7B所示,第三GPU和第四GPU使用第二高速链路150(1)耦合在一起,并被配置为渲染用于第二显示设备的帧。第一GPU到第四GPU可以使用另一种类型的高速互连进一步耦合在一起,这里示出为PCI express(PCIe)接口710,以提供GPU之间的通信。
图7B是根据一个实施例的四处理器配置702的概念图。如图所示,第一GPU 139(0)和第二GPU 139(1)被配置为通过第一高速链路150(0)和系统接口(诸如PCIe接口710)进行通信。此外,第三GPU 139(2)和第四GPU 139(3)被配置为通过第二高速链路150(1)和系统接口(诸如PCIe接口710)进行通信。通过高速链路150(0)、150(1)进行通信包括但不限于将数据页从一个GPU 139处的源存储器电路发送、复制和/或移动到不同GPU 139处的目标存储器电路。在一个实施例中,PCIe接口710耦合到CPU(未示出),并且CPU被配置为执行GPU139的至少一个驱动程序。该至少一个驱动程序被配置为执行本文描述的各种技术,诸如图1C的方法120。此外,GPU 139被配置为执行图1A的方法100和/或图1B的方法110。虽然示出了两个GPU 139耦合到每个高速链路150,但是各种实施例可以实现容纳多于两个GPU 139的不同高速链路配置。
图7C是根据一个实施例的第二四处理器配置704的概念图。如图所示,四个GPU139(0)、139(1)、139(2)和139(3)被配置为通过高速链路150(0)和系统接口(诸如PCIe接口710)进行通信。通过高速链路150进行通信包括但不限于将数据页从一个GPU 139处的源存储器电路发送、复制和/或移动到不同GPU 139处的目标存储器电路。在一个实施例中,PCIe接口710耦合到CPU(未示出),并且CPU被配置为执行用于GPU 139的至少一个驱动程序。该至少一个驱动程序被配置为执行本文描述的各种技术,诸如图1C的方法120。此外,GPU 139被配置为执行图1A的方法100和/或图1B的方法110。虽然示出了四个GPU 139耦合到高速链路150,但是各种实施例可以实现容纳三个GPU 139或多于四个GPU 139的不同高速链路配置。
在一个实施例中,GPU 139(0)和GPU 139(1)被配置为渲染第一帧。在另一实施例中,GPU 139(2)和GPU 139(3)被配置为渲染第二帧。在某些实施例中,第一帧显示在虚拟现实显示系统的左侧,第二帧显示在虚拟现实显示系统的右侧。在某些实施例中,AFR用GPU139(0)到139(3)实现。例如,GPU 139(0)、139(1)可以使用棋盘工作分配一起工作以渲染偶数帧,GPU 139(2)、139(3)可以使用棋盘工作分配一起工作以渲染奇数帧。在另一示例中,GPU 139(0)、139(1)可以使用棋盘工作分配一起工作以在虚拟现实系统中渲染左眼帧,GPU139(2)、139(3)可以使用棋盘工作分配一起工作以在虚拟现实系统中渲染右眼帧。
在多个GPU上分布渲染减少了渲染延迟,并且相对于传统技术提供了通用且可扩展的GPU计算环境。通过耦合到多个GPU的高速数据链路提供对存储在远程存储器中的数据的访问。每个GPU中的硬件访问计数器被配置为在渲染帧时识别从远程存储器检索的高度访问的数据页,从而触发将通知发送到关联的驱动程序。响应于该通知,驱动程序调度操作以在渲染后续帧之前将所识别的数据页从远程存储器复制到GPU的本地存储器。硬件访问计数器可以基于渲染通道、上下文和附加条件选择性地对同一数据页的访问请求进行计数。
在一个实施例中,本地L2高速缓存被配置为在执行写回操作之前合并请求以提高传输效率。类似地,本地L2高速缓存可以合并相邻的请求,还通过将多个小请求转换为更大的块传输来提高传输效率。特别地,可以通过配置L2高速缓存以使用针对对等孔径的写回策略来实现该L2高速缓存行为。
在某些实施例中,驱动程序被配置为通过调整设置并记录哪些设置有益于将来使用来偶尔执行实验。例如,驱动程序可以尝试使用直接远程访问的特定通道中的表面,然后使用预解析副本。通过测量两种表面访问配置的性能,驱动程序可以为正常或扩展操作选择更快的配置。驱动程序可以执行的另一个实验是将所有渲染广播到所有GPU,而不是分配工作。广播显然没有进行缩放,但也没有任何损害,只要通道对处理要求低但产生大量数据,它就很有用。阴影贴图渲染就是这样一个例子。如果工作是分布式的,则两个GPU中都有完整的阴影贴图供以后使用。
驱动程序可以决定某些通道可以完全在一个GPU上执行,而其他通道完全在另一个GPU上执行。阴影贴图渲染是这种方法可以带来好处的一个示例。在需要N个阴影贴图的场景上存在N个光源的情况下,一个GPU可以处理N/2个阴影贴图的生成,而另一个GPU可以处理剩余的阴影贴图。当GPU正在渲染下一组阴影贴图时,可以将完成的阴影贴图异步复制到另一GPU(例如,使用复制引擎(CE))。
虽然上面已经描述了各种实施例,但是应该理解,它们仅以示例的方式渲染,而不是限制。因此,本申请的广度和范围不应受任何上述示例性实施例的限制,而应仅根据所提交的权利要求及其等同物来限定。
Claims (20)
1.一种方法,包括:
由耦合到第一存储器电路的第一图形处理单元(GPU)生成与渲染第一帧的第一图元相关联的一个或更多个第一存储器访问请求,其中所述第一存储器访问请求中的至少一个以第一数据页为目标,所述第一数据页物理地驻留在耦合到第二GPU的第二存储器电路内;
由所述第一GPU通过将所述第一GPU耦合到所述第二GPU的第一数据链路来请求所述第一数据页;
由所述第一GPU内的寄存器电路累加对所述第一数据页的访问请求计数;以及
由所述第一GPU通知驱动程序所述访问请求计数已达到指定阈值。
2.如权利要求1所述的方法,还包括:由所述第一GPU接收第一复制命令,以通过所述第一数据链路从所述第二存储器电路复制所述第一数据页,以在所述第一GPU访问与渲染第二帧的所述第一图元相关联的所述第一数据页之前在所述第一存储器电路内产生所述第一数据页的副本。
3.如权利要求2所述的方法,还包括:
由所述第一GPU执行所述第一复制命令;以及
由所述第一GPU生成与渲染所述第一图元相关联的一个或更多个第二存储器访问请求,其中所述第二存储器访问请求中的至少一个以所述第一存储器电路内的所述第一数据页的副本为目标。
4.如权利要求2所述的方法,其中所述第一数据页以压缩格式存储在所述第二存储器电路内,并且所述第一数据页的副本以压缩格式存储在所述第一存储器电路内。
5.如权利要求4所述的方法,其中通过所述第一数据链路以所述压缩格式复制所述第一数据页。
6.如权利要求1所述的方法,其中第一命令流指定所述第一帧的第一渲染通道,第二命令流指定第二帧的第一渲染通道,并且通知发生在所述第一帧期间。
7.如权利要求1所述的方法,还包括:在生成所述一个或更多个第一存储器访问请求之前:
由所述第一GPU接收所述第一图元;以及
由所述第一GPU内的裁剪电路确定所述第一图元的位置与指派给所述第一GPU的所述第一帧的第一区域相交。
8.如权利要求1所述的方法,其中通过所述第一数据链路请求所述第一数据页包括确定所述第一数据页驻留在映射到所述第二GPU的第一远程孔径内。
9.如权利要求8所述的方法,其中存储器管理单元确定所述第一页面驻留在所述第一远程孔径内。
10.如权利要求1所述的方法,其中所述一个或更多个第一存储器访问请求包括对驻留在所述第二存储器电路内的数据执行的原子访问操作。
11.如权利要求1所述的方法,还包括:在生成所述一个或更多个第一存储器访问请求之前:
由所述第一GPU接收所述第一图元;以及
由前置着色器指令确定包括所述第一图元的第一协作线程阵列将在所述第一GPU上执行。
12.如权利要求1所述的方法,其中所述一个或更多个第一存储器访问请求中的每一个均包括存储器地址;并且所述寄存器电路被配置为当所述存储器地址在所述寄存器电路的可编程地址范围内时递增所述访问请求计数。
13.如权利要求1所述的方法,其中,将所述第一帧划分为矩形区域,并且将共享公共边缘的相邻矩形区域交替地指派给所述第一GPU和所述第二GPU。
14.如权利要求13所述的方法,其中指派给所述第一GPU的所述矩形区域形成棋盘图案。
15.一种处理系统,配置为:
由耦合到第一存储器电路的第一图形处理单元(GPU)生成与渲染第一帧的第一图元相关联的一个或更多个第一存储器访问请求,其中所述第一存储器访问请求中的至少一个以第一数据页为目标,所述第一数据页物理地驻留在耦合到第二GPU的第二存储器电路内;
由所述第一GPU通过将所述第一GPU耦合到所述第二GPU的第一数据链路来请求所述第一数据页;
由所述第一GPU内的寄存器电路累加对所述第一数据页的访问请求计数;以及
由所述第一GPU通知驱动程序所述访问请求计数已达到指定阈值。
16.如权利要求15所述的处理系统,还被配置为由所述第一GPU接收第一复制命令,以通过所述第一数据链路从所述第二存储器电路复制所述第一数据页,以在所述第一GPU访问与渲染第二帧的第一图元相关联的所述第一数据页之前在所述第一存储器电路内产生所述第一数据页的副本。
17.如权利要求15所述的处理系统,还被配置为:
由所述第一GPU执行所述第一复制命令;以及
由所述第一GPU生成与渲染所述第一图元相关联的一个或更多个第二存储器访问请求,其中所述第二存储器访问请求中的至少一个以所述第一存储器电路内的所述第一数据页的副本为目标。
18.如权利要求15所述的处理系统,还被配置为:
由所述第一GPU接收所述第一图元;以及
由所述第一GPU内的裁剪电路确定所述第一图元的屏幕空间位置与指派给所述第一GPU的所述第一帧的第一区域相交。
19.如权利要求15所述的处理系统,还包括:高速缓存子系统,被配置为将所述第一存储器访问请求中的两个或更多个合并为一个请求。
20.一种非暂时性计算机可读存储介质,其存储指令,所述指令在由处理器执行时使得所述处理器:
由耦合到第一存储器电路的第一图形处理单元(GPU)生成与渲染第一帧的第一图元相关联的一个或更多个第一存储器访问请求,其中所述第一存储器访问请求中的至少一个以第一数据页为目标,所述第一数据页物理地驻留在耦合到第二GPU的第二存储器电路内;
由所述第一GPU通过将所述第一GPU耦合到所述第二GPU的第一数据链路来请求所述第一数据页;
由所述第一GPU内的寄存器电路累加对所述第一数据页的访问请求计数;以及
由所述第一GPU通知驱动程序所述访问请求计数已达到指定阈值。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/857,330 US10402937B2 (en) | 2017-12-28 | 2017-12-28 | Multi-GPU frame rendering |
US15/857,330 | 2017-12-28 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109978751A true CN109978751A (zh) | 2019-07-05 |
CN109978751B CN109978751B (zh) | 2023-05-26 |
Family
ID=66816712
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811563306.2A Active CN109978751B (zh) | 2017-12-28 | 2018-12-20 | 多gpu帧渲染 |
Country Status (3)
Country | Link |
---|---|
US (1) | US10402937B2 (zh) |
CN (1) | CN109978751B (zh) |
DE (1) | DE102018132468A1 (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112037117A (zh) * | 2020-09-07 | 2020-12-04 | 西安芯瞳半导体技术有限公司 | 用于运行高性能gpu应用的方法、装置及计算机存储介质 |
CN112057852A (zh) * | 2020-09-02 | 2020-12-11 | 北京蔚领时代科技有限公司 | 一种基于多显卡的游戏画面渲染方法和系统 |
CN112057851A (zh) * | 2020-09-02 | 2020-12-11 | 北京蔚领时代科技有限公司 | 一种基于多显卡的单帧画面实时渲染方法 |
CN112581349A (zh) * | 2019-09-30 | 2021-03-30 | 想象技术有限公司 | 周期性重置 |
CN114064556A (zh) * | 2020-07-29 | 2022-02-18 | 瑞昱半导体股份有限公司 | 数据处理装置 |
CN114581596A (zh) * | 2022-02-25 | 2022-06-03 | 北京构力科技有限公司 | 基于图形处理单元gpu驱动的几何形体快速渲染的方法 |
CN115210748A (zh) * | 2020-02-03 | 2022-10-18 | 索尼互动娱乐股份有限公司 | 渲染时通过区域测试进行几何图形高效多gpu渲染的系统和方法 |
CN115375530A (zh) * | 2022-07-13 | 2022-11-22 | 北京松应科技有限公司 | 一种多gpu协同渲染方法、系统、装置及存储介质 |
CN115774620A (zh) * | 2022-12-23 | 2023-03-10 | 摩尔线程智能科技(北京)有限责任公司 | 在gpu互联架构中实现存储空间互相访问的方法、装置、计算设备 |
CN115981853A (zh) * | 2022-12-23 | 2023-04-18 | 摩尔线程智能科技(北京)有限责任公司 | Gpu互联架构、实现gpu互联架构的方法、计算设备 |
CN116894764A (zh) * | 2022-03-30 | 2023-10-17 | 想象技术有限公司 | 三维图形渲染的存储器分配 |
WO2024055221A1 (en) * | 2022-09-15 | 2024-03-21 | Qualcomm Incorporated | Fast msaa techniques for graphics processing |
Families Citing this family (27)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108089958B (zh) * | 2017-12-29 | 2021-06-08 | 珠海市君天电子科技有限公司 | Gpu测试方法、终端设备和计算机可读存储介质 |
CN112041825A (zh) * | 2018-05-02 | 2020-12-04 | 株式会社半导体能源研究所 | 半导体装置 |
US11442795B2 (en) | 2018-09-11 | 2022-09-13 | Nvidia Corp. | Convergence among concurrently executing threads |
US20200151847A1 (en) * | 2018-11-13 | 2020-05-14 | Intel Corporation | Workload management for distributed geometry processing |
US10755469B2 (en) | 2018-12-28 | 2020-08-25 | Intel Corporation | Apparatus and method for ray tracing instruction processing and execution |
CN112749120A (zh) * | 2019-10-29 | 2021-05-04 | 辉达公司 | 将数据有效地传输至处理器的技术 |
CN112860428A (zh) * | 2019-11-28 | 2021-05-28 | 华为技术有限公司 | 一种高能效的显示处理方法及设备 |
US11170461B2 (en) | 2020-02-03 | 2021-11-09 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by performing geometry analysis while rendering |
US11321800B2 (en) | 2020-02-03 | 2022-05-03 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by region testing while rendering |
US11514549B2 (en) | 2020-02-03 | 2022-11-29 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by generating information in one rendering phase for use in another rendering phase |
US11263718B2 (en) * | 2020-02-03 | 2022-03-01 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by pretesting against in interleaved screen regions before rendering |
US11508110B2 (en) * | 2020-02-03 | 2022-11-22 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by performing geometry analysis before rendering |
US11080814B1 (en) | 2020-02-03 | 2021-08-03 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by pretesting against screen regions using prior frame information |
US11120522B2 (en) | 2020-02-03 | 2021-09-14 | Sony Interactive Entertainment Inc. | System and method for efficient multi-GPU rendering of geometry by subdividing geometry |
CN115298686B (zh) * | 2020-02-03 | 2023-10-17 | 索尼互动娱乐股份有限公司 | 通过在渲染前针对交错的屏幕区域进行预测试来进行几何图形的高效多gpu渲染的系统和方法 |
TWI792024B (zh) * | 2020-07-22 | 2023-02-11 | 瑞昱半導體股份有限公司 | 圖形處理裝置 |
US11934867B2 (en) | 2020-07-23 | 2024-03-19 | Nvidia Corp. | Techniques for divergent thread group execution scheduling |
CN114064557A (zh) * | 2020-07-29 | 2022-02-18 | 瑞昱半导体股份有限公司 | 图形处理装置 |
CN111737015B (zh) * | 2020-08-10 | 2020-12-25 | 成都索贝数码科技股份有限公司 | 基于多gpu提高大幅面非线性编辑实时层数的方法 |
US20220246081A1 (en) * | 2021-01-05 | 2022-08-04 | Google Llc | Hidden display interfaces and associated systems and methods |
US11677839B2 (en) * | 2021-06-17 | 2023-06-13 | Nvidia Corporation | Automatic coalescing of GPU-initiated network communication |
US20230099093A1 (en) * | 2021-09-24 | 2023-03-30 | Intel Corporation | Scale up and out compression |
KR20230092227A (ko) * | 2021-12-17 | 2023-06-26 | 삼성전자주식회사 | 멀티코어 프로세서 및 스토리지 장치 |
US11860784B1 (en) | 2022-06-27 | 2024-01-02 | Advanced Micro Devices, Inc. | Live profile-driven cache aging policies |
CN116048816B (zh) * | 2023-03-23 | 2023-08-22 | 摩尔线程智能科技(北京)有限责任公司 | 数据请求处理方法、装置、电子设备和存储介质 |
CN117112950B (zh) * | 2023-10-19 | 2024-02-02 | 腾讯科技(深圳)有限公司 | 电子地图中对象的渲染方法、装置、终端及存储介质 |
CN118138832A (zh) * | 2024-05-06 | 2024-06-04 | 武汉凌久微电子有限公司 | 一种基于gpu硬图层的网络视频流显示方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140049549A1 (en) * | 2012-08-20 | 2014-02-20 | Maxim Lukyanov | Efficient placement of texture barrier instructions |
CN103885902A (zh) * | 2012-12-19 | 2014-06-25 | 辉达公司 | 用于经由纹理硬件实施存储器访问操作的技术 |
US20170243319A1 (en) * | 2016-02-18 | 2017-08-24 | Nvidia Corporation | Sub-frame scanout for latency reduction in virtual reality applications |
Family Cites Families (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6633296B1 (en) | 2000-05-26 | 2003-10-14 | Ati International Srl | Apparatus for providing data to a plurality of graphics processors and method thereof |
US6889267B2 (en) | 2002-11-26 | 2005-05-03 | Intel Corporation | Asynchronous communication protocol using efficient data transfer formats |
US8941669B1 (en) | 2005-10-18 | 2015-01-27 | Nvidia Corporation | Split push buffer rendering for scalability |
US7467247B2 (en) | 2005-10-31 | 2008-12-16 | Hewlett-Packard Development Company, L.P. | Timeouts on accessing a shared resource |
US7426621B2 (en) | 2005-12-09 | 2008-09-16 | Advanced Micro Devices, Inc. | Memory access request arbitration |
US7612783B2 (en) * | 2006-05-08 | 2009-11-03 | Ati Technologies Inc. | Advanced anti-aliasing with multiple graphics processing units |
JP4439491B2 (ja) | 2006-05-24 | 2010-03-24 | 株式会社ソニー・コンピュータエンタテインメント | マルチグラフィックスプロセッサシステム、グラフィックスプロセッサおよびデータ転送方法 |
US7627723B1 (en) * | 2006-09-21 | 2009-12-01 | Nvidia Corporation | Atomic memory operators in a parallel processor |
US8271746B1 (en) * | 2006-11-03 | 2012-09-18 | Nvidia Corporation | Tiering of linear clients |
US8068114B2 (en) | 2007-04-30 | 2011-11-29 | Advanced Micro Devices, Inc. | Mechanism for granting controlled access to a shared resource |
US8310491B2 (en) | 2007-06-07 | 2012-11-13 | Apple Inc. | Asynchronous notifications for concurrent graphics operations |
JP5241384B2 (ja) | 2008-08-29 | 2013-07-17 | ルネサスエレクトロニクス株式会社 | 分散共有メモリ型マルチプロセッサ及びデータ処理方法 |
US9135675B2 (en) | 2009-06-15 | 2015-09-15 | Nvidia Corporation | Multiple graphics processing unit display synchronization system and method |
US9384713B1 (en) | 2009-07-27 | 2016-07-05 | Nvidia Corporation | System and method for masking transistions between graphics processing units in a hybrid graphics system |
US8766989B2 (en) | 2009-07-29 | 2014-07-01 | Nvidia Corporation | Method and system for dynamically adding and removing display modes coordinated across multiple graphics processing units |
US8933947B2 (en) | 2009-09-10 | 2015-01-13 | Ati Technologies Ulc | Reading a local memory of a processing unit |
US8615637B2 (en) | 2009-09-10 | 2013-12-24 | Advanced Micro Devices, Inc. | Systems and methods for processing memory requests in a multi-processor system using a probe engine |
US9111325B2 (en) | 2009-12-31 | 2015-08-18 | Nvidia Corporation | Shared buffer techniques for heterogeneous hybrid graphics |
US9041719B2 (en) | 2009-12-03 | 2015-05-26 | Nvidia Corporation | Method and system for transparently directing graphics processing to a graphical processing unit (GPU) of a multi-GPU system |
US9176909B2 (en) | 2009-12-11 | 2015-11-03 | Nvidia Corporation | Aggregating unoccupied PCI-e links to provide greater bandwidth |
US9524138B2 (en) | 2009-12-29 | 2016-12-20 | Nvidia Corporation | Load balancing in a system with multi-graphics processors and multi-display systems |
US9727521B2 (en) | 2012-09-14 | 2017-08-08 | Nvidia Corporation | Efficient CPU mailbox read access to GPU memory |
US10169091B2 (en) * | 2012-10-25 | 2019-01-01 | Nvidia Corporation | Efficient memory virtualization in multi-threaded processing units |
US9639474B2 (en) | 2013-03-15 | 2017-05-02 | Nvidia Corporation | Migration of peer-mapped memory pages |
US10282811B2 (en) * | 2017-04-07 | 2019-05-07 | Intel Corporation | Apparatus and method for managing data bias in a graphics processing architecture |
-
2017
- 2017-12-28 US US15/857,330 patent/US10402937B2/en active Active
-
2018
- 2018-12-17 DE DE102018132468.5A patent/DE102018132468A1/de active Pending
- 2018-12-20 CN CN201811563306.2A patent/CN109978751B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140049549A1 (en) * | 2012-08-20 | 2014-02-20 | Maxim Lukyanov | Efficient placement of texture barrier instructions |
CN103885902A (zh) * | 2012-12-19 | 2014-06-25 | 辉达公司 | 用于经由纹理硬件实施存储器访问操作的技术 |
US20170243319A1 (en) * | 2016-02-18 | 2017-08-24 | Nvidia Corporation | Sub-frame scanout for latency reduction in virtual reality applications |
Non-Patent Citations (1)
Title |
---|
于平: "基于GPU加速的辐射度光照算法的研究及应用", 《国外电子测量技术》 * |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11748200B2 (en) | 2019-09-30 | 2023-09-05 | Imagination Technologies Limited | Periodic reset of graphics processor unit in safety-critical graphics processing system |
US11379309B2 (en) | 2019-09-30 | 2022-07-05 | Imagination Technologies Limited | Periodic reset of graphics processor unit in safety-critical graphics processing system |
CN112581349A (zh) * | 2019-09-30 | 2021-03-30 | 想象技术有限公司 | 周期性重置 |
CN115210748B (zh) * | 2020-02-03 | 2023-11-24 | 索尼互动娱乐股份有限公司 | 渲染时通过区域测试进行几何图形高效多gpu渲染的系统和方法 |
CN115210748A (zh) * | 2020-02-03 | 2022-10-18 | 索尼互动娱乐股份有限公司 | 渲染时通过区域测试进行几何图形高效多gpu渲染的系统和方法 |
CN114064556A (zh) * | 2020-07-29 | 2022-02-18 | 瑞昱半导体股份有限公司 | 数据处理装置 |
CN112057852B (zh) * | 2020-09-02 | 2021-07-13 | 北京蔚领时代科技有限公司 | 一种基于多显卡的游戏画面渲染方法和系统 |
WO2022048098A1 (zh) * | 2020-09-02 | 2022-03-10 | 北京蔚领时代科技有限公司 | 一种基于多显卡的游戏画面渲染方法和系统 |
CN112057851A (zh) * | 2020-09-02 | 2020-12-11 | 北京蔚领时代科技有限公司 | 一种基于多显卡的单帧画面实时渲染方法 |
CN112057852A (zh) * | 2020-09-02 | 2020-12-11 | 北京蔚领时代科技有限公司 | 一种基于多显卡的游戏画面渲染方法和系统 |
CN113521735A (zh) * | 2020-09-02 | 2021-10-22 | 北京蔚领时代科技有限公司 | 一种基于多gpu的单帧画面实时渲染方法 |
WO2022048097A1 (zh) * | 2020-09-02 | 2022-03-10 | 北京蔚领时代科技有限公司 | 一种基于多显卡的单帧画面实时渲染方法 |
US12014103B2 (en) | 2020-09-02 | 2024-06-18 | Wellink Technologies Co., Ltd. | Method and system for game screen rendering based on multiple graphics cards |
CN112037117A (zh) * | 2020-09-07 | 2020-12-04 | 西安芯瞳半导体技术有限公司 | 用于运行高性能gpu应用的方法、装置及计算机存储介质 |
CN114581596A (zh) * | 2022-02-25 | 2022-06-03 | 北京构力科技有限公司 | 基于图形处理单元gpu驱动的几何形体快速渲染的方法 |
CN116894764A (zh) * | 2022-03-30 | 2023-10-17 | 想象技术有限公司 | 三维图形渲染的存储器分配 |
CN115375530A (zh) * | 2022-07-13 | 2022-11-22 | 北京松应科技有限公司 | 一种多gpu协同渲染方法、系统、装置及存储介质 |
WO2024055221A1 (en) * | 2022-09-15 | 2024-03-21 | Qualcomm Incorporated | Fast msaa techniques for graphics processing |
CN115774620A (zh) * | 2022-12-23 | 2023-03-10 | 摩尔线程智能科技(北京)有限责任公司 | 在gpu互联架构中实现存储空间互相访问的方法、装置、计算设备 |
CN115774620B (zh) * | 2022-12-23 | 2023-09-05 | 摩尔线程智能科技(北京)有限责任公司 | 在gpu互联架构中实现存储空间互相访问的方法、装置、计算设备 |
CN115981853A (zh) * | 2022-12-23 | 2023-04-18 | 摩尔线程智能科技(北京)有限责任公司 | Gpu互联架构、实现gpu互联架构的方法、计算设备 |
Also Published As
Publication number | Publication date |
---|---|
US20190206023A1 (en) | 2019-07-04 |
CN109978751B (zh) | 2023-05-26 |
DE102018132468A1 (de) | 2019-07-04 |
US10402937B2 (en) | 2019-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109978751A (zh) | 多gpu帧渲染 | |
US11604649B2 (en) | Techniques for efficiently transferring data to a processor | |
US11106261B2 (en) | Optimal operating point estimator for hardware operating under a shared power/thermal constraint | |
CN111210498B (zh) | 降低多边形网格的细节水平以减少被渲染几何的复杂度 | |
CN103810669B (zh) | 在统一l2高速缓存中高速缓存经适应性定制大小的高速缓存像素块 | |
CN104050706B (zh) | 用于低功率图形渲染的像素着色器旁路 | |
CN108694688A (zh) | 用于在图形处理架构中管理数据偏置的设备和方法 | |
CN118135077A (zh) | 利用图形处理器上的硬件加速的可编程光线追踪 | |
CN110675480B (zh) | 用于获取纹理操作的采样位置的方法和装置 | |
US11645533B2 (en) | IR drop prediction with maximum convolutional neural network | |
US10861230B2 (en) | System-generated stable barycentric coordinates and direct plane equation access | |
US9269179B2 (en) | System, method, and computer program product for generating primitive specific attributes | |
CN104050705A (zh) | 处置光栅操作中的post-z覆盖数据 | |
KR102480787B1 (ko) | 순서에 관계 없는 캐시 리턴 | |
CN108734638A (zh) | 自适应子分片的系统、设备和方法 | |
TW201439770A (zh) | 透過貼圖硬體執行記憶體存取操作之技術 | |
US11714559B2 (en) | Efficient memory-semantic networking using scoped memory models | |
US11429534B2 (en) | Addressing cache slices in a last level cache | |
US11907717B2 (en) | Techniques for efficiently transferring data to a processor | |
CN112288619A (zh) | 用于在渲染图形时预加载纹理的技术 | |
CN113450445A (zh) | 临时密实渲染的自适应像素采样顺序 | |
CN112749120A (zh) | 将数据有效地传输至处理器的技术 | |
CN108693950A (zh) | 处理器功率管理 | |
KR20240078413A (ko) | 병렬 광선 테스트를 갖는 광선 교차 회로 | |
TW201439762A (zh) | 透過貼圖硬體執行記憶體存取操作之技術 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |