图形处理器中灵活的缓冲区大小调整的制作方法

文档序号:20361949发布日期:2020-04-10 23:45阅读:371来源:国知局
图形处理器中灵活的缓冲区大小调整的制作方法

背景

诸如个人计算机、便携式计算平台、游戏系统和服务器之类的计算系统可以包括图形处理器以及主/中央处理器。这些图形处理器(有时称为图形处理单元(gpu))可被集成到中央处理器中,或可在其他配置中被离散地提供在单独的插件卡上。用户应用、操作系统、视频游戏、或其他软件元件可使用各种应用程序编程接口(api)与gpu对接,这些应用程序编程接口(api)允许在软件元件和各种gpu硬件元件之间实现标准化的软件/逻辑接口。

大多数gpu可具有专门的角色用于渲染二维(2d)和三维(3d)图形数据两者以供显示,诸如来自操作系统、生产力应用、娱乐媒体、科学分析、游戏软件或或其他图形数据源的图形数据。gpu也可在通用处理环境中被采用,诸如人工智能、机器学习、神经网络、统计分析和加密货币挖掘。在gpu内,各种内部阶段可将图形数据处理为经渲染的图像以便显示在合适的显示设备上。在许多gpu中,这些内部阶段包括图形流水线,该图形流水线可获取场景或用户界面的表示并将其渲染为图像以便输出到各种显示设备。在这些gpu阶段中包括着色器阶段和其他阶段和功能,这些阶段和功能提供经渲染的图像的各部分的图形细节、表面纹理映射、颜色、阴影或其他元素。

概览

本文介绍了用于高度并行化处理环境中的多个可增长数据队列和堆栈结构的实现。在一个示例中,一种在图形处理器中处置数据缓冲区资源的方法包括建立由存储器指针跟踪的可用存储器页面池以用于可增长数据结构中。该方法包括响应于图形处理器的至少着色器单元对可增长数据结构中用于写入着色器数据的空间的请求,根据请求中指示的数据大小,向着色器单元至少提供指向可增长数据结构中的存储器页面的位置的写入指针。该方法包括响应于超过可增长数据结构的阈值充盈度,从可用存储器页面池中分配至少一个进一步的存储器页面以包含在可增长数据结构中。

提供本概览以便以简化的形式介绍将在以下详细描述中进一步描述的概念的选集。可以理解,本概览并不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。

附图简述

参考以下附图可更好地理解本公开的许多方面。尽管结合这些附图描述了若干实现,但是本公开不局限于本文中所公开的这些实现。相反,意图是要覆盖所有的替换方案、修改和等价物。

图1例示了在一实现中的数据处理环境。

图2例示了在一实现中的操作数据缓冲区处置系统的方法。

图3例示了在一实现中的数据缓冲区处置系统和过程。

图4例示了在一实现中的数据缓冲区处置系统和过程。

图5例示了在一实现中的示例跟踪结构。

图6例示了在一实现中的示例可增长数据结构。

详细描述

图形处理单元(gpu)包括各种内部硬件组件,诸如处理阶段、存储器元件和其他经流水线化的处理元件。gpu和相关联的支持软件可渲染二维(2d)和三维(3d)图形。在一些示例中,gpu将着色和纹理数据应用于渲染给用户的3d空间内的目标对象。着色数据提供渲染中变化的明度、暗度和颜色,而纹理数据提供表面细节、表面图形、纹理或其他表面特征以表示具有所需表面细节的对象。纹理和着色过程可能是处理器密集型的,并且需要大量存储器才能完成。预计由gpu渲染的用户内容(诸如视频游戏内容)在复杂度方面将随时间推移继续增长,但预计诸如带宽和存储器容量之类的图形硬件约束将不会以相似的速度增长。本文讨论的技术为gpu提供了改进的着色器和相关联的数据缓冲区元件。本文中增强的缓冲区结构允许响应于当前的图形处理需求而灵活地对缓冲区进行大小调整,提供对存储器资源的更有效利用以及对数据操作进行批处理和对数据操作排序以用于图形处理器中的着色操作。

以图形为中心的软件的开发人员(诸视频游戏开发人员或其他程序员)经常遇到以下场景:其中一个着色器生成数据并将数据存储到数据结构中,并然后另一着色器使用来自该数据结构的该数据。一些示例采用了其中数据可被同时产生和使用的数据结构。进一步的示例使用先进先出(fifo)缓冲区布置,该布置需要多个fifo,其中任意数量的数据被存储在各个fifo中,但是将被存储在各个fifo中的数据量是预先未知的。本文的各示例可提供可在新数据被添加到fifo时生成的警报,以便相关联的调度元件可启动着色器以使用该新数据。但是,现有的gpu无法有效利用这些数据结构,并且一旦建立后缓冲区的大小就很难有效地改变。例如,gpu可在存储器上执行原子“比较交换”指令,因为使用着色器指令实现环形缓冲区困难且效率低下。

本文介绍了用于高度并行化环境中的多个可增长数据队列和堆栈结构的有效实现。本文的示例包括在图形处理器中处置数据缓冲区资源的方法。在一个示例中,可用存储器页面池被建立(其在空闲页面列表中由存储器指针跟踪,或者在与可增长数据结构描述符相关联的链接列表中被跟踪)。图形处理器的着色器元件可以请求在其中写入新数据或读取先前写入的数据的空间,并且本文各示例提供了针对多个阴影器线程并行地有效合并请求和去合并结果的操作。响应着色器请求,存储器的地址被计算以被读取或写入以并行地用于多个着色器线程。响应于接收到的请求,用于自动地增长或收缩可增长数据结构的操作被提供。预取可在空闲页面列表中被处置以作为对写入请求的优化,并且在链接列表中预先预取以作为对读取请求的优化。在此提供了对乱序读取和写入的跟踪,以便对已被分配但尚未写入的存储器区域、其写入已完成但其数据尚未读取的区域、其写入已完成且读取已开始的区域、以及其数据已被写入且完全使用的区域进行区分和概述。此外,提供了本文所讨论的各种可增长结构的状态的跟踪和概述,以帮助对它们各自的数据的出列进行优先级排序。而且,对超范围错误的处置被有效地提供,诸如请求读取尚未被写入的数据。

本文的各示例进一步为操作可增长数据结构的多个并发着色器提供了增强和有效的实现。此外,增强的操作允许着色器将数据提交到数据结构(fifo、队列或堆栈等)中,并允许数据结构在大小方面可被动态地调整,诸如动态“可增长”的数据结构。但是,本文的一些增强功能可被应用于静态大小的数据结构。相关联的硬件有利地分配了新的存储器部分以便在当前部分填满时写入。增强的操作进一步提供对可增长数据结构的同时读取和写入、提供使用数据的多个线程、自动通知调度器将工作添加到可增长数据结构的可编程子集中、允许多个可增长数据结构被并行访问、以及除了将实际数据读取和写入到存储器的行为之外消除几乎所有的延迟。

尽管本文讨论的增强的可增长数据结构可被应用于任何数据处理和处置环境,但是本文的各示例在图形处理环境的上下文中被讨论。具体而言,图形处理环境的着色器功能被讨论,其可在图形处理器、gpu、或其他数据处理系统中被采用。此外,尽管fifo、队列或堆栈数据结构被讨论,但是其他数据结构也可以采用本文的增强特征以便包括“可增长”特征。被用于着色器操作中的可增长数据结构由存储器提供,诸如随机存取存储器(ram)和其他形式的存储器。

着色器功能被gpus采用以将着色(shading)、阴影(shadows)、颜色强度或其他属性应用于要被渲染的图形场景中的各元素。着色器通常是大规模并行元件,诸如软件元件或硬件实现的元件。在现代图形处理中,着色器被大量地提供(诸如数千个或更多),所有着色器都试图同时执行类似的操作。例如,gpu可以具有多个硬件着色器单元(例如4-64或更多),这些着色器单元中的每一者都处置多个线程组,诸如64个线程组。每个线程组还可包括数千个同时运行的线程,诸如每个线程组32-1000个线程。设计用于同时管理针对单个线程的数千个存储器请求或数千个推入/弹出请求的硬件可能很困难,并因此,在gpu中管理相关联的数据缓冲区操作可能会面临挑战。在着色器中,列表管理可能很复杂,而现有的gpu操作码和处置技术也存在,但这些现有技术可能难以实现,并可能在现有硬件上效率不高。为了提供增强的着色器操作和存储器缓冲区操作,本文提供了可执行原子操作并处置着色器的读写指针及相关联的数据缓冲区的各种元件,诸如保存着色器描述符的缓冲区管理元件或堆栈/队列管理器(sqm)。

在操作期间,着色器将数据推入缓冲区以供后续服务。本文提供的缓冲区管理元件可以具有对数据处置的“直接”和“间接”方法。在直接方法中,存储器数据总线瓶颈可在着色器进行的大量操作期间被创建。然而,尽管直接方法仍然会在存储器带宽上受到瓶颈,但是直接方法比当今标准硬件上的现有算法更为高效,且间接方法也实现了性能增益。直接方法支持堆栈,而间接方法则不支持。直接和间接方法两者都允许写入合并,其中直接方法在写入合并方面比间接方法稍好。直接方法可能无法访问存储器总线的全部带宽,而间接方法通常可以。

