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

通过基于区域的依赖进行内核的高效多GPU执行的系统和方法与流程

2023-02-02 02:52:02 来源:中国专利 TAG:

通过基于区域的依赖进行内核的高效多gpu执行的系统和方法
技术领域
1.本公开涉及图形处理,并且更具体地涉及图形处理单元(gpu)上的内核计算。


背景技术:

2.近年来,在线服务不断推动,允许在云游戏服务器和通过网络连接的客户端之间以流式传输格式进行在线游戏或云游戏。由于按需提供游戏名称、执行更复杂游戏的能力、玩家之间联网以进行多玩家游戏的能力、玩家之间的资产共享、玩家和/或观众之间的即时体验共享、允许朋友观看朋友玩视频游戏、让朋友加入朋友正在进行的游戏进行等,流式传输格式越来越受欢迎。
3.云游戏服务器可以被配置为向一个或多个客户端和/或应用提供资源。也就是说,云游戏服务器可以配置有具有高吞吐量能力的资源。例如,单个图形处理单元(gpu)可以达到的性能是有限的,例如从对gpu可以有多大的限制中得出。为了在生成场景时渲染更复杂的场景或使用更复杂的算法(例如材质、照明等),可能需要使用多个gpu来渲染单个图像。
4.然而,这些gpu的同等使用是难以实现的。例如,在gpu之间均匀分配工作负载很困难,这会导致一些gpu在特定处理周期内比其他gpu更快地完成其工作负载。执行速度更快的gpu将等待(例如闲置)其他gpu完成处理它们各自的工作负载并将其结果复制到其他gpu,因为一个gpu生成的数据可能在下一个处理周期中被另一个gpu使用。此外,与经由高速总线与共享存储器连接的gpu相比,经由较低速总线连接的gpu具有明显的劣势。随着图像或缓冲区变大,副本的大小增加并成为瓶颈。由于这种低效率(例如等待来自其他gpu的副本、同步期间的空闲时间、增加的等待时间等),使用传统技术很难处理四倍的数据,即使可能有四倍该数量的gpu可用。例如,过去即使有多个gpu为应用处理图像,也无法支持对应增加的屏幕像素计数和几何图形密度(例如,四个gpu不能写入四倍的像素和/或处理图像的四倍顶点或图元)。
5.正是在这种背景下,出现了本公开的实施方案。


技术实现要素:

6.本公开的实施方案涉及使用多个gpu协作来处理数据或图像。
7.本公开的实施方案公开了一种用于图形处理的方法。所述方法包括:使用多个图形处理单元(gpu)来执行多个内核,其中执行对应的内核的责任被划分为一个或多个部分,每个部分被分配给对应的gpu。所述方法包括:在第一内核的第一多个部分中的每一个完成处理时,在第一内核处生成多个依赖数据。所述方法包括:在执行第二内核的一部分之前,检查来自第一内核的一个或多个部分的依赖数据。所述方法包括:只要没有满足第一内核的对应依赖数据,就延迟执行第二内核的所述部分。
8.本公开的其他实施方案公开了一种用于执行方法的非暂时性计算机可读介质。所述计算机可读介质包括:用于使用多个图形处理单元(gpu)来执行多个内核的程序指令,其
中执行对应的内核的责任被划分为一个或多个部分,每个部分被分配给对应的gpu。所述计算机可读介质包括:用于在第一内核的第一多个部分中的每一个完成处理时在第一内核处生成多个依赖数据的程序指令。所述计算机可读介质包括:用于在执行第二内核的一部分之前检查来自第一内核的一个或多个部分的依赖数据的程序指令。所述计算机可读介质包括:用于只要没有满足第一内核的对应依赖数据,就延迟执行第二内核的所述部分的程序指令。
9.本公开的另外的其他实施方案公开了一种计算机系统,其包括处理器和存储器,所述存储器耦合到处理器并且其中存储有指令,所述指令如果由计算机系统执行,则致使计算机系统执行方法。所述方法包括:使用多个图形处理单元(gpu)来执行多个内核,其中执行对应的内核的责任被划分为一个或多个部分,每个部分被分配给对应的gpu。所述方法包括:在第一内核的第一多个部分中的每一个完成处理时,在第一内核处生成多个依赖数据。所述方法包括:在执行第二内核的一部分之前,检查来自第一内核的一个或多个部分的依赖数据。所述方法包括:只要没有满足第一内核的对应依赖数据,就延迟执行第二内核的所述部分。
10.根据以下结合附图理解的具体实施方式,本公开的其他方面将变得显而易见,所述附图以示例的方式示出了本公开的原理。
附图说明
11.通过参考结合附图的以下描述,可以最好地理解本公开,在附图中:
12.图1是用于经网络在一个或多个云游戏服务器之间提供游戏的系统的示意图,所述一个或多个云游戏服务器被配置为实现多个gpu协作以渲染单个图像。
13.图2是根据本公开的一个实施方案的其中多个gpu协作以处理数据或图像的多gpu架构的示意图。
14.图3至图5图示了示出在不使用数据依赖时内核依赖和内核完成处理后的数据复制以及gpu低效的时间线。
15.图6图示了根据本公开的一个实施方案的n维中的内核调用,所述内核调用被划分为被分配给多个gpu以供执行的多个部分。
16.图7a图示了根据本公开的一个实施方案的分割成区域的图像资源。
17.图7b图示了根据本公开的一个实施方案的分割成区域的缓存区资源。
18.图8是图示根据本公开的一个实施方案的用于图形处理的方法中的步骤的流程图,所述方法包括使用多个gpu来处理内核。
19.图9图示了根据本公开的一个实施方案的用于跨多个gpu均匀地分布内核的部分的固定或静态分配方案。
20.图10是图示根据本公开的一个实施方案的用于图形处理的方法中的步骤的流程图,所述方法包括使用多个gpu来处理内核,其中进行每内核部分的依赖跟踪以允许对后续内核的依赖性部分进行早期处理。
21.图11a图示了根据本公开的一个实施方案的基于内核的一部分的依赖数据。
22.图11b图示了根据本公开的一个实施方案的基于内核的区域和部分的依赖数据。
23.图12a至图12d图示了根据本公开的实施方案由内核的一部分检查依赖数据,其为
所述部分的索引范围的函数。
24.图13a至图13c图示了根据本公开的实施方案的当内核的一部分的索引范围的函数在所定义的索引空间之外时用于寻址的各种策略。
25.图14a图示了根据本公开的一个实施方案的动态分配方案,其中当将内核的部分分配给gpu以供执行时,不同的gpu遵循不同的空间填充曲线。
26.图14b图示了根据本公开的一个实施方案的按照在定义在图14a中的gpu空间填充曲线中概述的分配次序来分配内核的部分。
27.图15是图示根据本公开的一个实施方案的用于图形处理的方法中的步骤的流程图,所述方法包括为应用进行图像的多gpu渲染,其中依赖数据可以基于内核处理和/或绘制调用执行。
28.图16图示了可用于执行本公开的各种实施方案的各个方面的示例性装置的部件。
具体实施方式
29.虽然出于说明目的,以下详细说明包含许多具体细节,但是本领域的普通技术人员将会了解,以下细节的许多变化和更改在本公开的范围内。因此,阐明以下所描述的本公开的各个方面,而本说明书的随附权利要求书的概括性没有任何损失,并且不对此权利要求书施加任何限制。
30.一般来讲,本公开的实施方案公开了用于执行内核的方法和系统,其中多个图形处理单元(gpu)进行协作以处理图像或数据。正被处理的内核被分割成多部分。在处理图像或缓冲区时,gpu被分配给内核的多部分,并在这些部分之间跟踪依赖数据,从而允许在内核之间使用细粒度、基于区域的依赖数据来跨gpu平衡工作负载。
31.借助对各种实施方案的上述一般理解,现在将参考各种附图来描述实施方案的示例性细节。
32.贯穿本说明书,对“应用”或“游戏”或“视频游戏”或“游戏应用”的引用意在表示通过执行输入命令来引导的任何类型的交互式应用。仅出于说明目的,交互式应用包括用于游戏、文字处理、视频处理、视频游戏处理等的应用。此外,上面介绍的术语是可互换的。
33.在整个说明书中,针对使用具有四个gpu的示例性架构为应用进行内核的多gpu处理来描述本公开的各种实施方案。然而,应当理解,在为应用生成图像和/或数据时,任何数量的gpu(例如,两个或更多个gpu)都可以进行协作。
34.图1是根据本公开的一个实施方案的用于在处理应用时执行内核的系统的示意图,其中多个图形处理单元(gpu)进行协作以处理图像或数据。在一个实施方案中,系统被配置为经网络在一个或多个云游戏服务器之间提供游戏。云游戏包括:在服务器处执行视频游戏以生成游戏渲染视频帧,然后将其发送到客户端以供显示。
35.虽然图1图示了在云游戏系统的一个或多个云游戏服务器之间实现内核的多gpu执行,但是本公开的其他实施方案提供在处理应用时执行内核,其中在独立系统(诸如,包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内,多个图形处理单元(gpu)进行协作以处理图像或数据。
36.还应理解,在各种实施方案中(例如,在云游戏环境中或在独立系统内),内核的多gpu执行可以使用物理gpu或虚拟gpu或两者的组合来执行。例如,虚拟机(例如,实例)可以
使用利用硬件层的一个或多个部件(诸如多个cpu、存储器模块、gpu、网络接口、通信部件等)的主机硬件(例如,位于数据中心)的管理程序创建。这些物理资源可以布置在机架中,诸如cpu机架、gpu机架、存储器机架等,其中机架中的物理资源可以使用架顶交换机访问,该架顶交换机促进用于组装和访问用于实例的部件的结构(例如,在构建实例的虚拟化部件时)。通常,管理程序可以呈现配置有虚拟资源的多个实例的多个客户操作系统。即,每个操作系统可以配置有由一个或多个硬件资源(例如,位于对应的数据中心)支持的对应的一组虚拟化资源。例如,每个操作系统可以由一个虚拟cpu、多个虚拟gpu、虚拟存储器、虚拟化通信部件等支持。此外,一个实例的配置可以从一个数据中心转移到另一个数据中心以减少等待时间。为用户或游戏定义的gpu利用率可以在保存用户的游戏会话时使用。gpu利用率可以包括本文所述的任何数量的配置,以优化游戏会话的视频帧的快速渲染。在一个实施方案中,为游戏或用户定义的gpu利用率可以作为可配置设置在数据中心之间传输。传输gpu利用率设置的能力可以在用户连接到不同地理位置玩游戏的情况下,有效地将游戏进行从数据中心迁移到数据中心。
37.根据本公开的一个实施方案,系统100经由云游戏网络190提供游戏,其中远离正在玩游戏的对应用户的客户端装置110(例如,瘦客户端)执行游戏。系统100可以经由网络150以单玩家或多玩家模式通过云游戏网络190向玩一个或多个游戏的一个或多个用户提供游戏控制。在一些实施方案中,云游戏网络190可以包括在主机的管理程序上运行的多个虚拟机(vm),其中一个或多个虚拟机被配置为利用对主机的管理程序可用的硬件资源来执行游戏处理器模块。网络150可包括一种或多种通信技术。在一些实施方案中,网络150可以包括具有先进无线通信系统的第五代(5g)网络技术。
38.在一些实施方案中,可使用无线技术来促进通信。此类技术可以包括例如5g无线通信技术。5g是第五代蜂窝网络技术。5g网络是数字蜂窝网络,其中提供商覆盖的服务区域被划分为称为小区的小地理区域。代表声音和图像的模拟信号在电话中被数字化、由模数转换器转换并作为比特流传输。通过从其他小区中重复使用的频率池中由收发器分配的频率信道,小区中的所有5g无线装置通过无线电波与小区中的本地天线阵列和小功率自动收发器(发射器和接收器)通信。本地天线通过高带宽光纤或无线回程连接与电话网络和互联网连接。与在其他小区网络中一样,从一个小区跨到另一小区的移动装置会自动转到新的小区。应当理解,5g网络只是通信网络的示例类型,并且本公开的实施方案可以利用更早一代的无线或有线通信,以及5g之后的更新一代的有线或无线技术。
39.如图所示,云游戏网络190包括提供对多个视频游戏的访问的游戏服务器160。游戏服务器160可以是云中可用的任何类型的服务器计算装置,并且可以被配置为在一个或多个主机上执行的一个或多个虚拟机。例如,游戏服务器160可管理支持为用户实例化游戏实例的游戏处理器的虚拟机。这样,与多个虚拟机相关联的游戏服务器160的多个游戏处理器被配置为执行与多个用户的游戏进行相关联的一个或多个游戏的多个实例。这样,后端服务器支持向多个对应用户提供多个游戏应用的游戏进行的媒体(例如,视频、音频等)的流式传输。也就是说,游戏服务器160被配置为通过网络150将数据(例如,对应游戏进行的渲染图像和/或帧)流式传输回对应客户端装置110。这样,计算上复杂的游戏应用可响应于由客户端装置110接收和转发的控制器输入而在后端服务器处执行。每个服务器能够渲染图像和/或帧,然后将其编码(例如,压缩)并流式传输到对应的客户端装置以供显示。
40.例如,多个用户可使用被配置用于接收流式传输媒体的对应客户端装置110经由通信网络150访问云游戏网络190。在一个实施方案中,客户端装置110可被配置为瘦客户端,所述瘦客户端提供与被配置用于提供计算功能性(例如,包括游戏名称处理引擎111)的后端服务器(例如,云游戏网络190)的介接。在另一实施方案中,客户端装置110可配置有用于视频游戏的至少一些本地处理的游戏名称处理引擎和游戏逻辑,并且还可被利用来接收由在后端服务器处执行的视频游戏生成的流式传输内容,或由后端服务器支持提供的其他内容。对于本地处理,游戏名称处理引擎包括用于执行视频游戏和与视频游戏相关联的服务的基于基本处理器的功能。在这种情况下,游戏逻辑可以存储在本地客户端装置110上并用于执行视频游戏。
41.每个客户端装置110可以请求访问来自云游戏网络的不同游戏。例如,云游戏网络190可以执行一个或多个游戏逻辑,这些逻辑建立在游戏名称处理引擎111上,如使用游戏服务器160的cpu资源163和gpu资源265执行的。例如,与游戏名称处理引擎111合作的游戏逻辑115a可以在用于一个客户端的游戏服务器160上执行,与游戏名称处理引擎111合作的游戏逻辑115b可以在用于第二客户端的游戏服务器160上执行,并且与游戏名称处理引擎111合作的游戏逻辑115n可以在用于第n客户端的游戏服务器160上执行。
42.特别地,对应用户(未示出)的客户端装置110被配置用于经诸如互联网的通信网络150请求访问游戏,并且用于渲染由游戏服务器160执行的视频游戏生成的显示图像,其中,编码图像被传送到客户端装置110以与对应用户相关联地显示。例如,用户可以通过客户端装置110与在游戏服务器160的游戏处理器上执行的视频游戏的实例进行交互。更具体地,视频游戏的实例由游戏名称处理引擎111执行。实现视频游戏的对应游戏逻辑(例如,可执行代码)115被存储并可通过数据存储区(未示出)访问,并用于执行视频游戏。游戏名称处理引擎111能够使用多个游戏逻辑(例如游戏应用)来支持多个视频游戏,每个游戏逻辑都可由用户选择。
43.例如,客户端装置110被配置为与和对应用户的游戏进行相关联的游戏名称处理引擎111交互,诸如通过用于驱动游戏进行的输入命令。特别地,客户端装置110可以接收来自各种类型的输入装置的输入,诸如游戏控制器、平板计算机、键盘、由摄像机捕获的手势、鼠标、触摸板等。客户端装置110可以是任何类型的至少具有存储器和能够经网络150连接到游戏服务器160的处理器模块的计算装置。后端游戏名称处理引擎111被配置用于生成渲染图像,该渲染图像通过网络150传送以在与客户端装置110相关联的对应显示器处显示。例如,通过基于云的服务,游戏渲染图像可以由在游戏服务器160的游戏执行引擎111上执行的对应游戏(例如游戏逻辑)的实例来传送。也就是说,客户端装置110被配置用于接收编码图像(例如,从通过执行视频游戏生成的游戏渲染图像编码),并且用于在显示器11上显示渲染的图像。在一个实施方案中,显示器11包括hmd(例如,显示vr内容)。在一些实施方案中,渲染图像可以以无线或有线方式、直接从基于云的服务或经由客户端装置110(例如remote play)流式传输到智能手机或平板电脑。
44.在一个实施方案中,游戏服务器160和/或游戏名称处理引擎111包括用于执行游戏和与游戏应用相关联的服务的基于基本处理器的功能。例如,游戏服务器160包括中央处理单元(cpu)资源163和图形处理单元(gpu)资源265,它们被配置用于执行基于处理器的功能,包括2d或3d渲染、物理模拟、脚本化、音频、动画、图形处理、照明、着色、光栅化、光线追
踪、阴影、剔除、变换、人工智能等。另外,cpu和gpu组可以实现用于游戏应用的服务,部分地包括存储器管理、多线程管理、服务质量(qos)、带宽测试、社交网络、社交好友管理、与朋友的社交网络通信、通信渠道、发短信、即时消息、聊天支持等。在一个实施方案中,一个或多个应用共享特定的gpu资源。在一个实施方案中,可以组合多个gpu装置来为在对应cpu上执行的单个应用执行图形处理。
45.在一个实施方案中,云游戏网络190是分布式游戏服务器系统和/或架构。特别地,执行游戏逻辑的分布式游戏引擎被配置为对应游戏的对应实例。通常,分布式游戏引擎采用游戏引擎的每个功能并将这些功能分布以供多个处理实体执行。单独的功能可以进一步分布在一个或多个处理实体上。处理实体可以被配置为不同的配置,包括物理硬件,和/或作为虚拟部件或虚拟机,和/或作为虚拟容器,其中容器不同于虚拟机,因为它虚拟化正在虚拟化操作系统上运行的游戏应用的实例。处理实体可以利用和/或依赖云游戏网络190的一个或多个服务器(计算节点)上的服务器及其底层硬件,其中服务器可以位于一个或多个机架上。对各种处理实体执行这些功能的协调、分配和管理由分布同步层执行。这样,这些功能的执行由分布同步层控制,以响应于玩家的控制器输入为游戏应用生成媒体(例如,视频帧、音频等)。分布同步层能够跨分布式处理实体有效地执行(例如,通过负载平衡)这些功能,以使得关键的游戏引擎部件/功能被分布和重新组装以进行更有效的处理。
46.图2是根据本公开的一个实施方案的其中多个gpu协作以生成对应应用的数据和/或渲染对应应用的单个图像的示例性多gpu架构200的示意图。应当理解,在本公开的各种实施方案中,许多架构是可能的,其中多个gpu协作以生成数据和/或渲染图像,尽管没有明确地描述或示出。例如,在处理图像和/或数据时多gpu协作以执行内核可以在云游戏系统的一个或多个云游戏服务器之间实现,或者可以在独立系统(诸如包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内实现,等等。
47.多gpu架构200包括cpu 163和多个gpu,其被配置用于为应用的单个图像和/或应用的图像序列中的每个图像进行多gpu渲染。特别地,cpu 163和gpu资源265被配置用于执行基于处理器的功能,包括2d或3d渲染、物理模拟、脚本化、音频、动画、图形处理、照明、着色、光栅化、光线追踪、阴影、剔除、变换、人工智能等,如前所述。
48.例如,在多gpu架构200的gpu资源265中示出了四个gpu,尽管在为应用生成数据或渲染图像时可以使用任意数量的gpu。每个gpu经由高速总线220连接到对应的专用存储器,诸如随机存取存储器(ram)。特别地,gpu-a经由总线220连接到存储器210a(例如,ram),gpu-b经由总线220连接到存储器210b(例如,ram),gpu-c经由总线220连接到存储器210c(例如,ram),和gpu-d经由总线220连接到存储器210d(例如,ram)。
49.此外,每个gpu经由总线240彼此连接,取决于架构,总线240在速度上可能大约等于或慢于用于对应gpu与其对应存储器之间的通信的总线220。例如,gpu-a经由总线240连接到gpu-b、gpu-c和gpu-d中的每一个。同样,gpu-b经由总线240连接到gpu-a、gpu-c和gpu-d中的每一个。此外,gpu-c经由总线240连接到gpu-a、gpu-b和gpu-d中的每一个。另外,gpu-d经由总线240连接到gpu-a、gpu-b和gpu-c中的每一个。
50.cpu 163经由较低速度的总线230连接到每个gpu(例如,总线230比用于对应gpu与其对应存储器之间的通信的总线220慢)。具体地,cpu 163连接到gpu-a、gpu-b、gpu-c和gpu-d中的每一个。
51.在一些实施方案中,四个gpu是分立的gpu,每个都在它们自己的硅片上。在其他实施方案中,四个gpu可以共享一个裸片,以便利用裸片上的高速互连和其他单元。在其他实施方案中,有一个物理gpu 250可以被配置为用作单个更强大的gpu或用作四个不太强大的“虚拟”gpu(gpu-a、gpu-b、gpu-c和gpu-d)。也就是说,gpu-a、gpu-b、gpu-c和gpu-d每个都有足够的功能来操作一个图形流水线(如图4所示),芯片作为一个整体可以操作一个图形流水线(如图4所示),并且配置可以在两种配置之间灵活切换(例如在渲染通过之间)。
52.图3至图5图示了在不使用依赖数据时当从一个gpu执行复制操作时具有经由较低速总线连接的专用存储器的gpu处于空闲状态或等待时间增加的可能场景。
53.特别地,图3图示了示出内核依赖和内核已完成处理之后的数据复制的时间线305,其中内核(也称为“计算内核”)是在gpu上执行的程序,其可以读取图像资源或缓冲区资源中的数据或将数据写入其中。例如,内核a生成并写入数据,然后内核b读取并使用该数据以供处理。内核a和内核b可以划分为由不同的gpu单独执行的工作组或部分。为了说明,内核a可以划分为多个部分,其中gpu a被分配内核a的一个或多个部分320a以供执行,而gpu b被分配内核a的一个或多个部分320b以供执行。此外,内核b可以划分为多个部分,其中gpu a被分配内核b的一个或多个部分340a以供执行,而gpu b被分配内核b的一个或多个部分340b以供执行。如此,内核a和内核b中的每一者可以由多于一个或多个gpu执行。
54.如图所示,内核b的一个或多个部分可依赖于来自内核a的一个或多个部分的数据。因此,需要执行复制操作330。特别地,如果期望高速访问内核a的结果,则因为内核b依赖于先前执行的内核a,所以在内核b可以开始在一个或多个gpu上执行之前,由内核a写入的存储器需要复制到所有其他gpu(例如gpu b)。也就是说,必须等待来自内核a的工作完成并在运行内核b之前被复制。例如,同步点310提供在复制操作330开始之前内核a的所有部分的完成。由于分配给gpu a和/或gpu b的部分之间可能存在不平衡的工作负载,因此在复制操作330开始之前,gpu a或gpu b(或gpu a或gpu b的一些执行单元)可能会在等待其他部分在同步点310处完成处理的同时处于空闲状态或未被充分利用。
55.此外,内核b的任何部分都不能开始,直到在同步点311处完成将由内核a写入的存储器复制到所有其他gpu,因为不知悉在内核a的执行期间满足了哪些依赖,并且不清楚内核b所需的依赖是否已得到满足。如图所示,内核a在gpu a或gpu b上的部分可以完成复制,且gpu a或gpu b处于空闲状态,直到在同步点311处内核a的所有部分完成了它们各自的复制操作330。
56.图4图示了示出内核依赖和在单独内核的执行期间内核已完成处理之后的对数据复制成本的隐藏的时间线405,其中内核是在gpu上执行的程序,其可以读取图像资源或缓冲区资源中的数据或将数据写入其中。例如,内核a生成并写入数据,然后内核c读取并使用该数据以供处理。可能还需要单独内核b。内核a、内核b和内核c可以各自被划分为由不同的gpu单独执行的工作组或部分。为了说明,内核a可以被划分为多个部分,其中gpu a被分配一个或多个部分420a以供执行,而gpu b被分配一个或多个部分420b以供执行。此外,内核b可以被划分为多个部分,其中gpu a被分配一个或多个部分440a以供执行,而gpu b被分配一个或多个部分440b以供执行。此外,内核c可以被划分为多个部分,其中gpu a被分配一个或多个部分450a以供执行,而gpu b被分配一个或多个部分450b以供执行。如此,内核a、内核b和内核c中的每一者可以由多于一个或多个gpu执行。
57.如图所示,内核c的一个或多个部分可依赖于来自内核a的一个或多个部分的数据。也就是说,内核a写入数据,然后内核c读取该数据,诸如在期望对内核a的结果进行高带宽访问的情况下。因此,需要执行复制操作430。特别地,因为内核c依赖于先前执行的内核a,所以在内核c可以开始在一个或多个gpu上执行之前,由内核a写入的存储器需要复制到所有其他gpu(例如gpu a和/或gpu b)。如前所述,复制由内核a写入的存储器可能存在成本,因为一些gpu可能处于空闲状态,等待内核a的所有部分完成,和/或内核c在复制操作430完成之前无法开始执行。
58.可存在通过连同另一单独操作执行复制操作430来隐藏复制操作430的成本的方式。例如,可以在内核b执行的同时执行复制操作430。如图所示,同步点410提供在复制操作430开始之前内核a的所有部分的完成。此外,由于分配给gpu a和/或gpu b的部分之间可能存在不平衡的工作负载,因此在复制操作430开始之前,gpu a或gpu b可能处于空闲状态,等待其他部分在同步点410处完成处理。在复制操作430期间,可以完成内核b在gpu a上执行的部分440a和内核b在gpu b上执行的部分440b。
59.内核c的任何部分都不能开始,直到在同步点411处完成将由内核a写入的存储器复制到所有其他gpu,因为不知悉在内核a的执行期间满足了哪些依赖,并且不清楚内核c所需的依赖是否已得到满足。如图所示,内核a在gpu a或gpu b上的部分可以完成复制并处于空闲状态,直到在同步点411处所有部分完成了它们各自的复制操作430。然而,即使复制的成本隐藏在执行内核b中,但也存在额外的成本。特别地,执行内核c的开始被增加等待时间,因为内核b必须在内核c开始执行之前在同步点411处执行到完成。
60.图5图示了示出跨多个gpu被均匀划分的内核的执行的时间线505,其中gpu之间的工作负载可以不同。如图所示,内核在四个gpu之间均匀划分,包括gpu a、gpu b、gpu c和gpu d。例如,内核可以在渲染图像时执行照明功能,并且内核可以按像素数量均匀划分。每个gpu接收内核的一部分以供执行并在沿时间线505的同步点510和520之间将结果复制到其他gpu,如先前在图3和图4中所述。如图所示,gpu a包括内核实例540a,其执行内核的独特部分,在此之后,执行复制操作545a以将结果复制到所有其他gpu。内核实例可以包括与对应部分中的自变量相关联的值,其中所述部分由内核的索引空间中的索引范围限定。此外,gpu b包括内核实例540b,其执行同一内核的独特部分,在此之后,执行复制操作545b以将结果复制到所有其他gpu。gpu c包括内核实例540c,其执行同一内核的独特部分,在此之后,执行复制操作545c以将结果复制到所有其他gpu。最后,gpu d包括内核实例540d,其执行同一内核的独特部分,在此之后,执行复制操作545d以将结果复制到所有其他gpu。
61.应用开发人员可以执行多个gpu的负载平衡,以尝试在所有gpu上执行均匀的工作负载,否则应用可能因工作负载不平衡而遭受一些性能损失。然而,跨所有gpu预测平衡的工作负载很困难,尤其是对于非同构gpu。例如,预先或由应用开发人员划分工作负载可能效率低下,因为由于输入不同,一些gpu上的一些工作负载可能需要更长的时间。在其中内核可以执行照明功能并按像素数量在gpu之间被均匀划分的示例之后,可能很难预测为每个像素或像素图块(例如图像缓冲区的一部分)执行的工作负载,因为对于不同的图块,可能存在不同的输入(例如,不同数量的灯、不同的着色模型等)。这可能导致内核的某些部分的计算时间更长。在等待一些gpu执行内核的部分完成并完成复制的同时,已完成执行内核的部分和复制结果的其他gpu处于空闲状态,等待所有复制操作完成。例如,gpu a、gpu b和
gpu d都处于空闲状态,等待gpu c完成其复制操作,其中gpu b在同步点510和520之间处于空闲状态的时间最长。
62.如图5所示,由于这些低效率(例如,等待来自所有gpu的副本的时间、同步期间的空闲时间以及增加的等待时间),与经由高速总线与共享存储器连接的gpu相比,经由较低速总线且各自与专用存储器连接的gpu可能处于明显劣势。随着图像资源或缓冲区资源变得更大,副本的大小和时间长度可能增加,从而导致效率更低,并且可能成为进一步的瓶颈。由于这些低效率并且在不使用本公开的实施方案的数据依赖的情况下,处理n倍的数据变得很困难,即使可能存在n倍该数量的gpu可用。
63.在本公开的实施方案中,可以实现gpu以执行计算着色器功能或图形着色器(例如,像素或顶点着色器)功能。例如,除了可以执行图形或非图形相关处理的内核调用之外,gpu可能还负责将对象渲染(例如写入颜色或其他数据)到一个图像或多个图像的像素。一个或多个命令缓冲区定义了供gpu执行的动作。例如,由gpu执行的动作可以包括:经由绘制命令以及渲染对象所需的状态信息来渲染对象。由gpu执行的另一动作可包括:经由内核调用命令以及执行内核所需的状态信息来进行内核调用。由gpu执行的其他动作可包括:用于等待绘制命令、或内核调用、或图形流水线或某一其他条件完成的同步命令。另外其他动作可包括:配置gpu(包括配置缓冲区或图像以供内核调用)、渲染目标(例如mrt)的位置和格式、扫描输出、深度测试状态等。
64.gpu执行命令,其中可以执行gpu以执行图形处理(例如渲染对象)或非图形功能(例如执行内核调用)。“命令”为数据,gpu读取所述数据并根据命令执行动作。“内核调用命令”是用于执行内核调用的特定命令。“绘制命令”是用于渲染对象的特定命令。
[0065]“命令缓冲区”是一个或多个命令的容器,其中gpu通过从对应的命令缓冲区读取命令来执行所述命令。特别地,gpu可以被配置为执行来自对应的命令缓冲区的命令。渲染对象和/或执行内核时执行的命令和/或操作可是有序的,使得命令和/或操作可能依赖于其他命令和/或操作(例如,一个命令缓冲区中的命令可能需要在该命令缓冲区中的其他命令可以执行之前完成执行)。此外,由一个gpu执行的命令和/或操作可依赖于由另一个gpu执行的其他命令和/或操作,使得它们由一个或多个gpu按顺序执行。在一个实施方案中,每个gpu可以具有其自己的命令缓冲区。替代地,gpu可以使用同一命令缓冲区或相同的一组命令缓冲区(例如,当每个gpu正在渲染基本上相同的一组对象时)。
[0066]
此外,命令缓冲区可被限定为在多gpu架构中的所有gpu或gpu子组上执行。在多gpu架构中,可能需要使用命令缓冲区中的命令在gpu之间以显式方式复制存储器。如将进一步描述的,本公开的实施方案不是经由命令缓冲区中的同步命令来同步gpu,而是通过使用依赖数据来使同步命令的使用最小化。此外,本公开的实施方案能够在多个gpu之间执行工作负载的静态和/或动态负载平衡。
[0067]
许多架构都是可能的,其中多个gpu协作以渲染图像或执行内核。例如,多gpu架构可以在云游戏系统的一个或多个云游戏服务器之间实现,或者在独立系统(诸如包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内实现。在一个实施方案中,多gpu架构的每个gpu能够经由高速总线访问共享存储器。在另一多gpu架构中,每个gpu可以具有经由高速总线访问的本地存储器,并且其中可以经由低速总线执行对其他gpu的存储器的访问,如先前在另一个实施方案的图2所示的架构中所描述。
[0068]
图6图示了根据本公开的一个实施方案的n维中的内核调用600。特别地,“索引空间”是用于内核调用600的n维空间,其中针对索引空间中的每个点或索引执行内核函数。仅出于说明的目的,内核调用600可以由包括9x8个索引的2维空间(x维和y维)表示。
[0069]
内核调用600的各部分被分配给多个gpu以供执行。如前所述,如由内核调用600执行的内核或计算内核是在gpu上执行的程序,所述程序可以读取或写入图像或缓冲区,其中内核可以包括自变量和/或与所使用的自变量相关联的值。所示的内核调用600可以基于对应的n维索引范围划分为多部分,其中每个部分可以是由内核使用的整个索引空间或在每个维度中的其子集。也就是说,“索引范围”定义了n维索引空间的一部分,其中一个或多个索引范围可用于将内核调用划分为多部分。如此,“部分”定义内核或内核调用600的一部分,其中每个部分可以是n维索引空间中的索引或索引范围。作为代表性示例,内核调用600沿二个维被分割成六个部分。内核调用600的每个部分包括12个索引,内核函数将在这些索引处被评估。例如,部分610包括索引(6,0)、(7,0)、(8,0)、(6,1)、(7,1)、(8,1)、(6,2)、(7,2)、(8,2)、(6,3)、(7,3)和(8,3)。内核的如由内核调用600执行的一个或多个部分可以与一些依赖数据相关联。
[0070]
内核的如由内核调用执行的一部分可以从“资源”的区域读取或向其写入,该“资源”可以是存储器资源。特别地,资源可以包括由内核使用的输入数据和输出数据。例如,资源可以是缓冲区资源或图像资源,并且可以是以多维配置的或被配置为立方体贴图。在一些实施方案中,资源可以按一个、或两个、或三个维来定义,或者可以按立方体贴图来定义。
[0071]“区域”是资源的一部分,并且与内核的一部分相关联。例如,区域可以定义与2维内核的如由对应的内核调用执行的一部分相对应的图像部位。在一个实施方案中,区域对应于资源的子集并且包括由内核使用的每个维,诸如图像资源的图块或缓冲区中的范围。例如,“图块”可以是定义图像部位的区域类型(例如,图像资源类型)。内核的对应部分的索引范围可用于确定要处理资源的哪个区域。
[0072]
为了说明的目的,图7a图示了被分割成二十四个区域的图像资源710。此外,图像资源710中的每个区域具有六十四个元素。例如,区域(2,2)的放大图像包括8x8或六十四个元素。同样为了说明的目的,图7b图示了被分割成四个区域的缓冲区资源720。此外,缓冲区资源720中的每个区域具有八个元素。例如,区域2的放大图像包括八个元素。
[0073]
借助先前在图1至图7中描述的多gpu架构及其实施方式的详细描述,图8的流程图800图示了根据本公开的一个实施方案的用于图形处理的方法,所述方法包括使用多个gpu来处理内核,其中多个gpu协作以处理图像或数据。如前所述,各种架构可以包括多个gpu,其进行协作以处理图像或数据,诸如在云游戏系统的一个或多个云游戏服务器内,或在独立系统(诸如包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内,等等。
[0074]
在810处,方法包括:使用多个gpu来执行多个内核,其中每个内核包括在多gpu架构上执行的程序,所述程序可以读取图像或缓冲区资源或向其进行写入。此外,内核调用被用于执行对应的内核,其中内核是在一个或多个gpu上执行的程序,所述程序可以读取图像或缓冲区资源中的数据或将数据写入其中。内核调用可以由索引空间定义,其中每个索引可以包括自变量和/或用于执行内核的对应部分的与自变量相关联的值,其中所述部分由索引空间中的索引范围定义。
[0075]
在820处,方法包括:将执行内核的责任划分为多个部分。可存在具有其他责任并
且不用于执行内核的一些gpu。
[0076]
在830,方法包括:向多个gpu分配多个部分,其中每个部分被分配给对应的gpu。特别地,内核调用可以被划分为多部分,其中所述多部分被分配给对应的gpu然后被执行。gpu同时执行。每个gpu可以共享命令缓冲区,或者具有不同的命令缓冲区(例如每个gpu具有一个或多个专用命令缓冲区),其中命令缓冲区可以包含内核调用命令以及其他命令(例如绘制调用命令等)。
[0077]
图9图示了根据本公开的一个实施方案的用于跨多个gpu均匀地分布内核910的部分以供执行的固定或静态分配方案。特别地,内核910的如由对应的内核调用执行的部分被均匀划分以在所有gpu上运行。如图所示,内核910的二维索引空间可以包括二十四个索引。内核910的均匀分布可以将等量的索引分配给四个gpu(例如gpu a、gpu b、gpu c和gpu d)中的每一个以供执行,使得六个索引被分配给每个gpu。例如,在固定分配方案中,gpu a可以被分配六个索引(0,0)、(1,0)、(2,0)、(0,1)、(1,1)和(2,1)。此外,gpu b可以被分配六个索引(3,0)、(4,0)、(5,0)、(3,1)、(4,1)和(5,1)。另外,gpu c可以被分配六个索引(0,2)、(1,2)、(2,2)、(0,3)、(1,3)和(2,3)。gpu d也可以被分配六个索引(3,2)、(4,2)、(5,2)、(3,3)、(4,3)和(5,3)。由于分配方案是固定的,并且每个部分的执行时间量可能不相等,这可能会导致gpu之间的工作负载不平衡。在本公开的其他实施方案中,可以使用依赖数据来实现动态分配方案,如下面将结合图10和图11a至图11b进一步描述的。
[0078]
借助先前在图1至图9中描述的多gpu架构及其实施方式的详细描述,图10的流程图1000图示了根据本公开的一个实施方案的用于图形处理的方法,所述方法包括使用多个gpu来处理内核,其中进行每内核部分或每区域每部分的依赖跟踪以允许对后续内核的依赖性部分进行早期处理,其中多个gpu进行协作以处理图像或数据。
[0079]
如前所述,各种架构可以包括多个gpu,其进行协作以处理图像或数据,诸如在云游戏系统的一个或多个云游戏服务器内,或在独立系统(诸如包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内,等等。gpu同时执行。在实施方案中,多个gpu可以共享一个命令缓冲区,或者每个gpu可以具有一个或多个专用命令缓冲区。命令缓冲区可以包含内核调用命令以及其他命令(诸如绘制调用命令)。
[0080]
在1010处,方法包括:使用多个图形处理单元(gpu)来执行多个内核。如前所述,每个内核包括在多gpu架构上执行的程序,所述程序可以从图像或缓冲区资源读取数据或将数据写入其中。此外,内核调用被用于执行对应的内核。内核调用可以由索引空间定义,其中每个索引可以包括自变量和/或用于执行内核的对应部分的与自变量相关联的值,其中所述部分由索引空间中的一个或多个索引范围定义。
[0081]
此外,执行对应内核的责任被划分为一个或多个部分,其中每个部分被分配给对应的gpu。即,正被处理的内核调用被分割成或划分为多部分。每个部分被分配给对应的gpu以供执行。如前所述,gpu在执行一个或多个内核中进行协作以处理图像或数据。此外,由内核读取的资源(例如存储器)可以被划分为一个或多个区域,其中一部分可以从一个或多个资源的一个或多个区域读取和/或对其进行写入。
[0082]
在1020处,方法包括:在第一内核的第一多个部分中的每一个完成处理时,在第一内核处生成多个依赖数据。即,依赖数据是在内核的对应部分完成处理时生成的,其中内核部分可以在内核部分完成执行之前(即,在内核部分的所有指令已完成执行之前)写入依赖
数据。依赖数据是可以由内核的每个部分生成的信息。例如,信息可以指示内核的对应部分的处理已经完成。又如,信息可以指示已由内核的对应部分向资源的区域进行写入。特别地,在内核的一部分完成向资源的区域写入之后,所述部分可以生成依赖数据,所述依赖数据包括所述部分对所述区域的写入已经完成和/或哪个gpu向该区域进行写入。这样,在处理图像或缓冲区资源的同时,gpu被分配内核的部分,并可在这些部分之间跟踪依赖数据,从而允许跨gpu平衡工作负载。此外,可以在内核之间生成和使用细粒度、基于区域的依赖数据。
[0083]
在1030处,方法包括:在执行第二内核的一部分之前,检查从第一内核的一个或多个部分生成的依赖数据。特别地,第二内核的后续执行部分将等待依赖数据以确保已经由第一内核向需要由第二内核的所述部分读取的一个或多个资源的每个区域进行完全写入。例如,由第一内核的一部分生成的依赖数据指示向资源的一个或多个区域的一次或多次写入的完成或者第一内核的所述部分的执行的完成。
[0084]
在一个实施方案中,一旦已经由gpu(例如,执行第一内核的一部分)向区域进行写入,写入的数据就被发送到其他gpu。在本公开的实施方案中,一旦已经由先前执行的第一内核(例如第一内核的另一部分)向第二内核的一部分所需的所有区域进行写入,就可以在没有等待第一内核的其他部分完成它们的复制操作的情况下并且不使用同步点进行复制的情况下开始执行第二内核的所述部分。
[0085]
在另一个实施方案中,gpu可以预取待执行的内核部分所需的资源区域。gpu信息(即依赖数据中哪个gpu向区域进行写入)可用于确定从哪个gpu读取数据。在一些情况下,区域数据很可能驻留在请求gpu的本地存储器中。
[0086]
在1040处,方法包括:只要没有满足第一内核的对应依赖数据,就延迟执行第二内核的所述部分。即,第二内核的所述部分使用依赖数据进行检查,以确保其所需要的所有区域都已被写入,在此之后,第二内核的所述部分可以开始处理。即,依赖数据指示内核的一部分是否可以访问所需区域。特别地,依赖数据可用于同步稍后的内核调用或内核(例如第二内核)的一部分的执行。
[0087]
图11a图示了根据本公开的一个实施方案的基于内核的一部分的依赖数据的生成。特别地,内核a和内核b各自被划分为三个相应的部分:部分0、部分1和部分2。资源0和资源1各自被划分为三个相应的区域:区域0、区域1和区域2。
[0088]
特别地,内核的一部分可以在其处理完成或向资源区域写入完成时生成依赖数据。例如,内核a的部分0可以生成基于部分的依赖数据,使得依赖数据仅在内核a的部分0完成后或在内核a的部分0完成向资源a和资源b的区域0进行写入时被写入。特别地,内核a的部分0沿路径1110向资源0的区域0进行写入,并且还沿路径1115向资源1的区域0进行写入。在完成其处理或向区域写入时,内核a的部分0还写入依赖数据dd0,如路径1120所指示。在一个实施方案中,依赖数据(例如,ddo、或dd1、或dd2)可以存储在任何阵列中。例如,依赖数据可以存储在索引范围中,其中每个维被移位一个量或除以一个量,并且结果值被用作进入阵列的索引。
[0089]
内核b的部分0依赖于来自资源0和资源1两者的数据,如依赖数据dd0所指示。特别地,内核b的部分0等待依赖数据dd0,然后在dd0被生成后,能够读取资源0的区域0,并读取资源1的区域0。即,内核b的部分0能够检查依赖数据ddo的状态,并且能够在dd0被生成和存
储时对其进行访问,如路径1125所指示。因为内核b的部分0可以确定其所有所需的资源区域都可以经由依赖数据进行访问,所以所述部分可以开始执行,而无需等待内核a的部分完成其处理和复制,且无需使用同步点(例如用于复制)。
[0090]
图11b图示了根据本公开的一个实施方案的基于资源的区域和内核的部分的依赖数据。特别地,内核a和内核b各自被划分为三个相应的部分:部分0、部分1和部分2。资源0和资源1各自被划分为三个相应的区域:区域0、区域1和区域2。
[0091]
依赖数据是每部分和资源的每个区域生成的。特别地,内核的一部分可以在完成向资源(例如资源的区域)的所有写入时生成依赖数据。例如,内核a的部分0沿路径1130向资源0的区域0进行写入。在完成向资源0的区域0的所有写入时,内核a的部分0可以生成依赖数据dd0,并沿路径1135将依赖数据dd0存储在依赖数据存储区0(例如阵列)中。另外,内核a的部分0沿路径1140向资源1的区域0进行写入。在完成向资源1的区域0的所有写入时,内核a的部分0可以生成依赖数据dd0,并沿路径1145将依赖数据ddo存储在依赖数据存储区1(例如阵列)中。
[0092]
内核b的部分0依赖于来自资源0和资源1的数据。图11b中生成的依赖数据可比图11中生成的依赖数据的粒度更细,因为依赖数据是每个部分和资源的每个区域生成的。特别地,内核b的部分0等待两组依赖数据,包括依赖数据存储区0的依赖数据dd0和依赖数据存储区1的依赖数据dd0。
[0093]
特别地,内核b的部分0等待依赖数据存储区0的依赖数据dd0,然后在dd0被生成之后,能够沿路径1150读取资源0的区域0。内核b的部分0能够检查数据存储区0的依赖数据dd0的状态,并且能够在该依赖数据dd0被生成和存储时对其进行访问,如路径1155所指示。此外,内核b的部分0等待依赖数据存储区1的依赖数据dd0,然后在dd0被生成之后,能够沿路径1160读取资源1的区域0。内核b的部分0能够检查数据存储区1的依赖数据dd0的状态,并且能够在该依赖数据dd0被生成和存储时对其进行访问,如路径1165所指示。
[0094]
因为内核b的部分0可以确定其所有所需的资源区域都可以经由依赖数据(依赖数据存储区0的dd0和依赖数据存储区1的dd0)进行访问,所以所述部分可以开始执行,而无需等待内核a的部分完成其处理和复制,且无需使用同步点(例如用于复制)。
[0095]
在另一个实施方案中,一旦内核的一部分已经完成向对应区域的写入,对应资源的区域数据就可以被推送到所有gpu(即,被发送到所有gpu的本地存储器)。在这种情况下,使用所述区域数据的后续内核可以等待数据到达它们的本地存储器。特别地,在第一内核的一部分在第一gpu上执行完成时,由第一内核在第一gpu处生成的数据被发送到第二gpu的本地存储器。
[0096]
如前所述,gpu可以预取待执行的内核部分所需的资源区域。即,可以在需要数据之前获取区域数据。特别地,一旦第一内核的一部分在第一gpu上执行已经完成向资源的区域的写入并生成对应的依赖数据,在第二gpu上执行的第二内核的一部分(其可能正在等待该依赖数据)然后就可以读取所述区域。第二gpu(执行第二内核的所述部分)知悉从哪个gpu读取存储器,因为所述信息可以是依赖数据的一部分。在一些实施方案中,高效预取使用后续部分的已知执行次序来确定那些部分所需的哪些资源区域是待复制的。
[0097]
在一个实施方案中,第二gpu可以直接从第一gpu的本地存储器读取区域数据,诸如经图2所示的较低速总线。在另一个实施方案中,第二gpu可以在执行第二内核的所述部
分之前将区域数据从第一gpu的本地存储器复制到第二gpu的本地存储器中。在这种情况下,第二内核的所述部分然后可以从其本地存储器读取区域数据。
[0098]
在又一个实施方案中,第二gpu利用上述的读取方法和复制方法两者来包括:直接从第一gpu的本地存储器读取区域数据;以及将所述区域数据从对应的本地存储器复制到第二gpu的本地存储器中。特别地,在开始执行第二内核的所述部分时,第二gpu开始将区域数据从第一gpu的本地存储器复制到第二gpu的本地存储器。例如,由第一gpu生成并写入到第一gpu的本地存储器的数据在完成直接存储器访问(dma)之前由第二gpu访问,其中通过正常的读取操作直接从第一gpu的本地存储器执行访问。在进行复制的同时,第二gpu直接从第一gpu的本地存储器读取区域数据。即,第二gpu可以通过执行从第一gpu的本地存储器的直接读取来开始对第二内核的其部分进行早期处理。例如,由在第一gpu上执行的第一内核生成并写入到第一gpu的本地存储器的数据经由dma被提取到执行第二内核的第二gpu的本地存储器中。在复制完成之前,第二gpu直接从第一gpu读取数据。在复制完成之后,第二gpu然后直接从第二gpu的本地存储器读取区域数据。例如,由第一gpu生成并写入到第一gpu的本地存储器的数据在完成dma之后由第二gpu从第二gpu的本地存储器访问。这样,仅读取执行第二内核的所述部分所需的区域,从而减少跨多gpu架构的带宽。
[0099]
在另一个实施方案中,若第二内核的部分的执行次序是已知的,则第二gpu可以使用该次序来预测第二内核的哪些部分可能接下来将被执行。这样,第二gpu可以预取第二内核的所述部分将在执行之前用作输入的一个或多个资源的对应区域。即,基于第二内核在第二gpu处的预定义或预测的次序,由在第一gpu上执行的第一内核生成的数据可以被预取到第二gpu的本地存储器中。这里假设已经生成针对那些区域的依赖数据,表明这些区域已经被写入。若区域数据已经存在于执行内核部分的gpu的本地存储器中,则该次序还可用于进行从本地存储器到更快的本地高速缓存存储器中的预取,从而进一步增加带宽和/或减少等待时间。
[0100]
在实施方案中,当内核的一部分检查对应的依赖数据时,所述部分可以使用各种策略来引用与其自身相关联(例如,在与内核调用相关联的对应索引空间中)以及与生成依赖数据的内核部分相关联的索引范围。例如,图12a至图12d代表性地图示了根据本公开的实施方案由内核的一部分检查依赖数据,其为所述部分的索引范围的某个函数。可以理解,任何函数都可以用于检查依赖数据。
[0101]
为清楚和简洁起见,图12a至图12d中的每一者示出了内核的每个部分具有单位大小的索引范围。此外,在图12a至图12d中的每一者中,内核a(未示出)向资源a的区域进行写入,并生成和存储相关联的依赖数据。内核b的具有索引范围(2,2)或(1,1)的部分a读取资源a并向资源b进行写入。用于检查依赖数据的四种不同策略在图12a至图12d中示出,内核b的部分a可以通过这些策略来检查依赖数据。
[0102]
特别地,其依赖数据在执行第二内核(例如内核b)的一部分之前被检查的第一内核(例如内核a)的一个或多个部分依赖于包括第二内核(例如内核b)的所述部分的针对每个维的索引范围。在一个实施方案中,检查与第一内核(例如内核a)的所述部分相关的依赖数据,其中所述部分包括与第二内核(例如内核b)的那些范围相对应的针对每个维的索引范围或其偏移。在另一个实施方案中,检查与第一内核(例如内核a)的多个部分相关的依赖数据,其中这些部分包括针对每个维的索引范围,这些索引范围合在一起是第二内核的针
对每个维的索引范围的超集。在又一个实施方案中,检查与第一内核(例如内核a)的部分相关的一个或多个依赖数据,其中一个或多个部分包括针对每个维的至少一个索引范围,其为使用第二内核(例如内核b)的索引范围来计算的函数。
[0103]
特别地,图12a图示了根据本公开的一个实施方案由内核b的部分a检查依赖数据,其对应于所述部分的索引范围(例如2,2)。例如,内核b的部分a与对应索引空间中的索引范围(2,2)相关联。此外,内核b的部分a向资源b的区域(2,2)进行写入,如图12a所示。在以下两者之间存在一对一的变换:资源a中由内核b的部分a从其进行读取或向其进行写入的区域;以及位于资源b中的向其写入所述相同数据或其某个函数的区域。即,资源b的接收输出数据的区域(2,2)与资源a的从其读取数据的区域(2,2)的位置相同。换句话说,区域索引(资源a的(2,2))和部分索引(内核b的(2,2))之间存在一对一的关系。
[0104]
图12b图示了根据本公开的一个实施方案由内核b的部分a检查依赖数据的多个片,其与索引范围相关联。特别地,检查与内核b的部分a的索引范围(2,2)或部分id中的一者的半径内的索引范围相对应的依赖数据。例如,内核b的部分a可以是滤波函数,其中读取和过滤围绕中心像素(例如,对应于资源a的与内核b的部分a的索引范围相关的区域(2,2))的多个区域,其中对资源b的区域(2,2)具有输出。即,滤波函数定义围绕内核b的部分a的索引范围(例如部分id)的采样区域。如图所示,从其读取数据的采样区域包括资源a的区域(1,1)、(2,1)、(3,1)、(1,2)、(2,2)、(3,2)、(1,3)、(2,3)和(3,3)。从所述函数生成的输出存储到资源b的区域(2,2)中。
[0105]
图12c图示了根据本公开的一个实施方案由内核b的部分a检查依赖数据,其为所述部分的索引范围的函数。特别地,基于内核b的部分a的索引范围(1,1)或部分id的函数检查依赖数据。在这种情况下,所述函数为将内核b的部分a的索引范围(1,1)加倍,并取其右下方向上的邻点。如图所示,从其采样和读取的区域包括资源a的区域(2,2)、(3,2)、(2,3)和(3,3)。从所述函数生成的输出存储到资源b的区域(1,1)中。即,所述函数表示降采样操作。
[0106]
图12d图示了根据本公开的一个实施方案由内核b的部分a检查依赖数据,其为所述部分的索引范围的函数,其中所述函数为对所述部分的索引范围的偏移。特别地,基于内核b的部分a的索引范围(2,2)或部分id的函数,检查依赖数据。在这种情况下,所述函数为将内核b的部分a的索引范围(2,2)在向上方向上偏移。如图所示,从其采样和读取的区域为资源a的区域(2,1)。从所述函数生成的输出存储到资源b的区域(2,2)中。
[0107]
使用内核的所述部分的索引范围的函数可能会导致索引超出定义的索引空间。在这些情况下,可以执行进一步的操作。特别地,图13a至图13c图示了根据本公开的实施方案的当内核的一部分的索引范围的函数在所定义的索引空间之外时用于寻址的各种策略。
[0108]
为清楚和简洁起见,图13a至图13c中的每一者示出了内核的具有单位大小的索引范围(例如“单位”索引范围)的每个部分。此外,在图13a至图13c中的每一者中,内核a向资源a的区域进行写入,并生成和存储相关联的依赖数据。内核b的具有索引范围(2,2)的部分a读取资源a并向资源b进行写入。针对第一内核的所述部分的索引范围(其在第一内核的索引空间之外)的不同策略在图13a至图13c中呈现。具体地,(-3,-1)的偏移被应用于单位索引范围(2,2),这导致产生单位索引范围(-1,1)(也在图13c中示出),其在第一维(例如,水平方向或x方向)中的索引空间之外。
[0109]
图13a图示了根据本公开的一个实施方案的当应用于内核b的部分a的索引范围的偏移(例如,函数)落在所定义的索引空间之外时对索引范围的一个维的箝位。偏移被变换为资源a中相似维的对应区域。特别地,若针对内核a的所述部分的偏移索引范围、超集索引范围或计算的索引范围在索引空间之外,则针对内核a的与索引范围(其在位于索引空间之外的维中被箝位到有效范围)相对应的一部分,检查由内核a生成的依赖数据,其中箝位确保所得的索引范围(0,1)在索引空间内。例如,索引范围在水平方向或x方向被箝位到其第一值0,以便针对资源a的区域(0,1),检查依赖数据。
[0110]
图13b图示了根据本公开的一个实施方案的当应用于内核b的一部分的索引范围的偏移(例如,函数)落在所定义的索引空间之外时索引范围在一个维中的卷绕。偏移被变换为资源a中相似维的对应区域。特别地,若针对内核a的所述部分的偏移索引范围、超集索引范围或计算的索引范围在索引空间之外,则针对内核a的与索引范围(其在位于索引空间之外的维中被卷绕到有效范围)相对应的一部分,检查由内核a生成的依赖数据。特别地,索引范围被卷绕到(5,1),其中卷绕确保所得的索引范围(5,1)在索引空间内。在一个实施方案中,所述值被选择为索引的无符号模数,其具有索引空间在所述方向上的大小。执行卷绕时,其他方法也适用。例如,索引范围在水平方向或x方向被卷绕到其最大值5,以便针对资源a的区域(5,1),检查依赖数据。
[0111]
图13c图示了根据本公开的一个实施方案的当应用于内核的一部分的索引范围的偏移(例如,函数)落在所定义的索引空间之外时对依赖数据的忽略。特别地,忽略由内核a生成的依赖数据。这样,内核b的所述部分可以决定不等待依赖数据,或决定不执行内核b的所述部分或以某种其他方式来对其进行处理。
[0112]
在一些实施方案中,为读取依赖数据的索引范围而执行的函数以及若结果在所定义的索引空间之外执行的动作对于每个资源以及对于每个内核可能是不同的。即,这些函数可以基于相关的资源和内核。
[0113]
图14a图示了根据本公开的一个实施方案的动态分配方案,其中当将内核的部分分配给多个gpu以供执行时,不同的gpu遵循不同的空间填充曲线。特别地,内核的部分被动态地分配给gpu,其中单个gpu被授予针对内核的独特部分的分配,使得每个部分都被分配给一个对应的gpu以供执行。如图所示,内核的二维索引空间1410可以包括二十四个索引。
[0114]
可以使用动态分配方案,其中当gpu变得能够执行内核的部分(例如,可供执行)时,这些部分被分配给gpu。执行内核的每个部分的责任被分配给一个且仅一个gpu,并且内核的部分在内核被执行时被动态地分配给gpu。即,内核的部分的分配可以参考对于每个gpu可能不同的预定义次序(例如空间填充曲线)。图14a表示一个或多个预定义次序或空间填充曲线,但应理解,其他次序对于其他访问模式可能更高效。特别地,对于每个gpu,次序可能不同,以便实现分配给每个gpu的部分的本地性。作为一个优势,即使在每个gpu使用不同的次序时,在同一gpu上对多个内核(例如连续地)使用相同的次序减少了从其他gpu的其他本地存储器获取数据的需要,因为数据可能因部分的本地性而驻留在所述gpu中。如图14a所示,尝试使用针对每个gpu的已知预定义次序来将内核的部分分配给对应的gpu。
[0115]
图14a示出了多个次序或空间填充曲线,每一者对应于一个gpu。例如,gpu a遵循空间填充曲线1420,其在索引空间1410的索引范围(0,1)处开始,以近似顺时针的方式检查索引范围,并在索引范围(0,2)处结束。为了说明的目的,空间填充曲线1420尝试按以下次
序分配内核的部分:(0,1),然后(0,0),然后(1,0),然后(1,1),然后(2,1)等。此外,gpu b遵循空间填充曲线1425,其在索引空间1410的索引范围(5,1)处开始,以近似逆时针的方式检查索引范围,并在索引范围(5,2)处结束。为了说明的目的,空间填充曲线1425尝试按以下次序分配内核的部分:(5,1),然后(5,0),然后(4,0),然后(4,1),然后(3,1)等。此外,gpu c遵循空间填充曲线1430,其在索引空间1410的索引范围(0,2)处开始,以近似逆时针的方式检查索引范围,并在索引范围(0,1)处结束。为了说明的目的,空间填充曲线1430尝试按以下次序分配内核的部分:(0,2),然后(0,3),然后(1,3),然后(1,2),然后(2,2)等。
[0116]
此外,gpu d遵循空间填充曲线1435,其在索引空间1410的索引范围(5,2)处开始,以近似顺时针的方式检查索引范围,并在索引范围(5,1)处结束。为了说明的目的,空间填充曲线1435尝试按以下次序分配内核的部分:(5,2),然后(5,3),然后(4,3),然后(4,2),然后(3,2)等。
[0117]
在一个实施方案中,当内核的一部分在连续传递的多个区域(其在缓冲区资源或图像资源中在空间上靠近在一起)中用作输入时,针对每个gpu的部分本地性优化的一个或多个空间填充曲线会减少从其他gpu的本地存储器获取数据的需要。特别地,在分配内核的部分时由对应的gpu参考的预定义次序可以是在内核或对应的内核调用的维内定义的空间填充曲线。
[0118]
在一个实施方案中,可以在多个gpu之间共享沿对应分配次序的进展(例如,空间填充曲线距起点的距离)。这种进展提供了一种高效的方式来检查内核的哪些部分已经尝试分配给每个gpu,使得gpu不需要尝试分配已经分配的部分。
[0119]
图14b图示了根据本公开的一个实施方案的按照在定义在图14a中的gpu空间填充曲线(例如,针对gpu a的曲线1420、针对gpu b的曲线1425、针对gpu c的曲线1430和针对gpu d的曲线1435)中概述的分配次序来分配内核的部分。每个gpu同时分配部分,诸如分步骤进行分配。因为空间填充曲线从不同的索引范围开始,所以每个gpu最初都被分配对应的内核的一部分以供执行。例如,在步骤1中,gpu a被分配索引空间1410的部分(0,1),gpu b被分配部分(5,1),gpu c被分配部分(0,2),并且gpu d被分配部分(5,2)。
[0120]
由于一些部分可能比其他部分花费更长的时间来完成(例如,取决于输入值等),一些gpu最终获得从索引空间1410分配的更多部分。例如,gpu c经步骤1到步骤3持续执行部分(0,2),并且在步骤2或步骤3中没有被分配任何附加部分,而gpu a、gpu b和gpu d中的每一者在步骤2和步骤3中的每个步骤中都被分配附加部分。
[0121]
在一些情况下,gpu能够分配多于一个部分。例如,在步骤4中,gpu a能够分配三个附加部分,包括部分(1,1)、(2,1)和(2,0)。此外,在步骤4中,gpu b能够分配两个附加部分,包括部分(4,1)和(3,1)。
[0122]
如图14b所示,每个gpu按本地性被分配部分,使得部分被彼此本地化。在一些情况下,gpu可能无法根据本地化需求进行分配。例如,在步骤5中,gpu b尝试分配两个部分(3,0)、(2,0)、(2,1)
……
,但是这些部分中的每一个都已由gpu a和/或gpu c分配。尚未按照空间填充曲线1425分配的对gpu b可用的第一部分为部分(1,2)。即,gpu b沿其预定义次序或空间填充曲线1425分配尚未分配给gpu的下一部分。
[0123]
借助先前在图1至图14中描述的多gpu架构及其实施方式的详细描述,图15的流程图1500图示了根据本公开的一个实施方案的用于图形处理的方法,所述方法包括为应用进
行图像的多gpu渲染,其中依赖数据可基于内核处理和/或绘制调用执行,其中多个gpu进行协作以处理图像或数据。如前所述,各种架构可以包括多个gpu,其进行协作以处理图像或数据,诸如在云游戏系统的一个或多个云游戏服务器内,或在独立系统(诸如包括具有多个gpu的高端显卡的个人计算机或游戏控制台)内,等等。gpu同时执行。在实施方案中,多个gpu可以共享一个或多个命令缓冲区,或者每个gpu可以具有一个或多个专用命令缓冲区。命令缓冲区可以包含内核调用命令以及其他命令,诸如绘制调用命令,或者内核调用命令和绘制调用命令两者的组合。
[0124]
在1510处,方法包括:使用多个图形处理单元(gpu)来渲染图像。例如,可以使用进行协作以生成图像和/或数据的多个gpu来为应用渲染图形。当为实时应用渲染单个图像和/或图像序列中的一个或多个图像中的每一个时,执行多gpu处理。
[0125]
在1520处,方法包括:在多个gpu上执行多个内核。执行对应的内核的责任被划分为一个或多个部分,其中每个部分被分配给对应的gpu。
[0126]
在1530处,方法包括:在多个gpu上执行多个绘制调用。执行对应的绘制调用的责任被划分为一个或多个部分,其中每个部分被分配给对应的gpu。特别地,当经由绘制命令渲染图像时,对应的绘制命令可以划分为多个部分(以类似于内核的调用被划分为多个部分的方式),其中每个部分被分配给gpu,使得每个部分被分配给仅一个gpu。如此,每个gpu对绘制调用的已分配给同一gpu的部分进行渲染。此外,绘制调用的每个部分可以生成依赖数据(例如,在绘制调用的所述部分完成时生成依赖数据)。
[0127]
在一个实施方案中,在绘制调用的部分和/或内核的部分之间可存在依赖检查。即,绘制调用的一部分依赖于内核的一个或多个部分,或者内核的一部分依赖于绘制调用的一个或多个部分。依赖数据可以由内核的一部分生成,或者可以由绘制调用的一部分生成。
[0128]
在1540处,方法(任选地)包括:在执行内核的一部分之前,在内核处检查绘制调用的一个或多个部分的依赖数据。特别地,内核的部分可以检查由绘制调用的部分生成的依赖数据,并采取适当的动作,例如暂停执行内核的对应部分,直到对应的绘制调用的部分已经完成。
[0129]
在1550处,方法(任选地)包括:在执行绘制调用的一部分之前,在绘制调用处检查内核的一个或多个部分的依赖数据。特别地,绘制调用的每个部分可以检查依赖数据(例如,不处理直到满足依赖),和/或生成依赖数据(在绘制调用的所述部分完成时生成依赖数据)。在一个实施方案中,绘制调用的部分可以检查由内核的部分生成的依赖数据,并采取适当的动作,例如暂停执行绘制命令的对应部分,直到对应的内核的部分已经完成。
[0130]
图16图示了可用于执行本公开的各种实施方案的各方面的示例性装置1600的部件。例如,图16图示了根据本公开的实施方案的适用于执行内核的示例性硬件系统,其中多个图形处理单元(gpu)进行协作以处理图像或数据。该框图示出了装置1600,所述装置可并入或可能是个人计算机、服务器计算机、游戏控制台、移动装置或其他数字装置,它们中的每个适合于实践本发明的实施方案。装置1600包括用于运行软件应用和可选地操作系统的中央处理单元(cpu)1602。cpu 1602可包括一个或多个同构或异构处理核心。
[0131]
根据各种实施方案中,cpu 1602是具有一个或多个处理核心的一个或多个通用微处理器。另外的实施方案可使用一个或多个cpu来实现,所述一个或多个cpu具有特别适用
于诸如媒体和交互式娱乐应用等高度平行和计算密集的应用的微处理器架构,所述应用被配置用于游戏的执行期间的图形处理。
[0132]
存储器1604存储应用和数据供由cpu 1602和gpu 1616使用。存储装置1606为应用和数据提供非易失性存储装置和其他计算机可读介质并且可以包括固定磁盘驱动器、可移除磁盘驱动器、快闪存储器装置和cd-rom、dvd-rom、蓝光光碟、hd-dvd或其他光学存储装置,以及信号传输和存储介质。用户输入装置1608将用户输入从一个或多个用户传达到装置1600,所述装置的示例可包括键盘、鼠标、操纵杆、触摸板、触摸屏、静态或视频记录器/相机和/或传声器。网络接口1609允许装置1600经由电子通信网络与其他计算机系统通信,并且可包括在局域网和诸如互联网的广域网上的有线或无线通信。音频处理器1612适于从由cpu 1602、存储器1604和/或存储装置1606提供的指令和/或数据生成模拟或数字音频输出。装置1600的部件(包括cpu 1602、包括gpu 1616的图形子系统、存储器1604、数据存储装置1606、用户输入装置1608、网络接口1609和音频处理器1612)经由一根或多根数据总线1622连接。
[0133]
图形子系统1614还与数据总线1622和装置1600的部件连接。图形子系统1614包括至少一个图形处理单元(gpu)1616和图形存储器1618。图形存储器1618包括显示存储器(例如帧缓冲区),所述显示存储器用于存储输出图像的每个像素的像素数据。图形存储器1618可以集成在与gpu 1616相同的装置中、作为单独的装置与gpu1616连接和/或实现在存储器1604内。像素数据可以直接从cpu 1602提供到图形存储器1618。替代地,cpu 1602向gpu 1616提供定义期望输出图像的数据和/或指令,gpu 1616根据所述数据和/或指令生成一个或多个输出图像的像素数据。定义期望输出图像的数据和/或指令可以存储在存储器1604和/或图形存储器1618中。在实施方案中,gpu 1616包括3d渲染能力,用于根据定义场景的几何形状、照明、着色、纹理化、动作和/或相机参数的指令和数据生成输出图像的像素数据。gpu 1616还可包括能够执行着色器程序的一个或多个可编程执行单元。
[0134]
图形子系统1614周期性地从图形存储器1618输出图像的像素数据,以在显示装置1610上显示或由投影系统(未示出)进行投影。显示装置1610可以是能够响应于来自装置1600的信号来显示视觉信息的任何装置,包括crt、lcd、等离子体和oled显示器。装置1600可以向显示装置1610提供例如模拟或数字信号。
[0135]
优化图形子系统1614的其他实施方案可以包括使用多个gpu来处理内核,其中进行每个内核部分的依赖跟踪以允许对后续内核的依赖性部分进行早期处理,其中多个gpu进行协作以处理图像或数据。图形子系统1614可被配置为一个或多个处理装置。
[0136]
例如,在一个实施方案中,图形子系统1614可被配置为通过在渲染的同时进行区域测试来为应用执行几何图形的多gpu渲染,其中多个图形子系统可为单个应用实现图形和/或渲染流水线。也就是说,图形子系统1614包括多个gpu,用于在执行应用时渲染图像或图像序列中的一个或多个图像中的每一个。
[0137]
在其他实施方案中,图形子系统1614包括多个gpu装置,它们被组合以为在对应的cpu上执行的单个应用执行图形处理。例如,多个gpu可以在渲染图像的对象时通过区域测试为应用执行几何图形的多gpu渲染。在其他示例中,多个gpu可执行交替形式的帧渲染,其中以顺序的帧周期,gpu 1渲染第一帧,并且gpu 2渲染第二帧,依此类推,直到到达最后一个gpu为止,于是初始gpu渲染下一个视频帧(例如,如果只有两个gpu,则gpu 1渲染第三
帧)。那就是渲染帧时gpu旋转。渲染操作可重叠,其中gpu 2可在gpu1完成渲染第一帧之前开始渲染第二帧。在另一实施方式中,可以在渲染和/或图形流水线中为多个gpu装置分配不同的着色器操作。主gpu正在执行主渲染和合成。例如,在包括三个gpu的组中,主gpu 1可以执行主渲染(例如,第一着色器操作)和合成来自从属gpu 2和从属gpu 3的输出,其中从属gpu 2可以执行第二着色器(例如流体效果,诸如河流)操作,从属gpu 3可以执行第三着色器(例如粒子烟雾)操作,其中主gpu 1合成来自gpu 1、gpu 2和gpu 3中的每一个的结果。这样,可以分配不同的gpu来执行不同的着色器操作(例如挥旗、风、烟雾生成、火等)以渲染视频帧。在又一个实施方案中,三个gpu中的每一个都可以分配给对应于视频帧的不同的对象和/或场景部分。在以上实施方案和实施方式中,可在同一帧周期(同时并行)或在不同帧周期(顺序并行)中执行这些操作。
[0138]
因此,本公开描述了被配置用于在执行应用时为图像或图像序列中的一个或多个图像中的每一个渲染对象的同时通过区域测试为应用进行几何图形的多gpu渲染的方法和系统。
[0139]
应理解,可使用本文公开的各种特征将本文定义的各种实施方案组合或组装成具体的实施方式。因此,所提供的示例只是一些可能的示例,而不限于通过组合各种元素来定义更多的实施方式而可能的各种实施方式。在一些示例中,一些实施方式可以包括更少的元素,而不背离所公开的或等效实施方式的精神。
[0140]
本公开的实施方案可以用包括手持式装置、微处理器系统、基于微处理器的或可编程的消费电子产品、小型计算机、大型计算机等的各种计算机系统配置来实践。还可以在分布式计算环境中实践本公开的实施方案,在所述分布式计算环境中,通过基于有线或无线网络链接的远程处理装置执行任务。
[0141]
考虑到以上实施方案,应理解,本公开的实施方案可以采用涉及存储在计算机系统中的数据的各种计算机实现的操作。这些操作是需要对物理量的物理操纵的那些操作。本文描述的形成本公开的实施方案的一部分的任何操作都是有用的机器操作。本公开的实施方案还涉及用于执行这些操作的装置或设备。可以针对所需目的专门构造所述设备,或者所述设备可以是由存储在计算机中的计算机程序选择性地激活或配置的通用计算机。具体地,各种通用机器可以与根据本文的教导编写的计算机程序一起使用,或者构造更专门的设备来执行所需的操作可能更方便。
[0142]
本公开还可以实施为计算机可读介质上的计算机可读代码。计算机可读介质是可以存储数据的任何数据存储装置,该数据随后可以由计算机系统读取。计算机可读介质的示例包括硬盘驱动器、网络附接存储装置(nas)、只读存储器、随机存取存储器、cd-rom、cd-r、cd-rw、磁带以及其他光学和非光学数据存储装置。所述计算机可读介质可以包括分布在网络耦合的计算机系统上的计算机可读有形介质,使得以分布式方式存储和执行计算机可读代码。
[0143]
尽管以具体的顺序描述了方法操作,但应理解,可在操作之间执行其他内务操作,或者可以调整操作,使得它们在略微不同的时间发生,或者可以分布在允许以与处理相关联的各种间隔发生处理操作的系统中,只要覆盖操作的处理以期望的方式执行即可。
[0144]
虽然出于清楚理解的目的相当详细地描述了前述公开内容,但显而易见的是,可在所附权利要求的范围内实践某些改变和修改。因此,本发明的实施方案被认为是说明性
的而非限制性的,并且本公开的实施方案不限于本文给出的细节,而可以在所附权利要求的范围和等效物内进行修改。
再多了解一些

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

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

相关文献