然而,本文讨论的增强的“间接”方法可处置大量操作以有效使用存储器数据总线。在间接方法中,着色器请求用于将在着色器操作期间被写入的数据的空间。分配给经请求的可增长数据结构的缓冲区管理元件执行各种检查以确定数据空间是否可以容纳当前页面的剩余大小。缓冲区管理元件返回指向着色器的两个指针和一个计数。第一指针是着色器的第一一个或多个线程可以开始写入的位置,计数是着色器可在其中安全地写入的元素数,第二指针是新页面的开始,着色器可在该处写入其剩余的数据元素。当着色器完成写入其数据后,着色器会将一条新消息发送回缓冲区管理元件,以指示着色器已将多少数据元素写入到一个或两个页面中。

着色器可被指示执行“n”个线程来处理数据,诸如64或128个线程。着色器可在对缓冲区管理元件的单个请求中,针对多个线程并发地以突发方式将数据“推入”到数据缓冲区/从数据缓冲区“弹出”数据。这有效地压缩了请求的使用,以有效利用存储器资源和物理数据总线资源。例如,如果着色器线程组中有64个线程,则相关联的缓冲区管理元件将不必处置64个单独的“开始推入”请求——着色器硬件(或着色器程序)可以检测到全部64个线程都希望推入到相同的可增长数据结构,并将单个“开始推入-请求用于64个元素的空间”命令发送到缓冲区管理元件。当缓冲区管理元件将两个指针地址和可增长数据结构的计数发送回着色器单元时,硬件或软件两者可被用于对这两个地址和计数进行解压缩以便为64个线程中的每一者生成安全地址以供写入。相同的操作可能会因“开始弹出”请求而发生。此写入合并和突发读取可因此被着色器执行以有效利用任何相关联的存储器总线。在写入或“推入”操作期间,用于多个线程的数据可被组合、打包或以其他方式“压缩”为单个写入操作。在读取或“弹出”操作期间,着色器可包括增强功能以分发、解打包或以其他方式“解压缩”在读取操作中组合的数据以确保每个线程被提供了相关数据以供处理。着色器可使用各种数据分派和跟踪技术来跟踪此合并和分解。

对于来自缓冲区的数据读取操作(“弹出”),缓冲区管理元件可能会为着色器提供指向一个以上页面的一个以上读取指针(诸如当相关联的数据跨越一个以上页面时)以及一个计数。该计数可指示第一页面上有多少元素是有效的。在着色器请求多于已被写入缓冲区的数据的情况下,指示第二页面上有多少元素是有效的的另一计数还可被提供。第一指针可指示页面内数据的开始位置,而第二指针可指示包含与读取操作相关联的进一步数据的第二页面的开始。这在着色器请求从缓冲区读取多于一个的条目(诸如在一个示例中为64或128个条目)时很有用。64或128个条目可能各自与不同的线程相关联,并且这些条目可以跨越一个以上页面。因此,多个指针可针对读取操作被返回。即使缓冲区增长,写入合并和突发读取可因此被着色器执行以有效利用任何相关联的存储器总线。

在一些示例中,着色器“线程组”中具有32或更多个线程,并且线程组发出请求,同时缓冲区管理元件与线程组进行通信。硬件或软件负责将基于线程组的结果分发回此线程组中的各个线程。线程组中的每个线程都可指定fifo/堆栈id,和指示该线程“是否参与”的比特。例如,线程组中的每个线程可以从给定的可增长数据结构请求0或1个项目,并且指示线程组的哪些线程正在请求数据的掩码可能会被提供或生成。在进一步的示例中,每个线程可能被配置成请求用于一个以上项目的空间,并具有一些经添加的实现逻辑。当线程组执行“写入”时,此写入诸如经由掩码或其他指示符指示该线程组中的每个线程是否参与写入。但是,每个线程可能正写入完全分散的存储器地址,并且这些分散的存储器地址由标准gpu功能处置。

着色器程序、着色器单元、sqm或着色器与sqm之间的某个其他元件通常会合并请求。例如fifo,所有写入“fifoid0”的线程都被分组为单个“开始推入”请求,所有写入“fifoid1”的线程都被分组为分隔的“开始推入”请求,依此类推。每个sqm可以一次处理一个“开始”请求,尽管多个线程(或潜在的多个线程组,取决于合并算法)可能促成了该请求。由sqm生成的地址然后被拆分开并被发送回相应的着色器线程。此去合并操作可以在着色器程序、着色器硬件、sqm或着色器硬件与sqm之间的某个其他元件中完成。有利地,发生的合并越多,性能越好。

本文讨论的元件提供增强的“可增长”缓冲区功能。这些可增长缓冲区可被用于图形处理环境(诸如用于着色器元素),并可使用跟踪可被分配给可增长数据结构的空闲存储器“页面”的指针的池来提供。池是存储器的一部分,它被细分为多个相同大小的页面,这些页面可被分配以供可增长数据结构使用。本文的增强功能可以为一个或多个此类池以及一个或多个此类可增长数据结构提供硬件或软件支持。每个可增长数据结构都包含来自选定池的页面。可从同一池中分配若干可增长数据结构,并且取决于用例、池页面大小或其他因素,若干其他可增长数据结构可被使得从不同池中分配。各种池管理实现在本文中被讨论,诸如环形缓冲区和比特阵列。但是,池管理器元件被包含在硬件实现中,缓冲区管理元件可从中分配页面以供数据结构使用,并从中分配空闲页面以供数据结构后续使用。池管理器不了解实际的页面使用情况,而是处置页面分配和取消分配。

可增长数据结构包括形成链接列表结构的存储器页面。相关联的指针被可增长数据结构用于在包括可增长数据结构的页面之间进行链接。缓冲区管理元件可实现此链接列表结构以跟踪可增长数据结构中的页面。例如,缓冲区管理元件可保留页面的前或后“n”个字节(诸如8个字节)以存储指向下一和/或上一页面的指针。替换地,链接列表指针可被实现在其他地方,这允许整个页面大小被用于数据,而不是为链接列表指针保留每个页面的一部分。有利地,本文中的增强的图形处理操作提供了处置和跟踪多个不同的可增长缓冲区数据结构的能力,这些数据结构可被动态地在不同的着色器元件或着色器线程之间分配。当需要在着色器或着色器线程之间分离缓冲区资源时,多个同时可增长缓冲区结构也可被实现。

首先转到可至少提供上述增强功能的系统和平台的示例,图1被提供。图1例示了在一实现中的图形处理环境100。环境100包括用户系统110、图形处理器120和系统处理器130。在操作中,系统处理器130可启动进入操作系统(os)以提供用户系统110的各种操作,包括用户应用、数据处理服务、通信服务、存储服务、游戏服务或计算系统的其他特征。图形处理器120可以为系统处理器130提供图形处理和渲染服务。图形处理器120还提供增强的操作,包括涉及包括着色器单元121、工作启动器122、纹理单元123以及其他元件的示例部分的操作。尽管图形处理器120在图1中被示为通过至少链路150与处理器130通信的单独元件,但是应当理解,其他示例可在系统处理器130中提供图形处理器120,诸如当系统处理器130集成了图形处理器120的元件时。

用户系统110包括计算系统或计算组件,诸如计算机、服务器、平板设备、膝上型计算机、智能电话、游戏系统、娱乐系统、存储系统或其他计算系统,包括其组合。用户系统110包括图1中详述的若干组件。如上文所提及的,这些组件包括图形处理器120和系统处理器130。图形处理器120和系统处理器130可以各自包括一个或多个集成元件,诸如处理器核、高速缓冲存储器、通信接口、图形核和北桥元件,以及为清楚起见未示出的其他集成元件。此外,用户系统110可以包括各种组装元件,诸如外壳元件、热管理元件、存储器元件、存储元件、通信接口、功率系统元件,以及为清楚起见未示出的其他元件。当图形处理器120和系统处理器130被安装在用户系统110中时,这些组装元件为系统处理器130的操作提供系统资源和上下文。显示器101可被包括在用户系统110中。

外壳元件可包括结构支持元件、壳体、底盘元件或容纳并在结构上支持用户系统110的另外的元件的其他元件。热管理元件可包括散热器、风扇、热管、热泵、制冷元件或用于管理和控制用户系统110的温度的其他元件。存储器元件可包括随机存取存储器(ram)、缓存存储器设备或系统处理器130或图形处理器120所采用的其他易失性存储器元件。存储元件包括非易失性存储器元件,诸如硬盘驱动器(hdd)、闪存存储器设备、固态驱动器(ssd)、或储存用于用户系统110的操作系统、应用或其他软件或固件的其他存储器设备。通信接口可以包括网络接口、外围接口、存储接口、音频/视频接口,或者将用户系统通信地耦合到外部系统和设备的其他接口。图形元素可包括显示界面、显示器、触摸屏、触摸界面、用户界面,等等。功率系统通常包括电压调节器电路系统、控制器电路系统、功率滤波元件、功率调节元件、功率转换元件、功率电子元件或其他功率处置和调节元件。功率系统元件从外部源(诸如从电池或外部功率源)接收功率,并且转换/调节功率来产生电压和电流以操作用户系统110的各元件。

用户系统110可通过一个或多个通信链路(诸如一个或多个网络链路)进行通信。示例通信链路可以使用金属、玻璃、光学、空气、空间或一些其他材料作为传输介质。示例通信链路可以使用各种通信接口和协议,诸如因特网协议(ip)、以太网、usb、thunderbolt(雷电)、bluetooth(蓝牙)、ieee802.11wifi、或其他通信信令或通信格式,包括其组合、改进或变体。通信链路可以是直接链路,或者可以包括中间网络、系统或设备,并且可以包括通过多个物理链路传输的逻辑网络链路。

用户系统110可以包括诸如操作系统、日志、数据库、实用程序、驱动程序、联网软件、用户应用、数据处理应用、游戏应用和存储在计算机可读介质上的其他软件之类的软件。用户系统110的软件可包括由分布式计算系统或云计算服务主控的一个或多个平台。用户系统110的软件可包括逻辑接口元件,诸如软件定义的接口和应用程序编程接口(api)。用户系统110的软件可被用于生成将被图形处理器120渲染的数据并控制图形处理器120的操作来渲染图形以便输出到一个或多个显示设备上。

图形处理器120、系统处理器130和系统存储器131可通过相关联的链路150-152进行通信。示例链路可以使用金属、玻璃、光学、空气、空间或一些其他材料作为传输介质。链路可使用各种通信协议和通信信令,诸如计算机总线,包括其组合或变体。链路可以是直接链路,或者可以包括中间网络、系统或设备,并且可以包括通过多个物理链路传输的逻辑网络链路。

系统存储器131通常包括随机接口存储器(ram)或动态ram、以及包含接口元件的其他组件的任何物理或虚拟分配。系统存储器131可在系统处理器130和图形处理器120之间被共享,或可被分区成供系统处理器130和图形处理器120中任一者独占。

图1例示了实现中的图形处理器120,其可以是包括一个或多个图形核的图形处理单元(gpu)的示例。图形处理器120可为经由链路150指示数据和指令的系统处理器提供图形处理和渲染服务,诸如图1中的系统处理器130。图形处理器120可包括一个或多个阶段或内部组件,其可将内容/数据处理成经渲染的图像以供显示。图形处理器120可根据配置与系统存储器131或专用图形存储器通信。尽管这些元件可以包括图1中121-125所示的元件,但应理解,其他配置也是可能的。

图1中的图形处理器120的示例元件包括着色器单元121、工作启动器122、纹理单元123和缓冲区服务125中的一者或多者。着色器单元121可包括一个或多个单指令多数据(simd)单元,而工作启动器122将指示simd开始运行着色器程序。着色器simd和工作启动器可以与缓冲区服务125通信。一个或多个纹理单元123(或其他形式的存储器接口)被包括,并且每个着色器simd通过纹理单元或存储器接口来请求存储器。缓冲区服务125可通过相关联的存储器接口与系统存储器131通信。尽管缓冲区服务125可包括图1中的硬件元件,但是在其他示例中,缓冲区服务125可使用一个或多个软件元件被实现。各个着色器程序在渲染过程期间确定颜色、阴影和强度信息,并在一些示例中包括像素阴影特征。着色器单元121可与纹理单元123通信以确定纹理区域的颜色/阴影,其可被称为纹理像素(texel)。一个或多个缓冲区管理器可被包括在缓冲区服务125中以提供本文讨论的许多增强的存储器和数据结构处置操作。

图2例示了操作数据缓冲区处置系统的示例方法200。图2的操作在图1的元素的上下文中被讨论。然而,图2的操作也可应用于图3-6的元件。在图2中,图形处理器120建立(201)可用存储器页面池以用于可增长数据结构,每个可用存储器页面由存储器指针跟踪。在一些示例中,缓冲服务125或相关联的池管理器元件可使用跟踪数据结构132来建立此可用存储器页面池。诸如缓冲区结构133之类的可增长数据结构可根据诸如gpu的着色器之类的数据处理元件的动态需求在大小方面被增大或减小。通常,使用指向预取或预分配以供后续使用的存储器页面的指针在相关联的跟踪数据结构132中跟踪可用存储器页面池。跟踪数据结构132除其他数据结构类型外还可以包括环形缓冲区结构。指向每个存储器页面的指针可因此被存储在跟踪数据结构132中。

缓冲区服务125可从诸如着色器单元121之类的数据处理元件接收(202)对着色器数据或其他相关联的数据被写入其中的缓冲区结构133中的空间的请求。缓冲区服务125根据请求中指示的数据大小提供(203)指向来自缓冲区结构133的存储器页面的指针。这些指针可被数据处理元件用于将着色器数据写入缓冲区结构133。

缓冲区服务125还跟踪写入缓冲区结构133的数据的量。各种阈值可被建立以监视何时增加或缩小缓冲区结构133。例如,当缓冲区结构133的阈值充盈量被达到(204)时,或者如果请求指示超过阈值量的写入大小,则缓冲区服务133可使用由跟踪结构132跟踪的可用存储器页面池中的存储器页面来增加缓冲区结构133的大小。缓冲区服务125可诸如从空闲页面列表中预取(205)存储器页面地址,以便从可用存储器页面池中包括在缓冲区结构133中。以此方式,存储器页面地址可提前准备好被用于缓冲区结构133中,并且缓冲区服务125可以以动态方式快速地响应着色器单元121的数据缓冲区需求。此外,当阈值量的数据已从缓冲区结构133中被移除时,诸如响应于各存储器页面之一中的着色器数据的消耗,缓冲区服务125可将存储器页面返回到可用存储器页面池中。为了将这些存储器页面返回到池中,缓冲区服务125可将指向那些存储器页面的指针重新引入到跟踪结构132中。

跟踪结构132的一些部分可能位于系统存储器131中(诸如本文讨论的空闲页面列表),但是许多其他部分可能位于缓冲区服务125中(例如fifo描述符),或者可能位于系统存储器131中但被缓存/预取在缓冲区服务125中(诸如空闲页面列表或链接列表指针)。另外,其他各种跟踪结构可被采用,并且通常将它们彼此区分开。首先,缓冲区跟踪结构可被建立,该缓冲区跟踪结构为每个缓冲区结构存储各种“阈值”。其次,空闲页面的跟踪列表可被建立。指向空闲页面列表的开头和结尾的指针的跟踪结构可被建立。同样,“链接列表”指针可位于相关联的缓冲区结构本身中,也可位于单独的结构中。每页“消耗的字节/元素”和“添加的字节/元素”计数器的跟踪结构可被建立,该跟踪结构可被嵌入缓冲区结构中每个页面的开头或结尾(在链接列表指针旁边),或者可被保存在单独的结构中。

图3例示了在一实现中的数据缓冲区处置系统和过程。在图3中,数据处理环境300包括图形处理单元(gpu)系统310、缓冲区管理服务301和存储器系统360。gpu系统310包括一个或多个gpu,这些gpu由主控处理器控制,并通过相关联的数据总线或数据链路(诸如pcie(高速外围组件互连)链路)耦合。此主控处理器(为清晰起见未在图3中显示)可能包含中央处理器(cpu)。gpu系统310通过一个或多个存储器总线380通信地耦合到存储器系统360。gpu系统310可以包括缓冲区管理服务301的元件,并且图3的所有元件可被集成到用于计算系统的单芯片设备、片上系统、gpu或插件卡等配置中。在一些示例中,gpu系统310包括包含缓冲区管理服务301的硬件处理元件。在其他示例中,gpu系统310包括包含缓冲区管理服务301的软件处理元件。

队列管理器320包括一个或多个软件/硬件过程或服务,该一个或多个软件/硬件过程或服务被配置成从诸如着色器311之类的数据处理元件接收对存储器页面的空间请求。队列管理器320经由指针向着色器311提供存储器页面地址以用于着色器操作或其他数据处理操作中。队列管理器320可提供动态量的缓冲区空间以供着色器311使用。此缓冲区空间可由数据结构361提供,该数据结构可根据着色器311的动态需求而增大或缩小。队列管理器320可与池管理器340通信以动态地调整相关联的数据结构361的大小并检索指向空闲页面的指针。

池管理器340包括一个或多个软件/硬件过程或服务,该软件/硬件过程或服务被配置成维护可被分配以供着色器311使用的存储器页面的一个或多个池362。池管理器340使用空闲页面列表341跟踪可用/空闲存储器页面。空闲页面列表341包括一个或多个数据结构,该一个或多个数据结构使用指向存储器页面的相关联指针来跟踪当前可用存储器页面。空闲页面列表341可驻留在系统存储器中,但是为了效率,空闲页面列表341的一部分可由(一个或多个)池管理器340预取。页面池362驻留在存储器系统360中,诸如在ram、gpu存储器、系统存储器、或其他相关联的存储器位置中。空闲页面可根据着色器311或gpu系统310的其他数据处理元件的当前存储器需求被添加到数据结构361中或从数据结构361中移除。当数据结构361中的可用空间的量下降到特定阈值以下时,则新页面363可被分配给数据结构361以期望相关联的着色器使用。可选地,当超过阈值量的空闲页面被分配到数据结构361中时,这些空闲页面可以作为释放页面364被返回或取消分配。这些经释放的页面可被返回到池362以供其他数据结构使用。

尽管池362在大小方面通常被预先确定,诸如~1吉字节(gb),但是如果数据结构361或其他数据结构使用比当前可用页面更多的来自池362的页面,则可在操作期间对池362作出调整。通常,池362可使用固定的虚拟地址范围,但是相关联的gpu存储器转换服务可基于当前需要被采用以从池362添加或删除物理页面。例如,如果池362几乎是空的,但是一些其他程序需要大量的物理存储器,则许多页面可从“空闲页面列表”中被删除,因此池管理器不会将这些页面交给队列管理器。受影响的页面可从页面表中被删除,以用于其他目的。“取消退回(un-back)”页面的请求通常由cpu生成,尽管工作启动器或着色器也可生成“取消退回”请求。

队列概述器330包括配置为监视缓冲区管理服务301的各元素的一个或多个软件/硬件过程或服务。这些被监视的元素可包括队列管理器320和池管理器340及其活动。队列概述器330还可监视池362、空闲页面列表341、空闲页面使用情况和数据结构361的状态。此状态可指示使用统计信息、充盈度、页面变动、页面分配、页面取消分配、页面池的大小/充盈度、空闲页面列表341中指示的空闲页面或其他状态。队列概述器330的一个示例功能是在一个或多个元素已被推入任何数据结构361中时通知工作启动器,因此工作启动器可启动将使用此数据的着色器。

现在转向图1和3的各元件的进一步详细操作,示出了图4。图4例示了在一实现中的另一示例数据缓冲区处置系统和过程。图4包括处理环境400。处理环境可包括中央处理单元(cpu)、图形处理单元(gpu)、或其他计算和数据处理系统的元素。例如,处理环境400包括数据处理410,该数据处理410进一步包括着色器启动调度器411、着色器处理单元412和控制器413。着色器启动调度器411、着色器处理单元412和控制器413可以包括相关联的gpu或cpu的元件。图4还包括一个或多个缓冲区管理元件,其包括堆栈/队列管理器(sqm)430、池管理器440、每页信息管理器450和队列概述器420。尽管在图4中仅显示了每个堆栈/队列和缓冲区管理元件的一个实例,但在进一步的示例中,多个实例可被包括并被用于专门指定的着色器元素或用于在许多着色器元素之间进行负载平衡。此外,尽管在图4中将可增长数据结构称为堆栈/队列,但是任何适当的数据结构类型可被采用,包括队列的各种子类型,诸如fifo之类。此外,本文的各示例还支持随机访问可增长结构或多用途队列(例如,写入一次,读取一次以上,然后释放;或写入一次,然后读取/修改/写入,然后再次读取)。

图4中包括的缓冲区管理元件负责与本文所述的用作缓冲区的一个或多个增强堆栈或队列对接,诸如存储器464中的示例缓冲池465。一个或多个着色器处理单元(spu)412,每个处理相关联的gpu着色器线程(通常采用单指令、多数据(simd)的方式)将经由一个或多个相关联的数据总线(即菊花链、分支、交叉线或其他方式)被连接到一个或多个sqm430,使得每个spu都可向每个sqm发送命令,并使得本文描述的任何给定堆栈/队列都可由一个对应的sqm排他地占有/管理。

对于由相关联的sqm430管理的每个堆栈/队列缓冲区,相关联的sqm在本地存储与可增长堆栈/队列的操作有关的信息/描述符432。sqm430包括足够的本地数据存储以包括用于多组堆栈/队列的信息/描述符。此信息可包括:

堆栈/队列中存储的每个元素的大小

堆栈/队列的大小

页面中允许的元素数量

堆栈/队列存储器中的基址

对于当前正被写入的页面——表示“当前写入指针”(wptr)的索引的指示

对于当前正被读取的页面——表示“当前读取指针”(rptr)的索引的指示

对于可增长缓冲区,此信息还可包括:

指向正被写入的当前页面的基址的指针

指向正被读取的当前页面的基址的指针

指向将要读取的下一页面的基址的指针

对当前写入页面中剩余供写入的空间量的指示

对当前读取页面中剩余元素数量的指示。

由sqm管理的这些堆栈/队列可具有特征或模式样式/类型的多个受支持的组合。示例样式/类型包括读取/写入样式/类型。这些读取/写入样式/类型可包括临时仅写入(temporarilywrite-only)为堆栈、临时仅读取(temporarilyread-only)为堆栈、临时仅读取为队列、临时仅读取为随机访问、读取写入(read-write)为堆栈、读取写入为队列、以及写入为队列但读取为随机访问。进一步的模式包括sqm是否直接将数据读取/写入到缓冲区(直接访问)、或者它是否只为着色器提供适当的仲裁和指导但允许着色器直接访问数据(间接访问)。在间接示例中,着色器处理单元412可使用间接推入/弹出命令经由链路(d-d)读取/写入元素466。更进一步的示例堆栈/队列模式可包括不可增长、可增长(手动释放的页面)和可增长(自动释放的页面)。

如上文提及的,取决于堆栈/队列操作是直接的还是间接的,着色器可将各种命令发送到sqm430以便与堆栈/队列对接。对于缓冲区的“直接”访问样式,sqm使用推入和弹出命令与堆栈/队列进行直接交互。推入命令包括着色器何时提供数据,相关联的sqm响应地为数据分配空间,相关联的sqm将数据写入存储器,以及相关联的sqm还可选地将指示数据在其处被写入的地址返回到着色器。弹出命令包括相关联的sqm何时检索并向着色器提供数据,以及如果没有数据可用,则提供错误指示。

对于缓冲区的“间接”访问方式,允许着色器将预期的操作通知给相关联的sqm的各种命令被包括。具体而言,push_alloc(推入_分配)、push_done(推入_完成)、pop_alloc(弹出_分配)和pop_done(弹出_完成)命令可被采用。在push_alloc命令中,着色器通知相关联的sqm着色器要在堆栈/队列中放置数据,并且相关联的sqm为着色器提供要写入的安全存储器地址。同样,对于push_alloc命令,相关联的sqm向适当的每页信息管理器通知空间已被分配。在push_done命令中,着色器通知相关联的每页信息管理器,着色器已完成将数据写入堆栈/队列,并因此数据可被安全地使用。在pop_alloc命令中,着色器通知相关联的sqm着色器要从堆栈/队列中检索数据,并且相关联的sqm提供地址以供读取或一些“空”指示符(诸如null指针)以指示没有数据剩余。同样,对于pop_alloc命令,相关联的sqm向适当的每页信息管理器通知空间已被分配。在pop_done命令中,着色器通知相关联的每页信息管理器,着色器已完成从堆栈/队列中读取数据。在涉及不可增长环形缓冲区的示例中,刚被读取的空间可被重新用于写入。附加地,进一步的命令可被用于随机访问可增长自动释放缓冲区。write_flush(写入刷新)命令可指示相关联的sqm将任何缓存的数据刷新到存储器read_done_for_autofree(读取_完成_待_自动释放)命令可向相关联的sqm指示着色器已完成读取给定页面上的一些数据。相关联的每页信息管理器将响应地计算页面上有多少未完成的读取,并在使用完毕后释放该页面。根据指令,sqm将从着色器接收数据或地址,并将返回“完成”指示符以供写入、数据以供读取或地址以用于“分配(alloc)”指令。

为了实现可增长缓冲区,多个sqm可与一个或多个共享的池管理器440进行通信。池管理器440跟踪空闲页面列表以供诸如数据处理410之类的硬件组件使用。池管理器440可被实现为在本文的示例中讨论的环形缓冲区,或者可替代地使用指示哪些页面空闲的比特阵列被实现。池环形缓冲区方法更加灵活,部分原因是环形缓冲区可支持具有任意非连续页面的任意大小的池。相反,虽然比特阵列比较容易实现,但是它是固定大小的,并且仅支持虚拟的连续页面。如果存在多个sqm,则池管理器440将通常被共享使得任何给定的池管理器可被所有sqm访问。池管理器440有效地实现特殊情况的读取/写入样式的直接、不可增长环形缓冲区,该缓冲区包含指向池中空闲页面的指针的列表。当sqm检测到可增长缓冲区将要溢出相关联页面时,sqm将向池管理器请求新页面。为了减少从特殊情况的池环形缓冲区中获取数据的延迟,环形缓冲区可被存储在池管理器本身中,或者自动预取缓存可被实现为池管理器的一部分,以预加载一系列可用的页面指针。自动预取缓存可被适当地调整大小以隐藏给定实现中的存储器延迟。

着色器单元可被配置成使用单指令、多数据(simd)样式的操作。通常,32个或更多个着色器线程在称为“wave(波)”、“wavefront(波前)”、“threadgroup(线程组)”或其他分组的组中一起处理数据并一起执行指令。由于此simd性质,“推入”和“弹出”指令可同时在32个或更多个线程上被执行。因此,例如,sqm可接收来自32个或更多个线程的带有数据的“推入”命令。也可与命令一起接收指示某些线程选择不参与指令的掩码。为了提高效率,sqm可实现一些操作,这些操作可原子地在堆栈/队列的当前页面上分配空间,在当前页面的空间耗尽的情况下为可增长缓冲区分配新页面,并为着色器simd中的多个线程写入数据(可能将一半的数据写入可增长缓冲区的一个页面并将另一半的数据写入可增长缓冲区的另一页面)。请求组合器431将来自给定波前或可能跨多个波前的请求合并为单个命令,该命令通过链路478/479传递到sqm或到页面原子451。

为了进一步描述将许多线程请求组合成单个请求,各种元素可检测到多个线程(诸如64个线程)都希望将数据推入到相同的可增长数据结构(诸如相同的堆栈/队列)。替换地,请求的子集可被定向到第一堆栈/队列,且另一子集被定向到第二堆栈/队列,并且一个以上的组合请求可被确定。然而,组合成单个请求的多个请求被用于请求数据可被推入到其中的空间(或类似地用于请求数据可被从中弹出的空间)。因此,sqm可接收对多个线程的缓冲区空间的单个组合请求。此过程可被称为请求组合、请求合并、请求分组以及其他类似术语,并且通常将来自一个线程组的各线程的请求组合为单个请求。如果请求指示的数据空间大于预定数量的存储器页面所能提供的数据空间(诸如两个或一些其他合适的阈值),则请求可被合并为对应数量的(即2个)合并请求,而非单个合并请求。在一些示例中,请求可跨着色器线程组或跨着色器单元被组合,诸如当这些请求空间位于同一可增长数据结构中时。请求组合可在各种元素中被执行,诸如在着色器程序、硬件着色器单元、交叉开关(crossbar)431或其他元件中。在另一示例中,请求组合可在协调/协作以使一个或多个指定线程针对多个不同线程发出组合请求的各线程之间进行协调。当交叉开关431被用于组合请求时,有利地,超过一个的着色器单元或线程组的各请求可被组合。

响应于组合请求,原子操作处理器433可将请求标识为组合的(或者非组合的,如果是这样配置的话),将请求拆分为单个空间请求以确定将被用于满足请求的页面之间的大小,并返回指向指示可增长数据结构中的推入或弹出位置的作出请求的线程的指针。当请求指示跨越页面边界的足够的空间时,原子操作处理器433可跨一个以上的页面拆分请求的空间以确保各个线程不必跨越页面边界。如上文所指示的,用于预定数量的最大页面的阈值可被建立,并且因此原子操作处理器433可拆分空间直到达到预定数量的最大页面。

当工作被写入堆栈/队列时,sqm可将消息发送或广播到队列概述器(qs)420。qs420可通过链路477从未完成写计数缓存模块434接收有关堆栈/队列466或缓冲区池465当前状态的消息。此外,着色器启动调度器411可向队列概述器420请求用于非空堆栈/队列的信息。着色器启动调度器411可然后将与堆栈/队列466或缓冲区池465的当前状态有关的结果提供给着色器启动调度器411。这些消息可指示堆栈/队列状态/属性,诸如“缓冲区已满”、“32个新条目已被添加到此队列”、“队列为空”、“页面已被分配”或“池中几乎没有空闲页”等消息。附加地,错误消息可被sqm430发送到qs420,诸如“在没有数据可用时弹出被执行”、“推入被执行但缓冲区空间耗尽”或“收到了push_done(推入_完成)/pop_done(弹出_完成),但非预计”等其他错误消息。

qs420可被编程为基于着色器线程或着色器元件之间的负载平衡考量为各种堆栈/队列分配优先级。此外,qs420可被编程为基于任务图中的顺序、基于在给定的池环形缓冲器中可用于要被处理的工作项目的数量、基于资源的可用性或基于其他考量,包括它们的组合,将优先级分配给各种堆栈/队列。qs420可内部地跟踪每个队列/堆栈的此信息。调度器411可以指示qs420找到sqm430拥有的具有要被处理的最紧急数据/工作的最高优先级堆栈/队列之一。基于准则,qs420可将与相应堆栈/队列有关的信息提供回调度器411,以便调度器可启动新的着色器线程组以处理来自此堆栈/队列的数据。qs420可对由其他过程发出的与堆栈/队列充盈度或堆栈/队列的其他状态/属性有关的查询进行响应。例如,如所提及的,进程可查询qs420以确定哪个堆栈/队列具有尚待服务或“工作”处理的最相关数据量,并且优先级可部分地基于特定堆栈/队列的此工作量来被确定。堆栈/队列可根据当前的充盈度来耗尽以有效地执行着色器操作的工作负载。qs420可使用诸如带有“空”、“1-31条目”、“32-1000条目”或“大于1000条目”的2比特指示符之类的各种指示符以及其他阈值和指示符来提供充盈度状态。

现在转到对图4的元件和操作的进一步讨论,一个或多个可增长数据结构被包括在图4中。具体而言,存储器464可包括堆栈/队列466a-466c,堆栈/队列466a-466c可各自保存与数据处理410的着色器元件的操作有关的数据。存储器元件460例示了在存储器464中存储和检索数据的存储器接口元件。存储器仲裁器462处置通过链路495与存储器464的各种数据输入/请求之间的仲裁。结果导向模块463处置通过链路496到图4的各个元件的存储器输出的传输。为了清楚起见,在图4中包括字母输入/输出节点,即节点a、b、c、d、m、n、p、x、y和z,其例示了相关联元件之间的互连。

sqm430与数据处理410的着色器元件和其他控制元件对接。在操作中,数据过程410可在链路471-472上发起命令和数据以供sqm430处置。在此之前,可能包括cpu或其他处理元素的控制器413可通过链路473向元件430、440和450发出一个或多个设置命令以初始化元件430、440和450、缓冲池465的硬件实例,堆栈/队列466的实例,指示堆栈/队列的基址或其他设置和控制指令。设置命令可向元件430、440和450指示多少堆栈/队列将存在于存储器中,以及池空闲页面列表的初始状态。在直接推入/弹出处置中,sqm430代表着色器元件处置与堆栈/队列466相关的这些命令。此外,sqm430负责基于栈/队列466中关于页面指针、读取/写入指针以及与堆栈/队列466相关的其他指针的数据活动来提供更新。sqm430可向队列概述器420提供关于堆栈/队列466或缓冲区池465的状态信息,以及元件430、440和450的其他状态信息。

命令仲裁器/交叉开关/请求组合器431充当数据处理410的前端接口。命令仲裁器/交叉开关功能可仲裁和传输由数据过程410发出的命令以供sqm430的选定元素通过选定链路478、479和480使用。这些命令可包括通过链路478获取堆栈/队列描述符的命令,通过链路479开始推入、弹出、直接推入或直接弹出操作的命令,以及通过链路480进行直接数据推入的命令/数据,以及其他命令。

元素431的请求组合器功能可包括组合对突发命令的多个请求。在写入或“推入”操作期间,请求组合器功能可包括增强功能以将针对多个线程组合、打包或“压缩”数据为单个写入操作。在另一示例中,多个着色器线程可请求用于读取或写入着色器数据的空间,并且可由请求组合器431将多个请求合并或组合为对一个或多个字节空间的单个请求。对该请求的响应(包括指向存储器页面的相关联指针并指示剩余的有效空间)可在被返回到着色器线程时由硬件或软件解打包,使得每个作出请求的着色器线程都接收到指向其可读取或写入的存储器的唯一指针。有利地,许多着色器线程空间请求可被同时处理。请求组合器功能可将来自多个线程的“弹出”请求打包在一起,因此元件432/433/435/436和/或元件451/452/453只需处置单个组合请求,而不是32个或更多个线程大小的请求。在读取或“弹出”操作期间,路径474或单元412可包括增强功能以分发、解打包或以其他方式“解压缩”在读取操作中组合的数据以确保为每个着色器线程被提供了相关数据以供处理。

堆栈/队列描述符模块432包括通过链路481向原子操作处理器433提供描述符、堆栈/队列466的“当前读取指针”(rptr)、堆栈/队列466的“当前写入指针”(wptr)等的功能。堆栈/队列描述符模块432还可通过链路483提供与指向未完成的写入计数缓存434的指针有关的信息。堆栈/队列描述符模块432通过链路482从原子操作处理器433接收对rptr、wptr、当前页面状态等的更新。原子操作处理器433处置sqm430的各个操作,诸如将数据推入/弹出命令放入堆栈/队列中。此外,原子操作处理器433更新可被提供给其他模块的rptr、wptr、当前页面状态、计数等。原子操作处理器433还可通过链路485将wptr完成增量和rptr分配增量提供给未完成的写入计数缓存434。原子操作处理器433还通过链路(p-p)向缓存管理器452发布用于写入分配指针和读取分配指针的更新命令。

来自原子操作处理器433的原子结果通过链路484被提供给地址生成器435。地址生成器435基于原子结果生成用于直接推入/弹出命令的地址,并将这些地址通过链路486传递到推入-弹出存储器请求模块436。此外,地址生成器435基于原子结果生成用于分配命令的地址,并且这些地址通过链路474被返回到数据处理410的着色器元素。通过链路486将用于直接推入/弹出命令的生成的地址提供给推入-弹出存储器请求模块436,其通过链路(a-a)在关于存储器仲裁器462的直接推入操作中使用这些地址。用于直接推送的数据通过链路480被接收,并且这些数据与地址和任何相关联的掩码结合在一起从而导致通过链路(a-a)对堆栈/队列466进行直接推送操作。直接弹出的数据或写入确认从结果导向模块463通过链路(x-x)被提供以通过链路474传递到着色器。

原子操作处理器433的“pushallocation(推入分配)”功能从要被写入的页面原子地分配存储器空间,检查该分配是否跨过边界(诸如填充满页面)。如果边界被跨过,则推送分配功能可分配新页面以便获得更多空间,这可包括与池管理器440通信以接收指向新页面的地址/指针。推入分配功能然后对写入指针进行更新,跟踪对页的未完成写入,并直接写入数据和/或将地址返回到数据可被安全写入的着色器“push_done(推入_完成)”和“pop_done(弹出_完成)”命令经由链路(n-n)被直接从请求组合器431发送到每页信息管理器451。每页信息管理器451递减每页未完成的写入计数。如果该计数达到零,则推入完成功能可通过链路(m-m)经由每页缓存管理器452更新“安全读取(safetoread)”指针(在此称为“writedone(写入完成)”指针)。推入完成功能然后更新可增长堆栈/队列中未被使用的数据的计数,并可选地发送指示堆栈/队列已更改状态的消息。原子操作处理器433的“弹出分配”功能从先前写入的数据中自动分配存储器空间,检查此分配是否跨过了页面的末尾,或者此分配是否跨过了已写入的存储器的末尾,然后更新读取指针,并每页递增一个未完成的读取计数器。弹出分配功能然后直接将数据返回和/或将地址(和指示有效性的信号)返回给获取数据的着色器。原子操作处理器433的“popdone(弹出完成)”功能经由每页缓存管理器452原子地减少对页面的未完成读取的计数,并且如果该计数达到零(并且该页面已被完全写入),则释放页面。页面空闲指示通过链路490被发送。

池管理器440处置与维护存储器页面池相关的各种操作以按需包含到堆栈/队列466。池管理器440使用诸如环形缓冲区之类的数据结构来跟踪池465中的空闲页面。池管理器440根据从其本地空闲页面列表缓存442中使用了多少条目的阈值,根据需要预取使用此数据结构的页面的地址。在一些情况下,诸如当堆栈/队列466中剩余太多空闲页面时,池管理器440也可被指示从堆栈/队列466中取消分配页面。在操作期间,原子操作处理器433与池管理模块441通信以处置堆栈/队列466的大小管理。原子操作处理器433通过链路487向池管理模块441发出命令以将可用页面池中的新页面分配到堆栈/队列466中。池管理模块441可指示空闲页面列表缓存442通过链路488将添加到堆栈/队列466中的这些新页面的地址发送给原子操作处理器433。空闲页面列表缓存442具有页面的地址,因为空闲页面列表缓存442从空闲页面列表中预取了那些地址。空闲页面列表缓存器442缓存空闲页面列表的一部分。在空闲页面列表缓存442中进行写入组合通常是在足够多的池页面被释放时使用的,这有利地将这些页面地址写回空闲页面列表,而不只是将那些页面地址保持被本地缓存在空闲页面列表缓存442中。池管理模块441通过链路489将推入/预取/弹出命令发布到空闲页面列表缓存442。空闲页面列表缓存442通过链路(b-b)和存储器仲裁器462发出页面指针预取请求以从存储器464中的空闲页面列表467中预取存储器页面指针以供后续包含到堆栈/队列466中。预取结果从结果导向模块463通过链路(y-y)被提供,并且该预取结果包括用于被预取的页面的地址指针信息。完整的空闲页面列表467被包括在存储器464中,且空闲页面列表缓存442包括列表467的一部分的缓存。缓存442被指示根据需要提取列表467的一部分。具体而言,池管理模块441指示缓存442通过链路488将一个或多个空闲页面列表条目(作为地址/指针)输出到模块433,或者由于请求通过链路490推入一些新释放的页面。池管理模块441跟踪空闲页面列表467的头部和尾部,跟踪在缓存中已被提取且尚未使用的条目的数量,并然后指示缓存442在有效缓存条目数量超过预定阈值时从空闲页面列表467预取更多条目。有利地,此操作提供专用于使用环形缓冲区的预取读取写入缓存。在附加的示例中,空闲页面列表467可被实现为堆栈。

每页信息管理器450主要借助于缓存管理器452来处置对堆栈/队列466中的实际存储器页面的管理。此管理可包括更新堆栈/队列466中的每页读取/写入数据指针、处置形成堆栈/队列466的链接列表指针、跟踪堆栈/队列466中每个页面的充盈度/状态以及在堆栈/队列466中使用的实际页面上的页面管理事务。页面管理事务可包括处置用于管理链接列表的信息,诸如读取/写入指针和充盈度/状态,其可根据实现被存储到页头或页尾或被存储到一些单独的缓冲区中。每页信息管理器450负责缓存此页面管理信息,将其存储到存储器中,并按需加载或预取它。每页信息管理器450还跟踪每页的未完成读取和写入,维护并遍历页面的链接列表(一个可增长堆栈/队列包括这些页面的一个链接列表),并在必要时释放页面。每页信息管理器450还可根据需要(诸如当缓存变满时)提取或逐出每页信息。页面原子模块451通过链路491提供与writedone(写入完成)指针何时完成页面相关的消息,并通过链路492从缓存管理器452接收各种其他消息。页面原子模块451还可从命令仲裁器431接收end_push(终止_推入)和end_pop(终止_弹出)命令。页面原子模块451接收这些end_push和end_pop命令以便跟踪多少数据元素已被完全写入或被完全读取。

缓存管理器452和页面原子模块451通过相关联的链路494和493与页头缓存存储器对接。页头缓存存储器453包括缓存行,该缓存行缓存与形成堆栈/队列466的页面有关的信息。页头缓存存储器453的每一缓存行可包括堆栈/队列466的对应页面的各种信息,诸如下一页的地址、上一页的地址、当前页面上未完成的读取的数目、当前页面上未完成的写入的数目、页上当前分配的写入指针、页面是否是当前“写入分配指针页面”的指示符、和页面是否是当前“写入已完成页面”的指示符以及页面是否是当前读取页面的指示符等其他信息。此信息可被存储在堆栈/队列466的各个页面的页头或页尾中(诸如下面图6中的元件601-603所示),或被存储在池中或其他位置的单独结构中。此信息可被缓存在页头缓存存储器453中以便由页面原子单元451更快/本地访问。通常,页头缓冲存储器453具有有限的大小,并且可能无法在其存储器中容纳与所有正在使用的页面有关的所有信息。因此,如有必要,诸如如果页头缓冲存储器453耗尽空间,页头缓冲存储器453可将相关联的数据存储到存储器464(到上面讨论的位置),并且从与不同页面相关联的存储器464获取类似的数据。页头缓冲存储器453的大小可以被调整得足够大以至于不需要经常这样做。链路(c-c)被采用以将数据写入堆栈/队列466的各个页面中以更新与堆栈/队列466相关的页头,或发出对与堆栈/队列466相关的页头信息的读取请求。链路(z-z)被采用以返回页头信息,并还指示何时页头信息已被完全写入。链路(m-m)被采用以向sqm430提供writedone(写入完成)指针更新消息。

页面原子模块451接收“push_done”和“pop_done”消息。每页信息管理器450还跟踪未完成的写入,并经由链路(m-m)将“write_done(写入_完成)”消息传递到431/432。在此上下文中,“未完成”是指由push_alloc分配但尚未由“push_done”指令标记为已完成的空间。缓存管理器452经由链路(p-p)被通知“push_alloc”操作。因为有许多着色器处理单元可能正在并发执行push_alloc/push_done指令,所以push_done指令可能相对于其对应的push_alloc以随机顺序返回。存在两个示例过程来处置此场景。

第一示例过程是用一比特跟踪每个页面的每个元素。在push_alloc上设置一个或多个比特,并在相应的push_done上清除那些一个或多个比特。“爬虫器”可在当前“push_done”和“push_alloc”指针之间遍历各比特,并在爬虫器找到已被清除的比特时更新“push_done”。但是,爬虫器方法在具有可增长数据结构的情况下性能有限,部分原因是特定页面可能包含十万个元素,因此每个元素存储一个比特将导致每页非常大的数据开销。

现在详细描述第二示例过程,该过程与可增长数据结构实现(诸如堆栈/队列466)配合良好。每个页面都有针对该页面内写入已完成的写入完成(write-done)指针,并且每个堆栈/队列都有写入完成指针,该指针通过对于最旧页面的写入完成指针的更新而被更新。第二示例维护未完成写入的计数(每页),以及未完成读取的另一计数。每当写计数达到0时,此页面的写入完成指针就被更新为指向此页面的写入分配指针。如果写入分配指针已移至另一页面,则写入完成指针被更新为指向当前页面的末尾。因此,每个页面都有“写入完成”指针和“写入分配”指针。缓存管理器452跟踪每个可增长数据结构,哪个页面是当前的“写入完成”页面,而哪个页面是当前的“写入分配”页面。如果页面是当前的“写入完成”页面,并且其写入完成指针被更新,则缓存管理器452通过链路(m-m)向sqm430发送消息以指示sqm430应更新对应堆栈/队列466的写入完成指针。当写入完成页面的写入完成指针到达页面的末尾(并且写入分配指针已经移动到新页面)时,缓存管理器452指示sqm430更新写入完成页面指针以指向新页面。缓存管理器452还向自身发送一条消息,指示缓存管理器452应检查新的写入完成页面,并查看相应的写入完成指针是否也应被转发给430。除了缓存管理器452可以可选地将读取完成指针发送到sqm430之外,读取完成指针以与写入完成指针类似的方式被管理。当读取完成指针越过页面边界时,页面原子模块451通过链路490将释放页面的消息发送给池管理模块441。

有利地,本文的各示例讨论了处置诸如图形处理器/gpu中的可增长数据结构(堆栈/队列)资源的各种增强方法。可增长数据结构可包括形成链接列表结构的存储器页面。缓冲区管理元件可实现链接列表结构以跟踪可增长数据结构中的页面。相关联的指针被可增长数据结构用于在包括可增长数据结构的页面之间进行链接。缓冲区管理元件可使用指向单独的空闲页面列表中的空闲存储器页面的指针,将存储器页面分配到链接列表结构中和从链接列表结构中取消分配存储器页面。本文中增强的图形处理操作提供了处置和跟踪多个不同可增长数据结构的能力,该数据结构可被动态地在不同着色器元件或着色器线程之间分配或读取。当需要在着色器或着色器线程之间分离数据结构资源时,多个同时可增长数据结构也可被实现。

图5例示了在一实现中的示例空闲页面列表/跟踪结构500。图5被呈现以例示作为环形缓冲区501的示例空闲页面列表结构。图5中的示例510、520和530是环形缓冲区501的“环形”结构的线性表示,其中每个示例缓冲区的右手侧环绕到相关联缓冲区的左手侧以形成“环形”结构。这些环形缓冲区可包含任何预定分配大小,诸如8千字节(kb),以及其他大小。这些环形缓冲区可驻留在主存储器中,诸如图4中的存储器464,或其他存储器位置,供此处讨论的缓冲区管理器、sqm或池管理器使用。在另外的示例中,空闲页面列表可被实现为池中的堆栈/队列,诸如堆栈/队列466的另一实例。空闲页面列表可驻留在池465中(作为单独的分配),或其可驻留在主存储器464中的其他位置。在又一示例中,空闲页面列表可驻留在其他地方,诸如完全位于片上缓存442中。除环形缓冲区外的其他数据结构也可被用于跟踪空闲页面列表,诸如比特阵列,其中索引n的每个比特表示索引n的页面是空闲还是正在使用。在比特阵列实现中,阵列将通常完全位于芯片上,并且比特阵列存储器将替换空闲页面列表缓存442。

图5中的环形示例可由图4的池管理器440采用以跟踪用于可增长数据结构中的空闲页面。随着更多数据需要被存储在可增长数据结构中,环形缓冲区将经由指向页面的指针(例如8字节指针)来指示空闲页面。在一些示例中,环形缓冲区可能包括1000个或更多个条目(即1000个8字节指针),但是对1000个条目的用法会随着页面被分配、使用并随后返回到空闲页面列表而变化。因此,空闲页面列表跟踪尚未被分配以供本文讨论的可增长数据结构(例如堆栈/队列)使用的页面。

池管理器440可从空闲页面列表467中预取指向页面的指针以供可增长数据结构使用,并将指向预取页面的指针(511、521、531)存储在环形缓冲区中。此预取可响应检测预取页面的阈值使用状态被执行,并响应于空闲页面列表缓存442中的剩余有效指针来预取更多页面。应当注意的是,空闲页面列表跟踪指向供堆栈/队列使用的空闲页面的指针。由于堆栈/队列包含页面的链接列表,并且这些页面可被用于增长堆栈/队列结构,因此使用各页面之间的指针将新页面链接到现有页面。当页面已被服务且数据已使用时,池管理器可将这些页面作为空闲页面返回到空闲页面列表中以供后续使用。

在初始状态期间,空闲页面列表可能最初与100兆字节(mb)的存储器相关联,该存储器被细分为表示100mb的子部分的“页面”。空闲页面列表将保存指向存储器中每个空闲页面的指针,以及包括指针的页面的存储器地址。页面可被分配以在可增长堆栈/队列中使用,并且一旦从相关联的页面中使用了数据,这些页面就可被返回到空闲页面列表。

当页面可用于堆栈/队列使用时,写入指针(514、524、534)将向前穿过环形缓冲区,并可能进行包封,如示例530所示。读取指针(513、523、533)将指示从何处读取新堆栈/队列空间(空闲页面)的指针,并在页面被分配给可增长堆栈/队列进行数据存储时前进。如图5的示例环形缓冲区所示,还可采用指向空闲页面的预取指针(511、521、531)。由于页面可被使用并按随机顺序返回到环形缓冲区,因此,保留在环形缓冲区中的针对空闲页面的指针可能随着时间的推移而变得“随机”,即使在初始化期间最初按顺序放置到环形缓冲区中也是如此。

在第一示例510中,环形缓冲区501具有所示的“几乎为空”状态。在第二示例520中,环形缓冲区501具有所示的“几乎为满”状态,其中环形缓冲区指示比示例510更多的可用页面。在第三示例530中,环形缓冲区501具有所示的“包封”状态,其具有针对围绕环形缓冲区的边界包封的可用页面的指针。

写入组合部分(512、522、532)还在示例环形缓冲区中被指示。在用于页面的指针被挂起以等待被推入环形缓冲区时,这些写入组合部分被用于有效地处理以供后续在堆栈/队列操作中重用。为了有效利用相关联的存储器总线将这些指针放回环形缓冲区,组合写入的突发可被建立。例如,如果每个指针由一个dword块表示,则这些单独的指针可能以第一“慢”速度从堆栈/队列中的服务中释放。但是,池管理器可能不想立即将每个dword写入存储器。通常,gpu到主存储器的存储器总线的宽度大于dword大小,因此立即并单独地写入dword会浪费存储器带宽。有利地,池管理器可将指向页面的指针缓冲到一个组中(作为写入组合数据),并然后在相关联的存储器总线上进行突发写入以填满整个相关联的存储器总线事务大小,或者缓冲直到一些阈值条件发起对写入组合数据的刷新。突发可能包含32个字节或更多个字节,因此4个或更多个dword大小的指针可被包含以便同时返回到环形缓冲区。

其他实现可在不使用环形缓冲区的情况下管理空闲页面列表。尽管环形缓冲区方法通常更灵活,但其他实现实现起来可能没那么复杂。在此示例中,池存储器必须是连续的并被细分为页面。池管理器然后每页存储一个比特:如果页面空闲则该比特被设置为“1”,如果页面正在使用则被设置为“0”。从空闲页面列表中“分配”页面涉及在比特阵列中找到一些非零比特,返回相应页面的地址,并然后将该比特清零。“释放”页面涉及再次设置相应的比特=1。与“push-alloc/push-done/pop-alloc/pop-done”指令和页缓存的实现相比,空闲页面列表的实现类型稍微不那么重要。尽管硬件仍应有一些形式的空闲页面列表实现以实现可增长数据结构特性。

图6例示了在一实现中的示例可增长数据结构。图6包括示例数据结构600,诸如本文所讨论的并且由池管理器和sqm提供的数据结构。sqm和其他相关联元件可提供增强的“间接”可增长数据结构,直接或间接不可增长数据结构(无论是否为池的一部分)以及直接可增长数据结构,以及其他操作和数据结构。

在图6中,第一页面“0”(610)包括未使用的数据631,其在根据读取指针621被读出之前由数据结构600保持。此未使用的数据已经被写入数据结构600中并且被写入确认,其中“写入完成(writedone)”指针622指示可被读取的最后一个“安全”或确认的元素。第二页“1”(611)包括进一步未消耗的数据以及“写入完成(writedone)”指针622,该指针指示添加到数据结构600的最后确认的写入数据的位置。(位于622和623之间的)部分632将被着色器单元无序写入。在页面1中包括附加的空间632,该空间已被分配用于写入当前正在被写入并且还不能被读出的数据。空间632被分配用于写入但是尚未被标记为写入完成。“旧分配写入指针”623指示用于新数据被写入数据结构600的位置。但是,页面1中的剩余空间633可能不足以容纳传入的写入。

数据结构600是可增长的,因此在为数据结构600初始分配空间之后,进一步的数据可被保留在数据结构600中。为了提供可增长功能,写入分配指针可被用于指向随着数据被写入数据结构而按需变得被分配的其他页面。在添加新页面“2”(612)之前,旧写入分配指针623被包含在页面1中,以指示填充有写入数据或已分配给数据结构600的传入写入数据的空间的结尾。响应于为数据结构600分配了存储器的附加页面612,写入分配指针可指向数据结构600中的“新”位置624,其指示数据结构600在扩展以保存更多数据之后的当前空间分配的结束。

数据结构600的增长可在写入数据结构600时被触发,该写入可能超过数据结构600中剩余可用空间或预定阈值量的剩余空间。例如,如果进一步的数据被确定为不能纳入图6中的页面1,则可从空闲页面列表和分配给此进一步的数据的相关联页面空间中请求指向新页面2的指针。数据结构600可被缩小或减小大小,并且数据被使用并且需要比先前更少的空间。例如,一旦读取指针621行进超过页面0,则页面0可被释放回到空闲页面列表。假设输入的新写入超出页面1的可用空间,则使用页面2将附加的空间被引入数据结构600,并且此空间在图6中由“新写入分配”633指示。在将页面2添加到数据结构600中之后,“新写入分配指针”624指示进一步的写入可被存储在何处。响应于数据结构600中数据的消耗,页面可从数据结构600中移除或取消分配并返回到空闲页面列表以供将来使用。通常,本文讨论的“池管理器”可使用空闲页面列表(诸如,图5中讨论的环形缓冲区501)来处置来自数据结构600的页面的分配和取消分配。

此外,图6中的每个页面0、1、2包括专用于有助于形成数据结构600的链接列表指针的相关联部分601、602和603。在此示例中,数据结构600数据结构包括页面的链接列表。链接列表指针允许将页面顺序链接到连续页面。页面的这种顺序链接形成数据结构600的结构,并且随着数据结构600的增长,可使用这些指针将附加页面链接到现有页面。使用包括在图5中讨论的空闲页面列表或“环形缓冲区”中的指针信息,指向(包括在部分601、602和603中的)页面的指针被按需(动态地)分配和取消分配。在一个示例中,页面的前或后“n”个字节(诸如8个字节)可被保留为部分601、602和603以存储指向下一页面和/或上一页面的指针。替换地,链接列表指针可在其他地方被实现,这允许将整个页面大小用于缓冲数据,而不是将每个页面的一部分保留为部分601、602和603。替换地,部分601-603可包含每页的未完成的读取和写入的计数(以及每页的写入分配指针),其可被用于帮助跟踪写入完成指针622,以及跟踪何时释放这些页面。被包括在部分601-603中的指针或其他信息可被缓存在图4中的页头缓存器453中。指针或其他信息通常仅在页头缓存453变满或由控制器413刷新时才被写入到存储器464中。

根据前述公开可以领会某些发明方面,以下是这些发明方面的各种示例。

示例1:一种在图形处理器中处置数据缓冲区资源的方法,该方法包括建立由存储器指针跟踪的可用存储器页面池以用于可增长数据结构中。该方法包括响应于图形处理器的至少着色器单元对可增长数据结构中用于写入着色器数据的空间的请求,根据请求中指示的数据大小,向着色器单元至少提供指向可增长数据结构中的存储器页面的位置的写入指针。该方法包括响应于超过可增长数据结构的阈值充盈度,从可用存储器页面池中分配至少一个进一步的存储器页面以包含在可增长数据结构中。

示例2:示例1的方法,进一步包括,响应该请求,处理数据大小以确定着色器数据是否能纳入可增长数据结构的当前页面。基于着色器数据无法纳入当前页面,该方法包括向着色器单元提供指示可增长数据结构中用于开始写入着色器数据的开始位置的第一指针,指示能被写入当前页面的着色器数据的量的计数信息,以及指示着色器数据能从当前页面扩展到其中的可增长数据结构中的至少一个进一步的页面的第二指针。

示例3:示例1-2的方法,进一步包括,接收来自着色器单元的写入完成消息,该写入完成消息指示被写入至少一个进一步的页面的数据的量,并且响应地更新指示数据的可用性的相应指针以用于将来的读取请求。

示例4:示例1-3的方法,进一步包括,响应于着色器单元指示在存储器页面中的一者或多者中使用了着色器数据,该方法包括将存储器页面中的一者或多者返回到可用存储器页面池中。

示例5:示例1-4的方法,进一步包括,使用包括在每个存储器页面中的一者或多者中的每一者的保留部分中的页面指针,在可增长数据结构中将存储器页面中的一者或多者彼此链接,其中页面指针各自指示在可增长数据结构中的至少下一页面。

示例6:示例1-5的方法,其中可用存储器页面池中的存储器指针使用至少一个环形缓冲区被跟踪,该环形缓冲区被配置成存储指向尚未包含在可增长数据结构中的可用存储器页面的指针。

示例7:示例1-6的方法,进一步包括,将写入指针保留在可增长数据结构中,该写入指针指示可增长数据结构内用于开始对着色器数据进行写入操作的位置,以及将读取指针保留在可增长数据结构中,该读取指针指示可增长数据结构内用于开始对着色器数据进行读取操作的位置。

示例8:示例1-7的方法,其中请求包括至少一个组合请求,该组合请求对针对着色器单元的至少一个线程组的多个着色器线程的请求进行分组。该方法还包括处理至少一个组合请求以确定用于写入可增长数据结构的所请求的空间量。至少基于所请求的空间量,该方法包括向着色器单元提供指示可增长数据结构中用于开始为多个着色器线程写入着色器数据的开始位置的开始指针,指示能被写入第一页面的着色器数据的量的计数信息,以及指示着色器数据能从第一页面扩展到其中的可增长数据结构中的至少一个进一步的页面的附加指针。

示例9:示例1的方法,进一步包括,通过被配置为至少指示可增长数据结构的充盈状态的概述器元件提供可增长数据结构的状态,其中用于可增长数据结构的进一步的数据操作的调度根据至少充盈状态来被确定。

示例10:一种数据缓冲区管理服务,包括:池管理器,该池管理器被配置成管理可用存储器页面池,该可用存储器页面池由存储器指针跟踪以在缓冲区数据结构中使用,以及缓冲区管理器,该缓冲区管理器被配置成接收由图形处理器的着色器单元发出的写入空间请求,并根据请求中指示的数据大小,响应地向着色器单元至少提供指向缓冲区数据结构的存储器页面中的位置的写入指针。池管理器进一步被配置成响应于超过缓冲区数据结构的阈值充盈度而分配至少一个进一步的存储器页面以包括在缓冲区数据结构中。

示例11:示例10的数据缓冲区管理服务,包括:缓冲区管理器被配置成处理由写入空间请求指示的数据大小,以确定相关联的着色器数据是否能纳入缓冲区数据结构的当前页面中。基于着色器数据大小超过当前页面中的可用空间,缓冲区管理器被配置成向着色器单元提供指示缓冲区数据结构中用于开始写入相关联的着色器数据的开始位置的第一指针,指示能被写入当前页面的相关联的着色器数据的量的计数信息,以及指示相关联的着色器数据能从当前页面扩展到其中的缓冲区数据结构中的至少一个进一步的页面的第二指针。

示例12:示例10-11的数据缓冲区管理服务,包括:缓冲区管理器被配置成接收来自着色器单元的写入完成消息,该写入完成消息指示写入至少一个进一步的页面的数据的量,并且响应地更新指示缓冲区数据结构中的开始位置的相应指针以用于将来的写入空间请求。

示例13:示例10-12的数据缓冲区管理服务,包括:池管理器被配置成响应于着色器单元指示在存储器页面中的一者或多者中使用了着色器数据,将存储器页面中的一者或多者返回到可用存储器页面池中。

示例14:示例10-13的数据缓冲区管理服务,包括:缓冲区管理器被配置成使用包括在每个存储器页面中的一者或多者中的每一者的保留部分中的页面指针,在缓冲区数据结构中将存储器页面中的一者或多者彼此链接,其中页面指针各自指示在缓冲区数据结构中的至少下一页面。

示例15:示例10-14的数据缓冲区管理服务,其中可用存储器页面池中的存储器指针使用至少一个环形缓冲区被跟踪,环形缓冲区被配置成存储指向尚未包含缓冲区数据结构中的可用存储器页面的指针。

示例16:示例10-15的数据缓冲区管理服务,包括:缓冲区管理器被配置成将写入指针保留在缓冲区数据结构中,该写入指针指示缓冲区数据结构内用于开始对着色器数据进行写入操作的位置,以及缓冲区管理器被配置成将读取指针保留在缓冲区数据结构中,该读取指针指示缓冲区数据结构内用于开始对着色器数据进行读取操作的位置。

示例17:示例10-16的数据缓冲区管理服务,其中:写入空间请求包括至少一个组合请求,该组合请求对针对着色器单元的至少一个线程组的多个着色器线程的请求进行分组。缓冲区管理器被配置成处理至少一个组合请求以确定用于写入可增长数据结构的所请求的空间量。至少基于所请求的空间量,该缓冲区管理器被配置成向着色器单元提供指示可增长数据结构中用于开始为多个着色器线程写入着色器数据的开始位置的开始指针,指示能被写入第一页面的着色器数据的量的计数信息,以及指示着色器数据能从第一页面扩展到其中的可增长数据结构中的至少一个进一步的页面的附加指针。

示例18:示例10-17的数据缓冲区管理服务,进一步包括:缓冲区概述器元件,该缓冲区概述器元件被配置成提供至少指示缓冲区数据结构的充盈状态的缓冲区数据结构的状态,其中用于缓冲区数据结构的进一步的数据操作的调度根据至少充盈状态来被确定。

示例19:一种图形处理装置,包括:着色器单元,该着色器单元被配置成处理着色器数据,以及缓冲区系统,该缓冲区系统被配置成接收来自着色器单元的数据处置请求,并响应地向着色器单元提供指向存储器页面的指针以开始在可增长数据结构内存储和检索着色器数据。缓冲区系统进一步被配置成响应于可增长数据结构的充盈度状态通过至少从跟踪用于可增长数据结构的存储器池中的空闲存储器页面的空闲页面列表获取指向附加存储器页面的指针,以及使用在至少附加存储器页面的保留部分中保存的指针在相关联的可增长数据结构中形成附加存储器页面与现有存储器页面之间的顺序链接来增加可增长数据结构的大小。

示例20:示例19的图形处理装置,包括:对于数据处置请求中的写入请求,该缓冲区系统进一步被配置成:向着色器单元提供指示可增长数据结构中用于开始写入相关联的着色器数据的开始位置的写入指针,指示能纳入与写入指针相对应的存储器页面的相关联的着色器数据的量的计数信息,以及指示相关联的着色器数据能被扩展到其中的至少一个附加页面的第二指针。

各附图中所提供的功能框图、操作场景及序列和流程图表示用于执行本公开的新颖方面的示例性系统、环境和方法。尽管出于解释简明的目的,本文中所包括的方法可以以功能图、操作场景或序列、或流程图形式示出并且可被描述为一系列动作,但是可以理解和领会,各方法不受这些动作的次序的限制,因为根据本发明,某些动作可以按与本文中所示出和描述的不同的次序和/或与其他动作并发地发生。例如,本领域的技术人员将明白并领会,方法可替换地被表示为一系列相互相关联的状态或事件,诸如以状态图的形式。此外,并非方法中所示出的所有动作都是新颖实现所必需的。

本文中所包括的说明和附图描绘了用于教导本领域的技术人员如何做出和使用最佳选项的特定实现。出于教导创造性原则的目的,一些传统的方面已被简化或忽略。本领域的技术人员将领会来自这些实现的变体也落入的本公开的范围内。本领域的技术人员还将领会以上所描述的各特征可以以各种方式被组合以形成多个实现。作为结果,本发明不局限于以上所描述的特定实现,而是仅由权利要求和它们的等价物来限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1