CN113454592A - 存储器管理系统 - Google Patents
存储器管理系统 Download PDFInfo
- Publication number
- CN113454592A CN113454592A CN202080015024.8A CN202080015024A CN113454592A CN 113454592 A CN113454592 A CN 113454592A CN 202080015024 A CN202080015024 A CN 202080015024A CN 113454592 A CN113454592 A CN 113454592A
- Authority
- CN
- China
- Prior art keywords
- memory
- data
- computer
- program
- computer program
- 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.)
- Pending
Links
Images
Classifications
-
- 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/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0608—Saving storage space on storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0629—Configuration or reconfiguration of storage systems
- G06F3/0631—Configuration or reconfiguration of storage systems by allocating resources to storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/067—Distributed or networked storage systems, e.g. storage area networks [SAN], network attached storage [NAS]
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
-
- 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/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
-
- 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/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
-
- 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/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
- G06F2212/1044—Space efficiency improvement
Abstract
计算机系统使用依赖关系树来管理存储器到应用程序的分配。依赖关系树通知存储器管理器与应用程序的执行相关联的数据输入、数据输出和中间值。存储器管理器将单个堆结构分配在物理存储器内。与依赖关系树的每个节点相关联的数据被分配给堆结构,使得将数据输入值分配在连续块中,以及单独分配中间值。在不同示例中,随着应用程序的执行继续进行,堆内的中间值与非中间值的分离减少了存储器碎片化,这提供了计算机系统作为整体的改进的性能。
Description
相关申请的交叉引用
本申请要求于2019年2月19日提交的名称为“存储器管理系统(MEMORYMANAGEMENT SYSTEM)”的美国专利申请No.16/279,884的优先权,其公开内容通过引用全文并入本文。
背景技术
在许多计算系统中,数据被存储在可寻址块存储器(memory)中。数据可以包括变量,字符串,整数,浮点数或与特定程序、进程、线程、过程调用或函数相关联的任意数据。一些数据可以是静态数据,因为数据的持续时间在其所属的应用的寿命期间是持久的。其他数据本质上可以是暂态的。例如,当函数被调用时可以创建在函数的体中使用的变量,并且当函数完成时删除该变量。在另一示例中,一条数据可由该应用存储在所分配的存储器的部分中,并随后在该应用不再需要该条数据时被删除。一些应用数据的暂态性质通常导致存储器被分配给暂态数据的存储,并且然后当不再需要日期时重新分配相同的存储器。在线性地址空间中,这可以产生存储器碎片化的模式,其中以非连续的方式将存储器的所分配部分与存储器的空闲部分散布。
当为较大数据对象分配存储器时,这种碎片化可能导致问题。例如,如果存储器中的现有分配被充分分成碎片,则尽管具有足够空闲存储器的总量,但由于缺乏足以存储对象的单个连续块,分配存储器以存储大数据对象可能是不可能的。因此,设计避免存储器碎片化的方式是增强计算系统的操作的重要问题。
附图说明
将参考附图描述各种技术,其中:
图1示出了在一个实施例中的具有图形处理单元的计算机系统的示例;
图2示出了在一个实施例中的计算机程序的示例,其中计算机程序的部分运行图形处理单元;
图3示出了在一个实施例中的表示能够在图形处理单元上评估的表达式的树结构的示例;
图4示出了在一个实施例中的用于计算机程序的主存储器和图形存储器之间的映射的示例;
图5示出了在一个实施例中的将个体程序数据映射到图形存储器的区域内的存储器位置的查找表的示例;
图6示出了在一个实施例中的由于由计算机系统执行而分配图形处理单元内的图形存储器以供应用程序使用的过程的示例;
图7示出了在一个实施例中的作为由计算机系统执行的结果生成表示由计算机程序使用的数据之间的关系的树的过程的示例;
图8示出了在一个实施例中的由于由计算机系统执行而将应用数据映射到所分配的GPU内的存储器块的过程的第一部分的示例;
图9示出了在一个实施例中由于由计算机系统执行而将应用数据映射到所分配的GPU内的存储器块的过程的第二部分的示例;
图10示出了根据一个实施例的并行处理单元(“PPU”)的示例;
图11示出了根据一个实施例的通用处理集群(“GPC”)的示例;
图12示出了根据一个实施例的存储器分区单元的示例;
图13示出了根据一个实施例的流式多处理器的示例;以及
图14示出了根据一个实施例的其中可以实现各个示例的计算机系统。
具体实施方式
本文描述了一种用于计算机系统的图形处理单元(“GPU”)的存储器(memory)管理方案。在一个实施例中,计算机系统分配图形处理单元内的存储器以供GPU托管的程序使用。在一个实施例中,计算机系统分析GPU托管的程序以识别通过生成树结构由程序所使用的程序输入、输出以及中间值,其中所述树结构的叶节点表示所述程序使用的输入值,树结构的根节点表示程序的输出,树的中间节点表示程序使用的暂态或临时变量。在一个实施例中,GPU托管的程序可以是要由GPU评估的表达式,或者以提供诸如Java、Scala、Python、Haskell或Pascal之类的托管存储器(managed memory)功能的语言编写的程序。
在一个实施例中,计算机系统通过进行连续GPU存储器的单个分配来为GPU托管的程序分配存储器,该连续GPU存储器的大小至少部分地基于树结构中的信息来确定。在一个实施例中,通过添加与树结构的每个节点相关联的变量的大小来确定存储器分配的大小。在一个实施例中,通过维护具有与所分配的存储器块的开始相对应的相应变量的相对地址的表来确定每个程序变量的位置。
在一个实施例中,至少部分地基于每个变量的预测寿命将程序变量分配给相对块内的位置。在一个实施例中,被确定为在程序的整个寿命期间持久的变量在GPU上的所分配的存储器的连续区域中被分组在一起。在一个实施例中,持久变量包括由树结构的叶节点表示的对程序的输入。在一个实施例中,在所分配的GPU存储器块的开始处,将与树结构的叶节点相关联的变量分配给存储器的连续块。在一个实施例中,树结构的根节点表示程序的输出,并且程序的输出被存储在具有输入变量的连续块中的存储器中。在一个实施例中,树结构的中间节点表示在程序的执行期间使用的暂态值和变量。在一个实施例中,由树结构的内部节点表示的变量和值被分配在GPU存储器块的剩余部分中和从中解除分配,并且通常不需要与输入值或输出值连续地存储。
在一个实施例中,在此描述的系统和方法用于提供对相互依赖存储器区域的有效管理。在各个实施例中,用计算机语言(诸如Java、Scala、Python、Haskell)编写程序,该计算机语言依赖于运行时组件,该运行时组件自动地分配和解除分配存储器空间,其中存储器空间被分配给程序变量,而无需源代码中的明确存储器管理命令。在一个实施例中,通过管理在物理上分离并且通常具有较少存储容量的存储器的单独区域,该机制被扩展到GPU上的存储器。在一个实施例中,使用允许计算机系统将相互依赖的存储器区域透明地集成到使用托管存储器的现有语言中的技术,在GPU上实现这些和其他类似的语言。在一个实施例中,解决方案存在于用户空间中,并且不需要对底层编程语言进行修改。在一个实施例中,该技术允许系统在GPU上维护取决于中央处理单元(“CPU”)上的主存储器区域的存储器区域,在其中变量被自动地分配和解除分配。在一个实施例中,该托管存储器可以用于实现对GPU上的编程语言(如Java、Python或Scala)的支持。然而,其他实施例可以在其他类型的设备或处理器上实现。
在一个实施例中,存储器是托管堆(managed heap)的一部分,该托管堆是分配给程序以供使用的连续存储器的区域。在一个实施例中,程序通过将相对于堆的起始地址的偏移分配给每个变量来将存储器从堆分配给特定变量。在一个实施例中,系统通过将变量的分配的偏移添加到基本值(通常是堆的起始地址)来解析变量的位置(基本+偏移寻址模式)。在一个实施例中,使用查找表跟踪变量到堆中的特定位置的分配,该查找表允许系统确定变量和变量的所分配存储之间的映射。在一个实施例中,程序维护用来确定哪些变量仍在使用中的引用计数。在一个实施例中,从存储器中解除分配不再使用的变量。在一个实施例中,通过使用相对寻址,系统能够容易地将存储器分配(程序堆)重新定位在较大存储器区域内。在一个实施例中,跟踪堆中分配的和/或未分配的存储器的总量。
在一个实施例中,当主托管存储器区域的存储器管理器对依存存储器区域中的存储器解除分配时,依存存储器区域中的存储器被自动地解除分配。在一个实施例中,如果请求太大而不适合堆上剩余的空白空间的分配,则系统运行碎片整理算法,所述碎片整理算法将有效分配重新分配到连续区域中——将多个较小的空闲存储器区域聚集到单个较大的连续区域中。然后,只要请求将适合较大连续区域,就可以进行分配。
在一个实施例中,系统通过管理存储器分配以适合预定义区域来减少存储器碎片化。在一个实施例中,使用表示程序中使用的变量之间的依赖关系的树结构或计算图来确定用于即将到来的计算的变量。在一个实施例中,由于提前计算所需的存储器量,系统能够准确地预测要分配的存储器堆的大小。在一个实施例中,此额外运行时信息允许系统确定系统是否能够在可用存储器内运行计算。在一个实施例中,如果因为计算需要比在最大的连续空闲存储器块中可用的更多的存储器而不能执行计算,但是足够的总存储器容量可用,则分配的存储器可以被重定位以组装具有足够大小的连续块。在一个实施例中,系统能够确定足以释放所需空间的逐出次数。在一个实施例中,逐出的分配可被存储在另一存储器区域中或被保存到盘。
在一个实施例中,系统能够将多个托管堆装配到单个存储器中,并且确保应用将不超过其相应堆的容量,因此使得可以将用于多个应用的存储器分配到单个可寻址存储器空间中,并且确保应用将不会干扰彼此的所分配的存储器区域。在一个实施例中,由于在应用运行之前每个应用的存储器需求是已知的,因此系统能够设计一种存储器分配方案,其中多个应用可以在单个可寻址空间中运行,并且彼此不干扰。
在一个实施例中,连续存储器区域和可重定位地址的使用允许托管堆被用于许多其他用途,诸如拍摄正在运行的应用的快照以用于保存程序状态。在一个实施例中,这允许系统从故障的应用中的已知状态恢复,在物理上不同的存储器之间迁移应用,或多路复用多个GPU应用的执行,所述多个GPU应用一起将需要比物理上可用的更多的存储器。
如本领域技术人员鉴于本公开将理解的,某些示例可能能够实现某些优点,包括以下各项中的一些或全部:(1)精确地计算即将到来的存储器需求和所需的存储器逐出的最小数量,(2)通过预分配存储器的单个连续区域来消除额外的GPU驱动器调用。在一个实施例中,在应用的寿命期间,这需要一个cuMalloc和一个cuFree,(3)使得能够通过使用基址+偏移寻址来容易地重新定位分配,(4)通过引入依存存储器区域的垃圾收集框架来减少碎片化,(5)提高存储器分配的精度,(6)提供可在用户空间中实现的解决方案,没有访问底层虚拟机的内部构件。
在一个实施例中,本文中所描述的技术可以用于在GPU上实现编程语言(诸如Java、Scala、Python和Haskell),并且使得应用能够在存在存储器碎片化的情况下继续工作并减少由重复的外部函数接口(“FFI”)调用引起的开销。
图1示出了在一个实施例中的具有图形处理单元的计算机系统的示例。图1在一个实施例中描绘了包括计算机系统102的示例100,计算机系统102可以包括CPU 104、主存储器106和图形子系统108。在一个实施例中,计算机系统102是包括诸如图形子系统108之类的系统的可操作实体。在一个实施例中,计算机系统102可包括物理计算实例的一个或更多个实例,诸如物理计算机或设备。另外,在一个实施例中,计算机系统102可以包括一个或更多个处理器,以及存储可由一个或更多个处理器执行的指令的存储器。在一个实施例中,计算机系统102可以包括图1中未描绘的各种部件,诸如附加存储器、硬件、处理器、图形子系统、和/或其变体。其他变化也被认为在本公开的范围内。
在一个实施例中,中央处理单元104是任何合适的处理设备,诸如微处理器、协处理器、微控制器、微型计算机、中央处理单元、图形处理单元、专用集成电路(“ASIC”)、定制精简指令集计算(“RISC”)芯片或一些其他可编程逻辑器件中的一个或更多个。这种处理设备的示例包括基于英特尔x86架构、Itanium架构、精简指令集(“RISC”)架构(包括ARM、功率架构和Blackfin架构)以及SPARC架构的设备。在一个实施例中,CPU 104通过处理和执行程序指令以及利用主存储器106可以包括的各种数据和数据结构来操作。
在一个实施例中,主存储器106是被配置成操作、存储和处理CPU 104的数据的一个或更多个数据存储和/或存储器设备。在一个实施例中,主存储器106可以包括以下组件中的一个或更多个:随机存取存储器(“RAM”)、静态随机存取存储器(“SRAM”)、动态随机存取存储器(“DRAM”)和/或其变体。在一个实施例中,主存储器106的部分可以被映射到图形子系统108(具体为图形存储器110)上的要用于处理和执行各种进程和/或应用的一个或更多个位置上。
在一个实施例中,图形子系统108是存在于计算机系统102上以便提供处理能力(具体为对图形的处理)的图形子系统,但是其他进程可以由图形子系统108执行。在一个实施例中,图形子系统108可以是集成图形子系统,其可以结合CPU 104而存在。在一个实施例中,集成图形子系统是包括与CPU 104共享的存储器的图形子系统。在一个实施例中,集成图形子系统与CPU 104共享各种资源以实施和执行过程。在替代实施例中,图形子系统108是分立的图形子系统。在一个实施例中,分立的图形子系统是包括与由CPU 104利用的存储器分开的存储器的图形子系统。在一个实施例中,离散的图形子系统利用视频存储器和/或其他存储器类型的独立源来实施和执行过程。
在一个实施例中,图形子系统108包括图形存储器110,图形存储器110可以由图形子系统108用来实施和执行各种过程。在一个实施例中,图形存储器110是被配置成操作、存储和处理图形处理器112的数据的一个或更多个数据存储和/或存储器设备。在一个实施例中,图形存储器110包括以下组件中的一个或更多个:双倍数据速率同步动态随机存取存储器(“DDR SDRAM”)的变体、图形双倍数据速率同步动态随机存取存储器(“GDDR SDRAM”)的变体、高带宽存储器(“HBM”)和/或其变体。
在一个实施例中,图形处理器112(在一些示例中,其可以被表示为图形处理单元(“GPU”))是任何合适的处理设备,诸如微处理器、协处理器、微控制器、微型计算机、中央处理单元、图形处理单元、专用集成电路(“ASIC”)、定制精简指令集计算(“RISC”)芯片或一些其他可编程逻辑器件中的一个或更多个。在一个实施例中,图形处理器112通过利用各种程序指令和数据进行操作,图形存储器110和/或主存储器106可以包括:执行不同操作;这些操作可以包括图形的生成、并行操作的处理、各种深度学习技术和网络的处理和/或其变型。
图2示出了在一个实施例中的计算机程序的示例,其中计算机程序的一部分运行图形处理单元。在一个实施例中,图2描绘了可以利用CPU上下文和GPU上下文两者来执行的计算机程序的示例200。在一个实施例中,计算机程序200以Java编程语言编写。在一个实施例中,计算机程序200可以用诸如Java、Scala、Python、Haskell和/或其变体之类的编程语言来编写。
在一个实施例中,计算机程序200由系统(诸如结合图1所描述的计算机系统102)处理成要执行的程序指令。在一个实施例中,计算机程序200包括的程序指令可以包括用于确定在CPU上下文和/或GPU上下文内运行程序指令的哪些部分的指令。在一个实施例中,CPU上下文是指由CPU提供的环境,在该环境中运行程序(诸如计算机程序200)的执行。类似地,在一个实施例中,GPU上下文是指由GPU提供的在其中运行程序(诸如计算机程序206)的执行的环境。
在一个实施例中,计算机程序200包括在GPU上下文中执行的可执行代码。在一个实施例中,计算机程序200的部分204被表示为“GPU_Exec(num,i);”对应于在GPU上下文202内执行的计算机程序206。在一个实施例中,部分204的执行可以利用树结构,诸如结合图3所描述的树结构。为了确定所需的存储器的总量,在一个实施例中,可以在GPU上下文内分配所确定的存储器的量,并且可以利用诸如存储器重新分配和存储器碎片整理之类的各种存储器管理技术来执行计算机程序206。
在一个实施例中,计算机程序200的执行以对应于计算机程序200的存储器需求的CPU上下文内的存储器的部分的分配开始。在一个实施例中,计算机程序200利用CPU和主存储器在CPU上下文中执行,用于存储程序指令以及如计算机程序200所需的各种输入变量、输出变量和其他中间变量。在一个实施例中,计算机程序200的执行包括对应于计算机程序206的部分204的执行。在一个实施例中,部分204的执行包括在GPU上下文内计算机程序206所需的存储器的总量的分配。在一个实施例中,在GPU上下文内为计算机程序206分配的存储器(其在一些示例中可以被表示为子例程)可以被称为子例程堆。在一个实施例中,存储器的连续块在GPU上下文内被分配以执行计算机程序206。
在不同实施例中,计算机程序206可以是子例程、函数、表达式、脚本、可执行图、解释代码、中间代码、微代码或可由GPU、CPU、组合逻辑状态机或计算机处理器执行的可执行指令。尽管子例程被示出和描述为示例,但是具有上述计算机程序类型的附加实施例也被理解为在本公开的范围内。
在一个实施例中,计算机程序206的执行在GPU上下文202内发生。在一个实施例中,计算机程序206的执行包括利用先前分配的存储器块来处理和管理计算机程序206的各个方面,诸如程序指令、输入变量、输出变量和其他中间变量。在一个实施例中,在执行计算机程序206之后,计算机程序200恢复在CPU上下文内的执行。在一个实施例中,计算机程序200包括循环结构,部分204在该循环结构中运行多次。在一个实施例中,部分204的每次执行包括存储器的分配以及在GPU上下文内利用不同存储器管理技术。在一个实施例中,部分204的执行包括计算机程序206在GPU上下文内的执行。在一个实施例中,在完成计算机程序200的循环结构之后,计算机程序200可以继续并且完成在CPU上下文内的执行。
在一个实施例中,计算机程序206的输入和输出在CPU上下文的存储器和GPU上下文的存储器之间传递。输入和输出例如可包括计算机程序206的参数(int i)和由计算机程序206返回的返回值(num%i)。在一个实施例中,使用映射到CPU可寻址存储器空间中的GPU存储器的区域来交换这些输入和输出值。
图3示出了在一个实施例中的表示能够在图形处理单元上评估的表达式的树结构的示例。在一个实施例中,图3描绘了由计算机系统(诸如结合图1描述的计算机系统102)生成以确定GPU托管的程序的存储器分配需求的树结构的示例300。在一个实施例中,GPU托管的程序可以是像如结合图2所描述的在GPU上下文202内运行的计算机程序206的程序。
在一个实施例中,表达式302由GPU托管的程序执行。在一个实施例中,系统分析GPU托管的程序以确定由程序产生的对应于树结构的节点的输入、输出和中间值。在一个实施例中,表达式302可被编写为计算机程序的一部分,并且可利用诸如Java、Scala、Python、Haskell和/或其变体之类的编程语言。在一个实施例中,使用附加的标识符和/或要在GPU上下文内作为GPU托管的程序的一部分被评估的其他形式的数据来指定表达式302。在一个实施例中,表达式302由系统分析以确定输入变量、输出变量和中间值变量。在一个实施例中,节点304(根节点)表示一个或更多个输出变量。
在一个实施例中,通过分析表达式302来确定节点304。在一个实施例中,节点304表示表达式302的结果和/或输出。在一个实施例中,分析表达式302的结果和/或输出以确定节点304所需的大小。在一个实施例中,节点304的大小通过分析结果和/或表达式302的输出的各个面来确定,诸如变量类型、计算逻辑和/或其变型。在一个实施例中,通过分析表达式302来确定节点306、节点308、节点310、节点312和节点314。在一个实施例中,节点306、308、310、312和314表示表达式302的输入变量。在一个实施例中,表达式302包括输入变量“A”、“B”、“C”、“D”和“E”并且包括输出变量“结果。”在一个实施例中,在表达式302的上下文中分析输入变量“A”、“B”、“C”、“D”和“E”以确定节点306至314中的个体节点所需的大小。
在一个实施例中,通过对表达式302的分析来确定中间值变量节点316和318。在一个实施例中,中间值变量节点316和318表示表达式302的中间值变量。在一个实施例中,表达式302的中间值变量表示与表达式302的输入和输出变量分离的变量。在一个实施例中,中间值变量可以指代计算机程序或者表达式(诸如表达式302)的整个寿命中不持久的变量。在一个实施例中,节点316表示表达式“(A÷B)”的中间值变量,节点318表示表达式“(C+D+E)”的中间值变量。
在一个实施例中,树结构的总大小确定由系统为执行表达式302的GPU托管的程序分配的GPU存储器内的总存储器。在一个实施例中,树结构的总大小由树结构的每个个体节点的大小的总和确定。在一个实施例中,树中的每个节点的大小至少部分地基于由节点表示的值的类型来确定。在一个实施例中,系统通过分配对应于所需的总存储器的连续GPU存储器的单个块来分配GPU托管的程序所需的计算的总存储器。在一个实施例中,所分配的GPU存储器可被映射到系统上存在的主存储器的一部分。此外,在一个实施例中,将输入变量和输出变量分配给所分配的连续GPU存储器的块的开始中的单个连续块。在一个实施例中,在分配的输入变量和输出变量之后分配中间值变量。
在一个实施例中,为中间值变量分配的存储器的使用可以取决于GPU托管的程序的执行状态。例如,在一个实施例中,可取决于计算机程序或表达式的状态来创建和删除中间值变量。在一个实施例中,对应于节点316和318的中间值变量的状态取决于对输入变量的操作是否已被执行为表达式302的一部分。在一个实施例中,如果对输入变量的操作尚未作为表达式302的一部分被执行,则对应于节点316和/或318的中间值变量可以在所分配的存储器中具有空值,直到已经执行了对输入变量的操作,并且对输入变量的运算结果已经确定了对应于节点316和318的中间值变量的值。例如,在一个实施例中,在执行作为表达式302的一部分的表达式“(C+D+E)”之前,对应于节点318的中间值变量可以具有空值,并且在执行表达式“(C+D+E)”之后,对应于所分配的GPU存储器中的节点318的中间值变量可包括所执行的表达式的结果。在一个实施例中,在执行表达式“(A÷B)x(C+D+E)”之后,在表达式的结果已确定对应于节点304的输出变量的值之后,可删除对应于节点316和318的中间值变量。
在一个实施例中,GPU存储器内的所分配的块用于执行包括表达式302的GPU托管的程序。在一个实施例中,在GPU存储器内的所分配的块包括执行包括表达式302的GPU托管的程序所需的所有变量所需的存储器。在一个实施例中,输入和输出变量具有固定大小,而中间值变量的大小和状态可以变化,这取决于GPU托管的程序的执行的状态。
图4示出了在一个实施例中的用于计算机程序的主存储器和图形存储器之间的映射的示例。在一个实施例中,图4描绘了系统(如结合图1所描述的计算机系统102)可以包括的主存储器402和图形存储器404的示例400。在一个实施例中,主存储器402是被配置成操作、存储和处理诸如CPU之类的处理单元的数据的一个或更多个数据存储和/或存储器设备,并且主存储器402可包括不同数据结构,诸如应用堆410和应用栈408。在一个实施例中,主存储器402可以包括一个或更多个以下组件:RAM(随机存取存储器)、SRAM(静态随机存取存储器)、DRAM(动态随机存取存储器)和/或其变体,并且可以用于存储处理单元可以执行的程序指令。
在一个实施例中,应用堆410是被分配用于执行计算机程序(其在一些示例中可被表示为应用)的连续存储器的区域。在一个实施例中,应用堆410基于计算机程序的总存储器需求来确定。在一个实施例中,应用堆410可包括各种输入、输出和中间变量以及计算机程序在其执行的整个寿命中可利用的其他数据类型和结构。另外,在一个实施例中,应用堆410可包括供不同子例程和/或计算机程序的各部分使用的多个堆。例如,在一个实施例中,计算机程序可以包括在CPU上下文中运行的多个子例程和在GPU上下文中运行的多个子例程。在一个实施例中,分开的上下文中的子例程具有其自己的关联的个体堆,其被标记为子例程堆。
在一个实施例中,应用栈408是被分配用于执行计算机程序的存储器的区域,其在一些示例中可以被表示为应用。在一个实施例中,应用堆栈408可以包括不同输入、输出和中间变量以及计算机程序可以在其执行的整个生命期内利用的其他数据类型和结构。另外,在一个实施例中,应用堆栈408可存储计算机程序的执行本地的变量,以及可在计算机程序可包括的不同功能的执行中利用的其他数据和/或数据结构。在一个实施例中,应用堆栈408和应用堆410一起用于执行计算机程序。在一个实施例中,应用堆栈408上的存储器可比应用堆410上的存储器更快地被分配,从而导致应用堆栈408被用于要求较低延迟分配/检索的数据和/或数据结构。
在一个实施例中,图形存储器404是由图形子系统用来实施和执行各种过程的存储器。在一个实施例中,图形存储器404是被配置成操作、存储和处理图形子系统可以包括的图形处理器的数据的一个或更多个数据存储和/或存储器设备。在一个实施例中,图形存储器404可以包括以下组件中的一个或更多个:DDR SDRAM(双倍数据速率同步动态随机存取存储器)的变体、GDDR SDRAM(图形双倍数据速率同步动态随机存取存储器)的变体、HBM(高带宽存储器)和/或其变体。
在一个实施例中,子例程堆412是包括子例程应用存储器420的存储器映射的堆结构。在一个实施例中,子例程应用存储器420是被分配用于执行子例程的应用堆410的一部分。在一个实施例中,子例程可以在包括图形存储器404的图形子系统上执行。此外,在一个实施例中,子例程应用存储器420是执行计算机程序可以包括的子例程所需的存储器。在一个实施例中,子例程应用存储器420被映射到图形存储器404上的被表示为子例程堆412的所分配的存储器区域。在一个实施例中,计算机程序200包括在GPU上下文内执行的子例程206,在该GPU上下文中子例程206利用映射到子例程堆412的子例程应用存储器420。
在一个实施例中,子例程堆412包括由在包括图形存储器404的图形子系统上执行的子例程利用的子例程输入414、子例程输出416和子例程中间变量418。在一个实施例中,子例程输入414、子例程输出416和子例程中间变量418是被确定为执行子例程所需的变量。在一个实施例中,子例程是计算机程序的一部分,诸如在程序的另一部分的指导下执行的函数或指令集。在一个实施例中,图4中所描绘的子例程是在GPU上下文内执行的计算机程序的一部分。在一个实施例中,为子例程输入414、子例程输出416和子例程中间变量418分配的存储器是用树结构(诸如结合图3所描述的树结构)确定的。在一个实施例中,子例程输入414、子例程输出416和子例程中间变量418所需的总存储器被分配为子例程堆412的分配的一部分。在一个实施例中,分析子例程以确定子例程输入414、子例程输出416和子例程中间变量418所需的总存储器。在一个实施例中,所需的总存储器然后被分配为子例程应用存储器420,其被映射到图形存储器404的分配,作为子例程堆412。此外,在一个实施例中,子例程堆412包括的子例程输入414、子例程输出416和子例程中间变量418在GPU上下文内的子例程的执行中被使用,所述GPU上下文可以是包括图形存储器404的图形子系统。
图5示出了在一个实施例中将个体程序数据映射到图形存储器的区域内的存储器位置的查找表的示例。在一个实施例中,图5描绘了利用查找表512的存储器位置(具体为子例程堆504)的结构的示例500。在一个实施例中,查找表512由在GPU上运行的程序维护,并且该表将堆中的位置映射到该程序所使用的特定变量(输入、输出和中间)。在一个实施例中,该表存储GPU堆的基地址和每个变量的相对于堆的开始的偏移。在一个实施例中,这允许GPU堆的有效重定位(如果必要的话)。在一个实施例中,图形存储器502是由图形子系统用来实施和执行不同进程的存储器。在一个实施例中,图形存储器502是被配置成操作、存储和处理图形子系统可以包括的图形处理器的数据的一个或更多个数据存储和/或存储器设备。另外,在一个实施例中,图形存储器502可以是计算机系统(诸如结合图1所描述的计算机系统102)可以包括的图形子系统的一部分。
在一个实施例中,图形存储器502包括子例程堆504。在一个实施例中,子例程堆504是已经被指定在GPU上下文内执行的子例程在其执行的整个寿命期间利用的分配的存储器区域。在一个实施例中,子例程可以被分析以确定子例程将针对其执行而利用的子例程输入506、子例程输出508和子例程中间变量510。在一个实施例中,子例程输入506、子例程输出508和子例程中间变量510通过树结构(诸如结合图3所描述的树结构)来确定。在一个实施例中,子例程输入506、子例程输出508和子例程中间变量510所需的总存储器用前述树结构确定,并且分配在图形存储器502内以便于在GPU上下文内执行子例程。
在一个实施例中,利用查找表512来组织子例程输入506、子例程输出508和子例程中间变量510。在一个实施例中,在子例程堆504内,首先存储子例程输入506,接下来将子例程输出508与子例程输入506一起存储在连续块中,并且最后存储子例程中间变量510。在一个实施例中,利用基地址514、堆大小516和偏移表518来跟踪子例程输入506、子例程输出508和子例程中间变量510的组织。在一个实施例中,基地址514是子例程输入506中的第一子例程输入的图形存储器502中的地址。在一个实施例中,基地址514是指包括子例程输入506、子例程输出508和子例程中间变量510的子例程堆504的所分配存储器的第一地址或基地址。在一个实施例中,堆大小516是包括子例程输入506、子例程输出508和子例程中间变量510的子例程堆504的总大小。
在一个实施例中,查找表512包括偏移表518,用于跟踪子例程堆504内的子例程输入506、子例程输出508和子例程中间变量510相对于基地址514的位置。在一个实施例中,查找表512被存储在图形存储器502内以管理子例程堆504包括的子例程输入506、子例程输出508和子例程中间变量510。在一个实施例中,查找表512利用偏移表518通过存储子例程输入506的第一子例程输入被存储在其中的基地址514以及存储从基地址514的偏移来跟踪子例程输入506、子例程输出508和子例程中间变量510。在一个实施例中,偏移用于跟踪其他子例程输入506、子例程输出508和子例程中间变量510相对于位于基地址514处的第一子例程输入的位置。例如,在一个实施例中,子例程输入A可被存储在对应于偏移0的基地址处。相应地,在子例程输入B之后立即存储的子例程输入B可以使其位置相对于子例程输入A被跟踪,偏移为1。在一个实施例中,相对于存储第一子例程输入的基地址514跟踪子例程输入506、子例程输出508和子例程中间变量510的所有位置。
在一个实施例中,查找表512所利用的基地址514和偏移表518允许子例程堆504被移位而无需显著的附加计算,因为位置不是用图形存储器502内的绝对地址来跟踪,而是用相对于基地址514的相对地址来跟踪。例如,在一个实施例中,如果另一子例程堆被引入到图形存储器502,则现有子例程堆可被移位到另一基地址。在一个实施例中,对应于经移位的子例程堆的查找表的基地址被更新以继续跟踪经移位的子例程堆。在一个实施例中,子例程输入、子例程输出和子例程中间变量不改变,因为它们是相对于基地址寻址的。另外,在一个实施例中,作为存储器碎片整理操作的结果,子例程堆504能够被重定位。在一个实施例中,可以在图形存储器502内分配多个子例程堆。在一个实施例中,多个分配和解除分配可以引起存储器碎片化,其中所分配的存储器的部分或碎片由于其小尺寸而包括不可用的空闲存储器。在一个实施例中,查找表512可被用来重定位和/或重新组织多个子例程堆,以减少由多个子例程堆引起的碎片化。
图6示出了在一个实施例中由于由计算机系统执行而在图形处理单元内分配图形存储器以供应用程序使用的过程的示例。在一个实施例中,执行过程600的系统识别602要在图形处理单元(GPU)上执行的应用程序。在一个实施例中,应用程序可包括程序内的不同标识符,诸如应用程序内的特定语法,以表示应用程序将在图形处理单元上执行。另外,在一个实施例中,应用程序可以包括其他不同形式的识别,诸如元数据或指示在图形处理单元上执行的其他标识符。此外,在一个实施例中,可以从计算机系统上的一个或更多个特定计算机应用执行应用程序,这可以将应用程序的执行引导到图形处理单元。
在一个实施例中,执行过程600的系统分析604应用以产生表示由程序执行的计算的树结构。在一个实施例中,系统通过产生树结构(诸如结合图3所描述的树结构)来分析应用。在一个实施例中,树结构包括节点,所述节点包括输入变量、输出变量和中间值变量。关于树结构的生成的进一步信息可在图3的描述中找到。
在一个实施例中,执行过程600的系统从树识别606应用的总存储器需求。在一个实施例中,系统通过所产生的树结构的节点的大小的总和来识别应用的总存储器需求。在一个实施例中,树结构的节点对应于应用贯穿其执行的寿命利用的输入变量、输出变量和中间值变量。
在一个实施例中,执行过程600的系统分配608满足应用的存储器需求的GPU存储器的块。在一个实施例中,分配的GPU存储器的块对应于应用的总存储器需求,其可以从树结构确定。在一个实施例中,执行过程600的系统建立610应用数据到分配的存储器块的映射。在一个实施例中,所分配的存储器块的映射包括在所分配的存储器块的开始处的连续块中的输入变量和输出变量、以及在上述连续块之后的块中的中间值变量。在图4和图5的描述中可以找到关于所分配的存储器块的映射的进一步的信息。
在一个实施例中,执行过程600的系统将应用输入数据存储612到所分配的GPU存储器。在一个实施例中,应用输入数据对应于被确定为树结构的一部分的输入变量。在一个实施例中,应用输入数据被存储在被映射到应用输入变量的GPU存储器的所分配的存储器块的部分中,该部分可以在GPU存储器的所分配的块的开头中的连续块中。
在一个实施例中,执行过程600的系统在GPU上运行614应用。在一个实施例中,系统通过执行必要的过程在GPU上运行应用以指导应用在GPU上的执行。在一个实施例中,可以通过针对不同数据和/或数据结构利用所分配的GPU存储器块来在GPU上执行应用。在一个实施例中,所分配的GPU存储器块包括的不同数据和/或数据结构在应用的整个执行中被利用。
在一个实施例中,执行过程600的系统从分配的GPU存储器检索616应用输出数据。在一个实施例中,在GPU上执行应用包括生成输出数据。在一个实施例中,输出数据与输入数据一起存储在连续块中GPU存储器的所分配的块中。在一个实施例中,可以直接从GPU存储器的所分配的块中检索输出数据。在一个实施例中,执行过程600的系统释放618GPU上的所分配的存储器。在一个实施例中,GPU上的所分配的存储器被解除分配,从而允许要在GPU上执行的后续应用程序的进一步分配。
图7示出了在一个实施例中作为由计算机系统执行的结果生成表示由计算机程序使用的数据之间的关系的树的过程的示例。在一个实施例中,执行过程700的系统识别702要在图形处理单元(GPU)上执行的应用程序。在一个实施例中,应用程序可包括程序内的各种标识符,诸如应用程序内的特定语法,以表示应用程序将在图形处理单元上执行。另外,在一个实施例中,应用程序可以包括其他不同形式的识别,诸如元数据或指示在图形处理单元上执行的其他标识符。此外,在一个实施例中,可以从计算机系统上的一个或更多个特定计算机应用执行应用程序,这可以将应用程序的执行引导到图形处理单元。
在一个实施例中,执行过程700的系统解析704程序代码以识别程序输入和输出。在一个实施例中,系统通过分析程序代码的语法和/或语义来解析程序代码以确定程序输入和输出。在一个实施例中,系统通过识别程序代码包括的各种关键字、结构和/或其变型来分析程序代码,以确定程序输入和输出。在一个实施例中,程序输入和输出的确定可以还包括确定程序输入和输出的各种特性,诸如变量类型、大小、使用和/或其变型。
在一个实施例中,执行过程700的系统生成706具有表示程序输出的根节点的树。在一个实施例中,通过系统解析程序代码来确定表示程序输出的根节点。在一个实施例中,根节点表示程序输出并且包括程序输出的各种特性。在一个实施例中,根节点包括程序输出的大小的指示。在一个实施例中,程序可以包括多组程序输出,其中可以生成多个根节点和树结构。
在一个实施例中,执行过程700的系统针对每个程序输入生成708树叶节点。在一个实施例中,通过系统解析程序代码来确定表示程序输入的叶节点。在一个实施例中,叶节点表示程序输入,并且包括程序输入的各种特性。在一个实施例中,叶节点包括程序输入的大小的指示。在一个实施例中,程序可包括多个输入,其中可相对于树结构内的根节点生成多个叶节点。
在一个实施例中,执行过程700的系统解析710程序代码以识别由子例程、函数和中间计算生成的中间值。在一个实施例中,系统可以通过分析程序代码的语法和/或语义以确定程序中间值来解析程序代码。在一个实施例中,系统通过识别程序代码包括的各种关键字、结构和/或其变型来分析程序代码,以确定程序中间值。在一个实施例中,程序中间值的确定可以还包括确定程序中间值的各种特性,诸如变量类型、大小、使用和/或其变型。
在一个实施例中,执行过程700的系统为由程序创建的中间值生成712中间节点。在一个实施例中,通过系统解析程序代码来确定表示中间值的中间节点。在一个实施例中,中间节点表示中间值并且包括中间值的各种特性。在一个实施例中,中间节点包括中间值的大小的指示。
在一个实施例中,执行过程700的系统经由中间节点将表示程序输入的叶节点链接714到根节点。在一个实施例中,系统将叶节点链接到与叶节点相关联的中间节点;在一个实施例中,例如,一组叶节点可链接至包括对该组叶节点执行的操作的中间结果的中间节点。在一个实施例中,中间节点链接到表示中间节点上的一个或更多个进程的输出的根节点。在一个实施例中,例如,中间节点可以链接到根节点,该根节点包括中间节点上的一个或更多个进程的结果。
在一个实施例中,中间节点可链接到其他中间节点,所述其他中间节点可表示在中间节点上执行的一个或更多个进程的中间结果。在一个实施例中,中间节点可以链接到任何数量的其他中间节点。在一个实施例中,中间节点的最终结果将链接到表示中间节点上的一个或更多个进程的最终输出/结果的根节点。关于叶节点经由中间节点链接到根节点的进一步信息可在图3的描述中找到。
图8示出了在一个实施例中由于由计算机系统执行将应用数据映射到在GPU内分配的存储器块的过程的第一部分的示例。在一个实施例中,执行过程800的系统识别802所分配的GPU存储器块的基地址和大小。在一个实施例中,所分配的GPU存储器块的基地址是GPU存储器中的所分配的GPU存储器块开始的地址。在一个实施例中,可以在分配所分配的GPU存储器块期间生成的查找表中找到所分配的GPU存储器块的基地址和大小。关于查找表的进一步信息可在图5的描述中找到。
在一个实施例中,执行过程800的系统将分配指针设置804到GPU存储器块的开始。在一个实施例中,指针是存储存储器地址的位置的编程语言对象。在一个实施例中,分配指针存储将被映射到诸如计算机程序的输入值、输出值或中间值之类的值的存储器地址的位置。在一个实施例中,分配指针可以存储在GPU存储器的单独分配的部分中。在一个替代实施例中,分配指针可以存储在计算机系统包括的其他存储器(如主存储器)上。
在一个实施例中,执行过程800的系统对程序的每个输入值应用806过程。在一个实施例中,程序是指已经由系统分析以确定计算机程序的输入值、输出值和中间值的计算机程序。在一个实施例中,所分配的GPU存储器块包括映射到计算机程序的输入值、输出值和中间值的存储器。在一个实施例中,执行过程800的系统通过程序的每个输入值迭代。
在一个实施例中,执行过程800的系统将存储器分配808到在由分配指针指示的位置处的输入值。在一个实施例中,由分配指针指示的存储器位置被分配给输入值,使得输入值可以被存储在该存储器位置中。在一个实施例中,所分配的存储器的量由输入值的大小来确定。在一个实施例中,所分配的存储器被分配成使得输入值可以存储在所分配的存储器中。在一个实施例中,执行过程800的系统基于分配的存储器的量来推进810分配指针。在一个实施例中,基于分配的存储器的量来推进分配指针,使得分配指针指向存储器中的与先前分配给输入值的存储器不重叠的新位置。
在一个实施例中,执行过程800的系统确定是否仍有更多812输入值要分配。在一个实施例中,如果系统确定有剩余的更多的输入值要分配,则系统针对剩余的输入值重复过程806-812。在一个实施例中,如果系统确定没有更多的输入值,则系统开始处理程序的输出值。在一个实施例中,执行过程800的系统对程序的每个输出值应用814过程。在一个实施例中,执行过程800的系统通过程序的每个输出值迭代。
在一个实施例中,执行过程800的系统将存储器分配816到在由分配指针指示的位置处的输出值。在一个实施例中,由分配指针指示的存储器位置被分配给输出值,使得输出值可以被存储在存储器位置中。在一个实施例中,所分配的存储器的量由输出值的大小确定。在一个实施例中,所分配的存储器被分配成使得输出值可以存储在所分配的存储器中。在一个实施例中,执行过程800的系统基于所分配的存储器的量来推进818分配指针。在一个实施例中,基于分配的存储器的量来推进分配指针,使得分配指针指向存储器中的与先前分配给输出值的存储器不重叠的新位置。
在一个实施例中,执行过程800的系统确定是否仍有更多820输出值要分配。在一个实施例中,如果系统确定有剩余的更多的输出值要分配,则系统针对剩余的输出值重复过程814-820。在一个实施例中,如果系统确定没有更多输出值,则系统开始处理程序的中间值,在图9中继续。
图9示出了在一个实施例中作为由计算机系统执行的结果将应用数据映射到在GPU内分配的存储器块的过程的第二部分的示例。在一个实施例中,执行过程900的系统对程序的每个中间值应用904过程。在一个实施例中,程序是指已经由系统分析以确定计算机程序的输入值、输出值和中间值的计算机程序。在一个实施例中,所分配的GPU存储器块包括映射到计算机程序的输入值、输出值和中间值的存储器。在一个实施例中,执行过程900的系统通过程序的每个中间值迭代。
在一个实施例中,执行过程900的系统将存储器分配906到在由分配指针指示的位置处的中间值。在一个实施例中,由分配指针指示的存储器位置被分配给中间值,使得该中间值可被存储在该存储器位置中。在一个实施例中,所分配的存储器的量由中间值的大小确定。在一个实施例中,所分配的存储器被分配成使得中间值可以存储在所分配的存储器中。在一个实施例中,执行过程900的系统基于所分配的存储器的量来推进908分配指针。在一个实施例中,基于所分配的存储器的量来推进分配指针,使得分配指针指向存储器中的与先前分配给中间值的存储器不重叠的新位置。
在一个实施例中,执行过程900的系统确定是否有剩余的更多910中间值要分配。在一个实施例中,如果系统确定有剩余的更多中间值要分配,则系统针对剩余中间值重复过程904、906、908和910。在一个实施例中,如果系统确定没有更多中间值,则系统停止程序的中间值的处理。
在一个实施例中,执行过程900的系统确认912数据适合在所分配的存储器中。在一个实施例中,前述数据是已经分配在所分配的GPU存储器块中的数据,并且包括计算机程序的输入值、输出值和中间值。在一个实施例中,系统通过对分配的存储器执行一个或更多个验证检查以确定数据是否超过分配的存储器的界限或者数据是否适合在分配的存储器的界限内,来确认数据适合。
图10示出了根据一个实施例的并行处理单元(“PPU”)1000。在一个实施例中,PPU1000配置有机器可读代码,所述机器可读代码如果由PPU执行,则使PPU执行本发明通篇描述的过程和技术中的一些或全部。在一个实施例中,PPU 1000是多线程处理器,其在一个或更多个集成电路设备上实现并且利用多线程作为延迟隐藏技术,该技术被设计为并行地处理多个线程上的计算机可读指令(也被称为机器可读指令或简称为指令)。在一个实施例中,线程是指执行线程并且是被配置为由PPU 1000执行的指令集的实例化。在一个实施例中,PPU 1000是图形处理单元(“GPU”),该图形处理单元被配置成实现用于处理三维(“3D”)图形数据以便生成二维(“2D”)图像数据以在显示设备(如液晶显示器(LCD)设备)上显示的图形渲染管线。在一个实施例中,PPU 1000用于执行诸如线性代数运算和机器学习运算之类的计算。图10示出仅用于说明性目的的示例并行处理器,并且应被解释为在本公开的范围内考虑的处理器架构的非限制性示例,并且可采用任何合适的处理器来补充和/或替代它们。
在一个实施例中,一个或更多个PPU被配置成加速高性能计算(“HPC”)、数据中心和机器学习应用。在一个实施例中,PPU 1000被配置为加速深度学习系统和应用,包括以下非限制性示例:自主车辆平台、深度学习、高精度语音、图像、文本识别系统、智能视频分析、分子模拟、药物发现、疾病诊断、天气预报、大数据分析、天文学、分子动力学模拟、财务建模、机器人学、工厂自动化、实时语言翻译、在线搜索优化和个性化用户推荐等。
在一个实施例中,PPU 1000包括输入/输出(“I/O”)单元1005、前端单元1010、调度器单元1012、工作分配单元1014、集线器1016、交叉开关(“Xbar”)1020、一个或更多个通用处理集群(“GPC”)1018和一个或更多个分区单元1022。在一个实施例中,PPU 1000经由一个或更多个高速GPU互连108连接到主机处理器或其他PPU 1000。在一个实施例中,PPU 1000经由互连1002连接到主机处理器或其他外围设备。在一个实施例中,PPU 1000连接到包括一个或更多个存储器设备1004的本地存储器。在一个实施例中,本地存储器包括一个或更多个动态随机存取存储器(“DRAM”)设备。在一个实施例中,一个或更多个DRAM设备被配置和/或可配置为高带宽存储器(“HBM”)子系统,其中多个DRAM管芯堆叠在每个器件内。
高速GPU互连1008可以指基于导线的多通道通信链路,其由系统使用以缩放和包括与一个或更多个CPU组合的一个或更多个PPU 1000,支持PPU 1000和CPU之间的高速缓存一致性和CPU主控。在一个实施例中,数据和/或命令由高速GPU互连108通过集线器1016发送到PPU 1000的其他单元/从PPU 1000的其他单元(诸如一个或更多个复制引擎、视频编码器、视频解码器、功率管理单元以及可能未在图10中明确示出的其他组件)发送。
在一个实施例中,I/O单元1006被配置为通过系统总线1002发送和接收来自主机处理器(图10中未示出)的通信(例如,命令、数据)。在一个实施例中,I/O单元1005经由系统总线1002或通过诸如内存桥之类的一个或更多个中间设备与主机处理器直接通信。在一个实施例中,I/O单元1005可以经由系统总线1002与一个或更多个其他处理器(诸如一个或更多个PPU 1000)进行通信。在一个实施例中,I/O单元1005实现用于通过PCIe总线通信的外围组件互连高速(“PCIe”)接口。在一个实施例中,I/O单元1005实现用于与外部设备通信的接口。
在一个实施例中,I/O单元1005对经由系统总线1002接收的分组进行解码。在一个实施例中,至少一些分组表示被配置为使PPU 1000执行不同操作的命令。在一个实施例中,I/O单元1005将解码的命令发送到PPU 1000的各个其他单元,如由命令指定的。在一个实施例中,命令被传送到前端单元1010和/或被传送到集线器1016或PPU 1000的其他单元,诸如一个或更多个复制引擎、视频编码器、视频解码器、功率管理单元等(在图10中未明确示出)。在一个实施例中,I/O单元1005被配置为在PPU 1000的各个逻辑单元之间和之中路由通信。
在一个实施例中,由主机处理器执行的程序将命令流编码在将工作负载提供给PPU 1000用于处理的缓冲区中。在一个实施例中,工作负载包括指令和由那些指令处理的数据。在一个实施例中,缓冲区是存储器中可由主机处理器和PPU 1000两者访问(例如,读/写)的区域——主机接口单元可被配置为由I/O单元1005经由在系统总线1002上发送的存储器请求访问连接至系统总线1002的系统存储器中的缓冲区。在一个实施例中,主机处理器将命令流写入到缓冲区,且接着将指向命令流的开始的指针发送到PPU 1000,使得前端单元1010接收指向一个或更多个命令流的指针且管理所述一个或更多个流,从流中读取命令并将命令转发到PPU 1000的各个单元。
在一个实施例中,前端单元1010耦合到调度器单元1012,该调度器单元1012将各个GPC 1018配置为处理由一个或更多个流定义的任务。在一个实施例中,该调度器单元1012被配置为跟踪与由该调度器单元1012管理的各个任务相关的状态信息,其中该状态信息可以指示任务被分配给哪个GPC 1018、该任务是活动的还是不活动的、与该任务相关联的优先级等级等等。在一个实施例中,调度器单元1012管理一个或更多个GPC 1018上的多个任务的执行。
在一个实施例中,调度器单元1012耦合到工作分配单元1014,工作分配单元1014配置成分派任务以在GPC 1018上执行。在一个实施例中,工作分配单元1014跟踪从调度器单元1012接收的多个被调度的任务,并且工作分配单元1014管理每个GPC 1018的挂起(pending)任务池和活动任务池。在一个实施例中,挂起任务池包括多个时隙(例如,32个时隙),这些时隙包含被分配为由特定GPC 1018处理的任务;活动任务池可包括用于由GPC1018主动地处理的任务的多个时隙(例如,4个时隙),使得当GPC 1018完成任务的执行时,从用于GPC 1018的活动任务池中驱逐该任务,并且选择并调度来自挂起任务池的其他任务之一以在GPC 1018上执行。在一个实施例中,如果活动任务在GPC 1018上是空闲的,诸如在等待数据依赖关系被解决时,则活动任务从GPC 1018被逐出并返回到挂起任务池,同时挂起任务池中的另一任务被选择并调度用于在GPC 1018上执行。
在一个实施例中,工作分配单元1014经由XBar 1020与一个或更多个GPC 1018通信。在一个实施例中,XBar 1020是将PPU 1000的许多单元耦合到PPU 1000的其他单元的互连网络,并且可被配置为将工作分配单元1014耦合到特定的GPC 1018。尽管未明确示出,但PPU 1000的一个或更多个其他单元也可经由集线器1016连接到XBar 1020。
任务由调度器单元1012管理,并且由工作分配单元1014分派给GPC 1018。GPC1018被配置为处理该任务并且生成结果。结果可由GPC 1018内的其他任务消耗,经由XBar1020路由到不同的GPC 1018,或存储在存储器1004中。结果可经由分区单元1022写入到存储器1004,分区单元1022实现用于从存储器1004读取数据和向存储器1004写入数据的存储器接口。结果可以经由高速GPU互连108发送到另一个PPU 1004或CPU。在一个实施例中,PPU1000包括数量为U的分区单元1022,其等于耦合到PPU 1000的单独且不同的存储器设备1004的数量。下文将结合图12更详细地描述分区单元1022。
在一个实施例中,主机处理器执行驱动器内核,该驱动器内核实现应用编程接口(“API”),该应用编程接口使得在主机处理器上执行的一个或更多个应用能够调度操作以用于在PPU 1000上执行。在一个实施例中,PPU 1000同时执行多个计算应用,并且PPU 1000为多个计算应用提供隔离、服务质量(“QoS”)、和独立的地址空间。在一个实施例中,应用生成指令(例如,以API调用的形式),所述指令使驱动器内核生成一个或更多个任务以用于由PPU 1000执行,并且驱动器内核向由PPU 1000处理的一个或更多个流输出任务。在一个实施例中,每个任务包括一组或更多组相关线程,其可被称为线程束。在一个实施例中,线程束包括可并行执行的多个相关线程(例如,32个线程)。在一个实施例中,协作线程可以指代包括用于执行任务并且通过共享存储器交换数据的指令的多个线程。根据一个实施例,在应用中的其他地方更详细地描述了线程和协作线程。
图11示出了根据一个实施例的GPC 1100,例如所示出的图10的PPU 1000的GPC。在一个实施例中,每个GPC 1100包括用于处理任务的多个硬件单元,并且每个GPC 1100包括管线管理器1102、预光栅操作单元(“PROP”)1104、光栅引擎1108、工作分配交叉开关(“WDX”)1116,存储器管理单元(“MMU”)1118、一个或更多个数据处理集群(“DPC”)1106、以及各部分的任何合适的组合。应当理解,图11的GPC 1100可包括代替或补充图11所示的单元的其他硬件单元。
在一个实施例中,GPC 1100的操作由管线管理器1102控制。管线管理器1102管理一个或更多个DPC 1106的配置,以用于处理分配给GPC 1100的任务。在一个实施例中,管线管理器1102将一个或更多个DPC 1106中的至少一个DPC配置为实现图形渲染管线的至少一部分。在一个实施例中,DPC 1106被配置成在可编程流式多处理器(“SM”)1114上执行顶点着色器程序。管线管理器1102被配置为将从工作分配接收的分组路由至GPC 1100内的适当的逻辑单元,在一个实施例中,并且一些分组可被路由到PROP 1104和/或光栅引擎1108中的固定功能硬件单元,而其他分组可被路由到DPC 1106以供图元引擎1112或SM 1114处理。在一个实施例中,管线管理器1102将一个或更多个DPC 1106中的至少一个DPC配置为实现神经网络模型和/或计算管线。
在一个实施例中,PROP单元1104被配置为将由光栅引擎1108和DPC 1106生成的数据路由到存储器分区单元中的光栅操作(“ROP”)单元,如上文更详细描述的。在一个实施例中,PROP单元1104被配置为执行对颜色混合、组织像素数据、执行地址转换等等的优化。在一个实施例中,光栅引擎1108包括被配置为执行不同光栅操作的若干固定功能硬件单元,且光栅引擎1108包括设置引擎、粗略光栅引擎、剔除引擎、裁剪引擎、精细光栅引擎、图块合并引擎及其任何合适组合。在一个实施例中,设置引擎接收经变换的顶点并生成与由顶点定义的几何图元相关联的平面方程;将平面方程发送到粗略光栅引擎以生成图元的覆盖信息(例如,图块的x、y覆盖掩码);粗略光栅引擎的输出被发送到剔除引擎,在剔除引擎中剔除与未通过z测试的图元相关联的片段,并且被发送到裁剪引擎,在裁剪引擎中裁剪掉位于视椎体外面的片段。在一个实施例中,将裁剪和剔除之后留下来的片段传递到精细光栅引擎,以基于由设置引擎生成的平面方程来生成像素片段的属性。在一个实施例中,光栅引擎1108的输出包括将由任何合适的实体(如由在DPC 1106内实现的片段着色器)处理的片段。
在一个实施例中,包括在GPC 1100中的每个DPC 1106包括M管道控制器(“MPC”)1110;图元引擎1112;一个或更多个SM 1114;及其任何合适的组合。在一个实施例中,MPC1110控制DPC 1106的操作,将从管线管理器1102接收的分组路由至DPC 1106中的适当单元。在一个实施例中,将与顶点相关联的分组被路由到图元引擎1112,所述图元引擎1112被配置为从存储器提取与顶点相关联的顶点属性;相反,可将与着色器程序相关联的分组发送到SM 1114。
在一个实施例中,SM 1114包括可编程的流式处理器,其被配置为处理由多个线程表示的任务。在一个实施例中,SM 1114是多线程的并被配置成并发地执行来自特定线程组的多个线程(例如,32个线程)并实现SIMD(单指令、多数据)架构,其中线程组(例如,线程束)中的每个线程被配置成基于相同指令集来处理不同数据集。在一个实施例中,该线程组中的所有线程执行相同的指令。在一个实施例中,SM 1114实现SIMT(单指令、多线程)架构,其中线程组中的每个线程被配置成基于相同的指令集来处理不同的数据集,但是其中该线程组中的各个线程被允许在执行期间发散。在一个实施例中,为每个线程束维持程序计数器、调用栈和执行状态,从而在线程束内的线程发散时实现线程束与线程束内的串行执行之间的并发性。在另一个实施例中,为每个个体线程维护程序计数器、调用栈和执行状态,从而实现所有线程之间、线程束内和线程束之间的相等并发性。在一个实施例中,为每个个体线程维持执行状态,并且为了更好的效率,执行相同指令的线程可以收敛并且并行执行。在一个实施例中,SM 1114在以下更详细地描述。
在一个实施例中,MMU 1118在GPC 1100与存储器分区单元之间提供接口,且MMU1118提供虚拟地址到物理地址的转换、存储器保护和存储器请求的仲裁。在一个实施例中,MMU 1118提供一个或更多个转换后备缓冲区(“TLB”),用于执行虚拟地址到存储器中的物理地址的转换。
图12示出了根据一个实施例的PPU的存储器分区单元。在一个实施例中,存储器分区单元1200包括光栅操作(“ROP”)单元1202;二级(“L2”)高速缓存1204;存储器接口1206;及其任何合适的组合。存储器接口1206耦合到存储器。存储器接口1206可实现32、64、128、1024位数据总线等,以用于高速数据传输。在一个实施例中,PPU包括U个存储器接口1206,每对分区单元1200一个存储器接口1206,其中每对分区单元1200连接至相应的存储器设备。例如,PPU可以连接至多达Y个存储器设备,诸如高带宽存储器栈或图形双倍数据速率、版本5、同步动态随机存取存储器(“GDDR5 SDRAM”)。
在一个实施例中,存储器接口1206实现HBM2存储器接口,并且Y等于U的一半。在一个实施例中,HBM2存储器栈位于与PPU相同的物理封装上,与常规GDDR5 SDRAM系统相比,这提供了显著的功率和面积节省。在一个实施例中,每个HBM2堆叠包括四个存储器管芯并且Y等于4,其中HBM2堆叠包括每管芯两个128位通道,总共8个通道以及1024位的数据总线宽度。
在一个实施例中,存储器支持单纠错双检错(“SECDED”)纠错码(“ECC”)以保护数据。ECC为对数据破坏敏感的计算应用提供了更高的可靠性。可靠性在其中PPU处理非常大的数据集和/或运行应用达扩展时段的大规模集群计算环境中尤其重要。
在一个实施例中,PPU实现多级存储器层次结构。在一个实施例中,存储器分区单元1200支持统一存储器以为CPU和PPU存储器提供单个统一虚拟地址空间,从而实现虚拟存储器系统之间的数据共享。在一个实施例中,PPU对位于其他处理器上的存储器的访问的频率被跟踪,以确保存储器页面被移动到更频繁地访问页面的PPU的物理存储器。在一个实施例中,高速GPU互连108支持允许PPU直接访问CPU的页表并且提供PPU对CPU存储器的完全访问的地址转换服务。
在一个实施例中,复制引擎在多个PPU之间或在PPU与CPU之间传送数据。在一个实施例中,复制引擎可针对未映射到页表中的地址生成页错误,且存储器分区单元1200接着服务于页错误,将地址映射到页表中,其后复制引擎执行传送。在一个实施例中,存储器被钉住(即,不可分页)以用于多个处理器之间的多个复制引擎操作,从而显著减少可用存储器。在一个实施例中,在硬件页面出错的情况下,可以将地址传递到复制引擎,而不考虑存储器页面是否驻留,并且复制过程是透明的。
根据一个实施例,来自图10的存储器或其他系统存储器的数据由存储器分区单元1200获取并且存储在L2高速缓存1204中,所述L2高速缓存位于芯片上并且在各个GPC之间共享。在一个实施例中,每个存储器分区单元1200包括与相应存储器设备相关联的L2高速缓存1160的至少一部分。在一个实施例中,较低级高速缓存在GPC内的不同单元中实现。在一个实施例中,每个SM 1240可以实现一级(“L1”)高速缓存,其中L1高速缓存是专用于特定SM 1240的私有存储器,并且获取来自L2高速缓存1204的数据并将其存储在每个L1高速缓存中,以在SM 1240的功能单元中进行处理。在一个实施例中,L2高速缓存1204耦合到存储器接口1206和XBar 1020。
在一个实施例中,ROP单元1202执行与像素颜色相关的图形光栅操作,例如颜色压缩、像素混合和更多。在一个实施例中,ROP单元1250结合光栅引擎1225实现深度测试,从光栅引擎1225的剔除引擎接收与像素片段相关联的样本位置的深度。在一个实施例中,针对与片段相关联的样本位置,测试相对于深度缓冲区中的相应深度的深度。在一个实施例中,如果片段通过样本位置的深度测试,那么ROP单元1202更新深度缓冲区且将深度测试的结果发送到光栅引擎1225。将了解,分区单元1200的数目可不同于GPC的数目,且因此,在一个实施例中,每个ROP单元1202可耦合到GPC中的每一者。在一个实施例中,ROP单元1202跟踪从不同GPC接收的分组且确定由ROP单元1202生成的结果通过Xbar路由到哪一者。
图13示出根据一个实施例的诸如图11的流式多处理器之类的流式多处理器。在一个实施例中,SM 1300包括:指令高速缓存1302;一个或更多个调度器单元1304;寄存器文件1308;一个或更多个处理核1310;一个或更多个特殊功能单元(“SFU”)1312;一个或更多个加载/存储单元(“LSU”)1314;互连网络1316;共享存储器/L1高速缓存1318;及其任何合适的组合。在一个实施例中,该工作分配单元分派多个任务以用于在该PPU的这些GPC上执行,并且每个任务被分配给GPC内的特定DPC,并且如果该任务与一着色器程序相关联,则该任务被分配给SM 1300。在一个实施例中,调度器单元1304从工作分配单元接收任务并管理分配给SM 1300的一个或更多个线程块的指令调度。在一个实施例中,调度器单元1304调度线程块以作为并行线程的线程束来执行,其中每个线程块被分配至少一个线程束。在一个实施例中,每个线程束执行线程。在一个实施例中,调度器单元1304管理多个不同的线程块,将线程束分配给不同的线程块,然后在每个时钟周期期间将来自多个不同的协作组的指令分派到各个功能单元(例如,核1310、SFU 1312和LSU 1314)。
协作组可以指用于组织通信线程的组的编程模型,其允许开发者表达线程正在通信的粒度,使得能够表达更丰富、更有效的并行分解。在一个实施例中,协作启动API支持线程块之间的同步以用于并行算法的执行。在一个实施例中,常规编程模型的应用提供用于同步协作线程的单个简单构造:跨线程块(例如,syncthreads()函数)的所有线程的屏障。然而,程序员往往想要以比线程块粒度更小的粒度来定义线程组,并在所定义的组内同步,以使得能够以集体全组功能接口的形式实现更大的性能、设计灵活性和软件重用。协作组使程序员能够以子块(即,小到单个线程)和多块粒度显式地定义线程组,并且对协作组中的线程执行诸如同步之类的集体操作。编程模型支持跨软件边界的清晰合成,使得库和实用函数可以在它们的本地上下文内安全地同步,而不必做出关于收敛的假设。协作组图元实现协作并行性的新模式,包括生产者-消费者并行性、机会并行性和跨线程块的整个网格的全局同步。
在一个实施例中,分派单元1306被配置为将指令发送到功能单元中的一个或更多个功能单元,且调度器单元1304包括两个分派单元1306,其使得能够在每个时钟循环期间分派来自相同线程束的两个不同指令。在一个实施例中,每个调度器单元1304包括单个分派单元1306或附加的分派单元1306。
在一个实施例中,每个SM 1300包括寄存器文件1308,该寄存器文件1308为SM1300的功能单元提供一组寄存器。在一个实施例中,寄存器文件1308在每个功能单元之间划分,使得每个功能单元被分配寄存器文件1308的专用部分。在一个实施例中,寄存器文件1308在由SM 1300执行的不同线程束之间划分,且寄存器文件1308为连接到功能单元的数据路径的操作数提供临时存储。在一个实施例中,每个SM 1300包括多个L个处理核1310。在一个实施例中,SM 1300包括大量(例如,128个或更多)不同的处理核1310。在一个实施例中,每个核1310包括全管线、单精度、双精度和/或混合精度处理单元,其包括浮点算术逻辑单元和整数算术逻辑单元。在一个实施例中,浮点算术逻辑单元实现用于浮点算术的IEEE754-2008标准。在一个实施例中,核1310包括64个单精度(32位)浮点核、64个整数核、32个双精度(64位)浮点核和8个张量核。
张量核被配置成根据一个实施例执行矩阵运算。在一个实施例中,一个或更多个张量核被包括在核1310中。在一个实施例中,张量核被配置为执行深度学习矩阵运算,诸如用于神经网络训练和推理的卷积运算。在一个实施例中,每个张量核对4x4矩阵进行运算并且执行矩阵乘法和累加运算D=A×B+C,其中A、B、C和D是4x4矩阵。
在一个实施例中,矩阵乘法输入A和B是16位浮点矩阵,并且累加矩阵C和D是16位浮点或32位浮点矩阵。在一个实施例中,张量核在具有32位浮点累加的16位浮点输入数据上运算。在一个实施例中,16位浮点乘法需要64个运算并且导致全精度乘积,然后使用32位浮点加法将其与用于4x4x4矩阵乘法的其他中间积进行累加。在一个实施例中,张量核用于执行由这些较小元素构建的大得多的二维或更高维的矩阵运算。在一个实施例中,诸如CUDA 9C++API之类的API暴露专门的矩阵加载、矩阵乘法和累加以及矩阵存储操作,以有效地使用来自CUDA-C++程序的张量核。在一个实施例中,在CUDA级,线程束级接口假定跨越线程束的所有32个线程的16x16大小矩阵。
在一个实施例中,每个SM 1300包括M个SFU 1312,其执行特殊功能(例如,属性评估、倒数平方根等)。在一个实施例中,SFU 1312包括树遍历单元,其被配置为遍历分层树数据结构。在一个实施例中,SFU 1312包括被配置为执行纹理映射滤波操作的纹理单元。在一个实施例中,纹理单元被配置成从存储器加载纹理图(例如,纹理像素的2D阵列),并对纹理图进行采样以产生经采样的纹理值以在SM 1300执行的着色器程序中使用。在一个实施例中,纹理图被存储在共享存储器/L1高速缓存中。根据一个实施例,纹理单元实现纹理操作,例如使用mip图(例如,不同细节等级的纹理图)的过滤操作。在一个实施例中,每个SM 1300包括两个纹理单元。
在一个实施例中,每个SM 1300包括N个LSU 1254,其实现共享存储器/L1高速缓存1206与寄存器文件1308之间的加载和存储操作。在一个实施例中,每个SM 1300包括互连网络1316,其将每个功能单元连接到寄存器文件1308并且将LSU 1314连接到寄存器文件1308、共享存储器/L1高速缓存1318。在一个实施例中,互连网络1316是可被配置成将任何功能单元连接到寄存器文件1308中的任何寄存器并将LSU 1314连接到寄存器文件和共享存储器/L1高速缓存1318中的存储器位置的交叉开关。
在一个实施例中,共享存储器/L1高速缓存1318是片上存储器的阵列,其允许在SM1300与图元引擎之间以及在SM 1300中的线程之间进行数据存储和通信。在一个实施例中,共享存储器/L1高速缓存1318包括128KB的存储容量,并且在从SM 1300到分区单元的路径中。在一个实施例中,共享存储器/L1高速缓存1318用于高速缓存读取和写入。共享存储器/L1高速缓存1318、L2高速缓存和存储器中的一个或更多个是后备存储。
在一个实施例中,将数据高速缓存和共享存储器功能组合到单个存储器块中为两种类型的存储器访问提供改进的性能。在一个实施例中,容量由不使用共享存储器的程序使用或可用作高速缓存,例如如果共享存储器被配置为使用一半容量,则纹理和加载/存储操作可以使用剩余容量。根据实施例,在共享存储器/L1高速缓存1318内的集成使得共享存储器/L1高速缓存1318能够充当用于流式传输数据同时提供对频繁重用数据的高带宽和低延时访问的高吞吐量管道。当被配置用于通用并行计算时,与图形处理相比,可以使用更简单的配置。在一个实施例中,绕过固定功能图形处理单元,从而创建简单得多的编程模型。在一个实施例中,在通用并行计算配置中,工作分配单元将线程的块直接指派和分配给DPC。根据一个实施例,块中的线程执行相同的程序,在计算中使用唯一的线程ID来确保每个线程生成唯一的结果,使用SM 1300来执行程序并执行计算,使用共享存储器/L1高速缓存1318在线程之间通信,以及使用LSU 1314来通过共享存储器/L1高速缓存1318和存储器分区单元读取和写入全局存储器。在一个实施例中,当被配置用于通用并行计算时,SM1300写入调度器单元可用于在DPC上启动新工作的命令。
在一个实施例中,PPU被包括在台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线、手持式设备)、个人数字助理(“PDA”)、数码相机、车辆、头戴式显示器、手持式电子设备等中或与其耦合。在一个实施例中,PPU被具体化在单个半导体衬底上。在一个实施例中,PPU连同一个或更多个其他设备(诸如附加PPU、存储器、精简指令集计算机(“RISC”)CPU、存储器管理单元(“MMU”)、数模转换器(“DAC”)等)一起被包括在片上系统(“SoC”)中。
在一个实施例中,PPU可以被包括在包括一个或更多个存储器设备的图形卡上。图形卡可被配置成与台式计算机的主板上的PCIe插槽接合。在又一个实施例中,PPU可以是包括在主板的芯片集中的集成图形处理单元(“iGPU”)。
图14示出了根据一个实施例的其中可以实现各种架构和/或功能的计算机系统1400。在一个实施例中,计算机系统1400被配置为实现贯穿本公开所描述的各种过程和方法。
在一个实施例中,计算机系统1400包括至少一个中央处理单元1402,该中央处理单元连接至使用任何合适的协议(诸如PCI(外围组件互连)、PCI-Express、AGP(加速图形端口)、超传输、或任何其他总线或一个或更多个点对点通信协议)实现的通信总线1410。在一个实施例中,计算机系统1400包括主存储器1404和控制逻辑(例如,被实现为硬件、软件或其组合),并且数据被存储在主存储器1404中,该主存储器可以采用随机存取存储器(“RAM”)的形式。在一个实施例中,网络接口子系统1422提供到其他计算设备和网络的接口,用于从计算机系统1400接收数据和向其他系统发送数据。
在一个实施例中,计算机系统1400包括输入设备1408、并行处理单元1412和显示设备1406,显示设备可以使用常规CRT(阴极射线管)、LCD(液晶显示器)、LED(发光二极管)、等离子体显示器或其他合适的显示技术来实现。在一个实施例中,从诸如键盘、鼠标、触摸板、麦克风等输入设备1408接收用户输入。在一个实施例中,前述模块中的每个模块可以位于单个半导体平台上以形成处理系统。
在本说明书中,单个半导体平台可以指唯一的基于单一半导体的集成电路或芯片。应注意的是,术语单个半导体平台还可以指具有增加的连通性的多芯片模块,这些多芯片模块模拟片上操作并且相对于利用常规中央处理单元(“CPU”)和总线实现方式做出实质性改进。当然,不同模块也可以根据用户的愿望单独位于半导体平台上或位于半导体平台的不同组合中。
在一个实施例中,机器可读可执行代码或计算机控制逻辑算法形式的计算机程序被存储在主存储器1404和/或辅助存储器中。计算机程序,如果由一个或更多个处理器执行,使系统1400能够执行根据一个实施例的各种功能。存储器1404、存储装置和/或任何其他存储装置是计算机可读介质的可能实例。辅助存储装置可以指任何合适的存储设备或系统,诸如硬盘驱动器和/或可移除存储驱动器,其表示软盘驱动器、磁带驱动器、压缩盘驱动器、数字通用盘(“DVD”)驱动器、记录设备、通用串行总线(“USB”)闪存。
在一个实施例中,在中央处理器1402的上下文中实现各个先前附图的架构和/或功能;并行处理单元1412;集成电路,其能够实现中央处理器1402和并行处理单元1412两者的能力的至少一部分;芯片集(例如,被设计为作为执行相关功能的单元工作和销售的一组集成电路等);以及集成电路的任何合适的组合。
在一个实施例中,在通用计算机系统、电路板系统、专用于娱乐目的的游戏控制台系统、专用系统等的上下文中实现各个先前附图的架构和/或功能。在一个实施例中,计算机系统1400可以采取台式计算机、膝上型计算机、平板计算机、服务器、超级计算机、智能电话(例如,无线手持式设备)、个人数字助理(“PDA”)、数码相机、车辆、头戴式显示器、手持式电子设备、移动电话设备、电视、工作站、游戏控制台、嵌入式系统和/或任何其他类型的逻辑的形式。
在一个实施例中,并行处理单元1412包括多个PPU 1414和相关联的存储器1416。在一个实施例中,这些PPU经由互连1418和交换机1420或多路复用器连接到主机处理器或其他外围设备。在一个实施例中,并行处理单元1412跨PPU 1414分配计算任务,这些计算任务可以是可并行的--例如,作为跨多个GPU线程块分配计算任务的一部分。在一个实施例中,存储器跨PPU 1414中的一些或全部被共享和可访问(例如,用于读取和/或写入访问),尽管这样的共享存储器可能引起相对于本地存储器和驻留在PPU的寄存器的使用的性能损失。在一个实施例中,PPU 1414的操作通过使用诸如syncthreads()之类的命令而被同步,该命令要求块中的所有线程(例如,跨多个PPU 1414执行)在继续之前到达代码的某个执行点。
因此,说明书和附图被视为是说明性的而不是限制性的。然而,显而易见的是,在不背离权利要求中阐述的本发明的更宽泛的精神和范围的情况下,可以对其进行各种修改和改变。
其他变型在本公开的精神内。由此,虽然所公开的技术易受不同修改和替代构造的影响,但其某些示出的实施例在附图中示出并且已在上文详细描述。然而,应当理解,不旨在将本发明限制为所公开的一种或更多种特定形式,而是相反,旨在涵盖落在如所附权利要求所限定的本发明的精神和范围内的所有修改、替代构造和等同物。
在描述所公开的实施例的上下文中(尤其在以下权利要求的上下文中)术语“一个(a)”和“一种(an)”和“该(the)”以及类似指示物的使用应被解释为涵盖单数和复数两者,除非在此另外指明或与上下文明显矛盾。除非另外指出,否则术语“包含”、“具有”、“包括”和“含有”应被解释为开放式术语(即,意指“包括但不限于”)。术语“连接”在未经修改并且提及物理连接时应被解释为部分地或完全地包含在、附接至、或连接在一起,即使存在介入的东西。除非本文另有说明,否则本文对数值范围的记载仅旨在用作单独提及落入所述范围内的每个单独数值的简略方法,并且每个单独数值被并入说明书中,就像其在本文单独列举一样。除非另外指出或与上下文矛盾,否则术语“集合”(例如,“项目集”)或“子集”的使用应被解释为包括一个或更多个成员的非空集合。进一步地,除非另有说明或与上下文矛盾,否则相应集合的术语“子集”不一定表示相应集合的适当子集,而是该子集和相应集合可以是相等的。
连接性语言,诸如“A、B和C中的至少一个”形式的短语或“A、B和C中的至少一个”,除非另外明确规定或与上下文明显矛盾,用如通常用于呈现项目的上下文以其他方式理解,术语等可以是A或B或C,或者A和B和C的集合的任何非空子集。例如,在具有三个成员的集合的说明性示例中,连接性短语“A、B和C中的至少一个”和“A、B和C中的至少一个”是指以下集合中的任何集合:{A}、{B}、{C}、{A、B}、{A、C}、{B、C}、{A、B、C}。因此,此类连接性语言一般不旨在暗示某些实施例要求存在A中的至少一个、B中的至少一个以及C中的至少一个中的每一个。此外,除非另外指出或与上下文矛盾,否则术语“多个”指示为复数的状态(例如,“多个项目”指示多个项目)。多个中的项目的数目为至少两个,但当明确地或通过上下文如此指示时可能更多。进一步地,除非另外指明或另外从上下文清楚,否则短语“基于”是指“至少部分地基于”而不是“仅基于。”
除非本文中另有指示或与上下文明显矛盾,否则本文中所描述的过程的操作可以任何合适的顺序执行。在一个实施例中,诸如本文中描述的那些过程(或其变型和/或组合)之类的过程在配置有可执行指令的一个或更多个计算机系统的控制下执行,并且被实现为在一个或更多个处理器上共同执行的代码(例如,可执行指令、一个或更多个计算机程序或一个或更多个应用),由硬件执行或其组合。在一个实施例中,代码例如以包括可由一个或更多个处理器执行的多个指令的计算机程序的形式存储在计算机可读存储介质上。在一个实施例中,计算机可读存储介质是非暂态计算机可读存储介质,该非暂态计算机可读存储介质排除瞬态信号(例如,传播的瞬态电或电磁传输)但包括瞬态信号的收发器内的非瞬态数据存储电路(例如,缓冲区、高速缓存和队列)。在一个实施例中,代码(例如,可执行代码或源代码)被存储在其上存储有可执行指令(或用于存储可执行指令的其他存储器)的一个或更多个非暂态计算机可读存储介质的集合上,所述可执行指令当由计算机系统的一个或更多个处理器执行时(即,由于被执行),使所述计算机系统执行本文所述的操作。在一个实施例中,所述一组非暂态计算机可读存储介质包括多个非暂态计算机可读存储介质,并且所述多个非暂态计算机可读存储介质中的各个非暂态计算机可读存储介质中的一个或更多个缺少所述代码的全部,而所述多个非暂态计算机可读存储介质共同存储所述代码的全部。在一个实施例中,可执行指令被执行以使得不同的指令由不同的处理器执行——例如,非暂态计算机可读存储介质存储指令,并且主CPU执行指令中的一些,而图形处理器单元执行其他指令。在一个实施例中,计算机系统的不同组件具有单独的处理器,并且不同的处理器执行指令的不同子集。
因此,在一个实施例中,计算机系统被配置为实现单独地或共同地执行本文中所描述的过程的操作的一个或更多个服务,并且此类计算机系统配置有能够实现操作的执行的可应用的硬件和/或软件。进一步,实现本公开的实施例的计算机系统是单个设备,并且在另一个实施例中,是包括多个设备的分布式计算机系统,该多个设备被不同地操作以使得分布式计算机系统执行本文描述的操作并且使得单个设备不执行所有操作。
在此提供的任何和所有示例或示例性语言(例如,“诸如”)的使用仅旨在更好地说明本发明的实施例并且不对本发明的范围造成限制,除非另外要求。说明书中的语言不应被解释为指示任何未要求保护的元件对于本发明的实践是必不可少的。
在此描述了本公开的实施例,包括发明人已知的用于实施本发明的最佳模式。在阅读前述描述后,那些实施例的变化对本领域的普通技术人员而言可变得显而易见。诸位发明人预期熟练的本领域技术人员适当时采用此类变化并且发明人旨在使本公开的实施例以与在此具体描述的不同的方式来实践。因此,本公开的范围包括如适用法律所允许的所附权利要求书中记载的主题的所有修改和等效物。此外,除非本文另外指示或与上下文明显矛盾,否则上述元件在其所有可能变型中的任何组合均由本公开的范围涵盖。
在此引用的所有参考文献(包括出版物、专利申请、以及专利)均通过引用结合在此,其程度如同每个参考文献被单独地并且确切地指明通过引用结合在此,并且在此以其全文列出。
在说明书和权利要求书中,可以使用术语“耦合”和“连接”及其派生词。应当理解,这些术语可能不旨在作为彼此的同义词。而是,在具体示例中,“连接”或“耦合”可以用于指示两个或更多个元件彼此直接或间接物理或电接触。“耦合”还可以指两个或更多个元件彼此不直接接触,但仍彼此合作或交互。
除非另有明确说明,可以理解的是,贯穿本说明书的术语,诸如“处理”、“计算(computing)”、“计算(calculating)”、“确定”等,指计算机或计算系统或类似的电子计算设备的动作和/或过程,,其将被表示为计算系统的寄存器和/或存储器内的物理(诸如电子)量的数据操纵和/或变换为类似地表示为计算系统的存储器、寄存器或其他此类信息存储、传输或显示设备内的物理量的其他数据。
以类似的方式,术语“处理器”可以指处理来自寄存器和/或存储器的电子数据并且将该电子数据转换成可以存储在寄存器和/或存储器中的其他电子数据的任何设备或设备的一部分。作为非限制性实例,“处理器”可以是中央处理单元(CPU)或图形处理单元(GPU)。“计算平台”可以包括一个或更多个处理器。如在此使用的,“软件”过程可以包括例如随着时间执行工作的软件和/或硬件实体,诸如任务、线程和智能代理。而且,每个过程可指代用于按顺序或并行地、连续地或间歇地执行指令的多个过程。术语“系统”和“方法”在此可互换地使用,只要该系统可以体现一种或更多种方法并且这些方法可以被认为是系统。
在本文件中,可以参考获得、获取、接收、或输入模拟或数字数据到子系统、计算机系统、或计算机实现的机器中。获得、获取、接收或输入模拟数据和数字数据的过程可以以各种方式完成,例如通过接收作为函数调用的参数或对应用编程接口的调用的数据。在一些实现方式中,获得、获取、接收或输入模拟或数字数据的过程可以通过经由串行或并行接口传输数据来完成。在另一实现中,获得、获取、接收或输入模拟或数字数据的过程可通过经由计算机网络从提供实体向获取实体传送数据来完成。还可以参考提供、输出、传输、发送或呈现模拟或数字数据。在各个示例中,提供、输出、传输、发送或呈现模拟或数字数据的过程可以通过作为函数调用的输入或输出参数、应用编程接口的参数或进程间通信机制传送数据来完成。
尽管以上讨论阐述了所描述的技术的示例实现方式,但其他架构可用于实现所描述的功能,且被意图处于本发明的范围内。此外,尽管以上出于讨论的目的定义了职责的特定分布,但是取决于情况,可以以不同的方式分布和划分各种功能和职责。
另外,本公开的实施例可以鉴于以下条款来描述:
1.一种方法,包括:
至少部分地基于计算机程序要使用的数据之间的依赖关系来分配要由一个或更多个处理器使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据仅存储在所述连续分配的存储器中。
2.根据条款1所述的方法,其中:
所述持久性数据包括所述计算机程序的输入的集合;以及
所述持久性数据包括所述计算机程序的输出。
3.根据条款1或2所述的方法,其中:
所述存储器是图形处理单元上的存储器的连续块;以及
所述计算机程序在所述图形处理单元的处理器上运行。
4.根据条款3所述的方法,其中:
所述图形处理单元是计算机系统的部分,所述计算机系统具有与所述图形处理单元上的存储器分开的主存储器;以及
所述图形处理单元上的所述存储器的部分被映射到与所述主存储器共享的存储器空间中。
5.一种系统,包括:
一个或更多个处理器;以及
存储器,用于存储计算机可执行指令,所述计算机可执行指令如果被执行,则使所述一个或更多个处理器:
至少部分地基于计算机程序要使用的数据之间的依赖关系来分配要由所述计算机程序使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据仅存储在所述连续分配的存储器中。
6.根据条款5所述的系统,其中:
所述计算机程序描述计算;以及
所述计算机可执行指令还包括以下指令,所述指令如果被执行,则使所述一个或更多个处理器:
分析所述计算以生成表示由所述计算操纵的数据的树,所述树包含对应于所述计算的输入数据的叶节点的集合、对应于作为执行所述计算的部分而确定的中间数据的内部节点的集合、以及表示所述计算的结果的根节点;以及
至少部分地基于所述树来识别所述持久性数据。
7.根据条款5或6所述的系统,其中所述计算机可执行指令还包括以下指令,所述指令如果被执行,则使所述一个或更多个处理器:
分配图形处理单元内的存储器块,以充当所述计算机程序的存储器堆;以及
分配所述存储器堆上的存储器空间以存储所述中间数据。
8.根据条款7所述的系统,其中所述计算机可执行指令还包括以下指令,所述指令如果被执行,则使所述一个或更多个处理器:针对由所述计算机程序使用的变量,存储识别存储器的量以及相对于所述存储器堆的起点的存储器位置的信息。
9.根据条款8所述的系统,其中所述计算机可执行指令还包括以下指令,所述指令如果被执行,则使所述一个或更多个处理器:将所述存储器堆重定位到所述图形处理单元中的不同存储器位置。
10.根据条款9所述的系统,其中所述存储器堆的重定位由于存储器碎片整理操作而发生。
11.根据条款5-10中任一项所述的系统,其中通过在存储在图形处理单元上的分配表中记录保留存储器空间以供所述计算机程序使用的信息,来向所述计算机程序分配所述存储器空间。
12.根据条款5-11中任一项所述的系统,其中在单个分配操作中分配由所述计算机程序使用的所有GPU存储器。
13.一种或更多种非暂态计算机可读存储介质,其具有存储在其上的可执行指令,所述可执行指令由于由计算机系统的一个或更多个处理器执行而使所述计算机系统至少:
至少部分地基于计算机程序的数据之间的依赖关系来分配要由所述一个或更多个处理器使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据存储在所述连续分配的存储器中。
14.根据条款13所述的一种或更多种非暂态计算机可读存储介质,其中:
所述计算机系统包括主存储器和GPU存储器;
所述分配的存储器在所述GPU存储器中;以及
将所述分配的存储器映射到与主存储器共享的存储器空间中。
15.根据条款13或14所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统通过以下操作来识别所述持久性数据:
识别所述计算机程序的输入的集合;以及
识别所述计算机程序的输出的集合。
16.根据条款15所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统通过以下操作来识别所述持久性数据:
识别由所述计算机程序使用的中间数据的集合;以及
为所述中间数据的集合分配所述持久性数据不连续的存储器。
17.根据条款13-16中任一项所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统:
生成表示由所述计算机程序使用的数据的依赖关系的图,所述图能够用于识别程序输入和程序输出;以及
识别所述持久性数据包括所述程序输入和程序输出。
18.根据条款17所述的非暂态计算机可读存储介质,其中:
所述图被表示为树结构;
所述程序输入由所述树结构的叶节点表示;以及
所述程序输出由所述树结构的根节点表示。
19.根据条款13-18中任一项所述的非暂态计算机可读存储介质,其中:
所述存储器被所述计算机程序用作存储器堆;以及
所述计算机程序包括运行时组件,所述运行时组件管理变量到所述存储器堆内的存储器位置的分配。
20.根据条款19所述的非暂态计算机可读存储介质,其中:
所述计算机程序被提供有所述存储器堆的基地址;以及
使用相对于所述基地址的偏移来寻址所述变量。
此外,尽管已经用结构特征和/或方法动作专用的语言描述了本主题,但应当理解,所附权利要求书中定义的主题不必限于所描述的具体特征或动作。相反,这些具体特征和动作是作为实现权利要求的示例性形式来公开的。
Claims (20)
1.一种方法,包括:
至少部分地基于计算机程序要使用的数据之间的依赖关系来分配要由一个或更多个处理器使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据仅存储在所述连续分配的存储器中。
2.根据权利要求1所述的方法,其中:
所述持久性数据包括所述计算机程序的输入的集合;以及
所述持久性数据包括所述计算机程序的输出。
3.根据权利要求1所述的方法,其中:
所述存储器是图形处理单元上的存储器的连续块;以及
所述计算机程序在所述图形处理单元的处理器上运行。
4.根据权利要求3所述的方法,其中:
所述图形处理单元是计算机系统的部分,所述计算机系统具有与所述图形处理单元上的存储器分开的主存储器;以及
所述图形处理单元上的所述存储器的部分被映射到与所述主存储器共享的存储器空间中。
5.一种系统,包括:
一个或更多个处理器;以及
存储器,用于存储计算机可执行指令,所述计算机可执行指令如果被执行,则使所述一个或更多个处理器:
至少部分地基于计算机程序要使用的数据之间的依赖关系来分配要由所述计算机程序使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据仅存储在所述连续分配的存储器中。
6.根据权利要求5所述的系统,其中:
所述计算机程序描述计算;以及
所述计算机可执行指令还包括指令,所述指令如果被执行,则使所述一个或更多个处理器:
分析所述计算以生成表示由所述计算操纵的数据的树,所述树包含对应于所述计算的输入数据的叶节点的集合、对应于作为执行所述计算的部分而确定的中间数据的内部节点的集合、以及表示所述计算的结果的根节点;以及
至少部分地基于所述树来识别所述持久性数据。
7.根据权利要求5所述的系统,其中所述计算机可执行指令还包括指令,所述指令如果被执行,则使所述一个或更多个处理器:
分配图形处理单元内的存储器块,以充当所述计算机程序的存储器堆;以及
分配所述存储器堆上的存储器空间以存储所述中间数据。
8.根据权利要求7所述的系统,其中所述计算机可执行指令还包括指令,所述指令如果被执行,则使所述一个或更多个处理器:针对由所述计算机程序使用的变量,存储识别存储器的量以及相对于所述存储器堆的起点的存储器位置的信息。
9.根据权利要求8所述的系统,其中所述计算机可执行指令还包括指令,所述指令如果被执行,则使所述一个或更多个处理器:将所述存储器堆重新定位到所述图形处理单元中的不同存储器位置。
10.根据权利要求9所述的系统,其中所述存储器堆的重新定位由于存储器碎片整理操作而发生。
11.根据权利要求5所述的系统,其中通过在存储在图形处理单元上的分配表中记录保留存储器空间以供所述计算机程序使用的信息,来向所述计算机程序分配所述存储器空间。
12.根据权利要求5所述的系统,其中在单个分配操作中分配由所述计算机程序使用的所有GPU存储器。
13.一种或更多种非暂态计算机可读存储介质,其上存储有可执行指令,所述可执行指令由计算机系统的一个或更多个处理器执行,从而使所述计算机系统至少:
至少部分地基于计算机程序的数据之间的依赖关系来分配要由所述一个或更多个处理器使用的存储器,其中持久性数据将被存储在连续分配的存储器中;以及
将所述持久性数据存储在所述连续分配的存储器中。
14.根据权利要求13所述的一种或更多种非暂态计算机可读存储介质,其中:
所述计算机系统包括主存储器和GPU存储器;
分配的存储器在所述GPU存储器中;以及
将所述分配的存储器映射到与所述主存储器共享的存储器空间中。
15.根据权利要求13所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统通过以下操作来识别所述持久性数据:
识别所述计算机程序的输入的集合;以及
识别所述计算机程序的输出的集合。
16.根据权利要求15所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统通过以下操作来识别所述持久性数据:
识别由所述计算机程序使用的中间数据的集合;以及
为所述中间数据的集合分配所述持久性数据不连续的存储器。
17.根据权利要求13所述的一种或更多种非暂态计算机可读存储介质,其中所述可执行指令进一步使所述计算机系统:
生成表示由所述计算机程序使用的数据的依赖关系的图,所述图能够用于识别程序输入和程序输出;以及
识别所述持久性数据包括所述程序输入和程序输出。
18.根据权利要求17所述的非暂态计算机可读存储介质,其中:
所述图被表示为树结构;
所述程序输入由所述树结构的叶节点表示;以及
所述程序输出由所述树结构的根节点表示。
19.根据权利要求13所述的非暂态计算机可读存储介质,其中:
所述存储器被所述计算机程序用作存储器堆;以及
所述计算机程序包括运行时组件,所述运行时组件管理变量到所述存储器堆内的存储器位置的分配。
20.根据权利要求19所述的非暂态计算机可读存储介质,其中:
所述计算机程序被提供有所述存储器堆的基地址;以及
使用相对于所述基地址的偏移来寻址所述变量。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/279,884 | 2019-02-19 | ||
US16/279,884 US20200264970A1 (en) | 2019-02-19 | 2019-02-19 | Memory management system |
PCT/US2020/018667 WO2020172181A1 (en) | 2019-02-19 | 2020-02-18 | Memory management system |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113454592A true CN113454592A (zh) | 2021-09-28 |
Family
ID=69784623
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080015024.8A Pending CN113454592A (zh) | 2019-02-19 | 2020-02-18 | 存储器管理系统 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20200264970A1 (zh) |
CN (1) | CN113454592A (zh) |
DE (1) | DE112020000865T5 (zh) |
GB (2) | GB2596453B (zh) |
WO (1) | WO2020172181A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116137016A (zh) * | 2023-04-18 | 2023-05-19 | 北京麟卓信息科技有限公司 | 一种基于特化纹理队列的显存优化方法 |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11487674B2 (en) | 2019-04-17 | 2022-11-01 | Rankin Labs, Llc | Virtual memory pool within a network which is accessible from multiple platforms |
WO2020243244A1 (en) * | 2019-05-28 | 2020-12-03 | John Rankin | Supporting a virtual memory area at a remote computing machine |
US11474720B1 (en) * | 2022-04-04 | 2022-10-18 | Illuscio, Inc. | Systems and methods for implementing a custom heap memory manager to optimize compute kernel performance |
CN116139498B (zh) * | 2023-04-18 | 2023-07-04 | 深圳市益玩网络科技有限公司 | 游戏场景下基于内存管理的对象创建方法及相关产品 |
Family Cites Families (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6831652B1 (en) * | 2000-03-24 | 2004-12-14 | Ati International, Srl | Method and system for storing graphics data |
US6594749B1 (en) * | 2000-05-19 | 2003-07-15 | Sun Microsystems, Inc. | System and method for memory management using fixed-size blocks |
US6453403B1 (en) * | 2000-05-19 | 2002-09-17 | Sun Microsystems, Inc. | System and method for memory management using contiguous fixed-size blocks |
US7386687B2 (en) * | 2005-01-07 | 2008-06-10 | Sony Computer Entertainment Inc. | Methods and apparatus for managing a shared memory in a multi-processor system |
US20070150600A1 (en) * | 2005-12-22 | 2007-06-28 | International Business Machines Corporation | Method and apparatus for collecting data for characterizing HTTP session workloads |
US8140597B2 (en) * | 2007-08-29 | 2012-03-20 | International Business Machines Corporation | Computer system memory management |
US8370394B2 (en) * | 2009-07-17 | 2013-02-05 | International Business Machines Corporation | Parallel processing of data organized in a tree structure |
JP6104469B2 (ja) * | 2014-07-02 | 2017-03-29 | 三菱電機株式会社 | 行列生成装置及び行列生成方法及び行列生成プログラム |
US20160285970A1 (en) * | 2015-03-27 | 2016-09-29 | International Business Machines Corporation | Network communication between virtual machine applications via direct memory access |
RU2666334C2 (ru) * | 2015-06-30 | 2018-09-06 | Общество С Ограниченной Ответственностью "Яндекс" | Способ обработки данных |
US10621690B2 (en) * | 2015-09-17 | 2020-04-14 | Qualcomm Incorporated | Storing bandwidth-compressed graphics data |
US20170083343A1 (en) * | 2015-09-19 | 2017-03-23 | Microsoft Technology Licensing, Llc | Out of order commit |
US11907760B2 (en) * | 2016-09-23 | 2024-02-20 | Apple Inc. | Systems and methods of memory allocation for neural networks |
US11113190B2 (en) * | 2016-11-11 | 2021-09-07 | Microsoft Technology Licensing, Llc | Mutable type builder |
US9990281B1 (en) * | 2016-11-29 | 2018-06-05 | Sap Se | Multi-level memory mapping |
-
2019
- 2019-02-19 US US16/279,884 patent/US20200264970A1/en active Pending
-
2020
- 2020-02-18 GB GB2113309.5A patent/GB2596453B/en active Active
- 2020-02-18 WO PCT/US2020/018667 patent/WO2020172181A1/en active Application Filing
- 2020-02-18 CN CN202080015024.8A patent/CN113454592A/zh active Pending
- 2020-02-18 DE DE112020000865.7T patent/DE112020000865T5/de active Pending
- 2020-02-18 GB GB2307483.4A patent/GB2615925B/en active Active
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116137016A (zh) * | 2023-04-18 | 2023-05-19 | 北京麟卓信息科技有限公司 | 一种基于特化纹理队列的显存优化方法 |
CN116137016B (zh) * | 2023-04-18 | 2023-06-16 | 北京麟卓信息科技有限公司 | 一种基于特化纹理队列的显存优化方法 |
Also Published As
Publication number | Publication date |
---|---|
US20200264970A1 (en) | 2020-08-20 |
GB2596453B (en) | 2023-10-04 |
WO2020172181A1 (en) | 2020-08-27 |
GB2615925A (en) | 2023-08-23 |
GB2596453A (en) | 2021-12-29 |
GB2615925B (en) | 2024-01-03 |
GB202307483D0 (en) | 2023-07-05 |
DE112020000865T5 (de) | 2021-12-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10909033B1 (en) | Techniques for efficiently partitioning memory | |
US11847508B2 (en) | Convergence among concurrently executing threads | |
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 | |
US10614613B2 (en) | Reducing noise during rendering by performing parallel path space filtering utilizing hashing | |
EP3713093A1 (en) | Data compression for a neural network | |
CN113454592A (zh) | 存储器管理系统 | |
US10725837B1 (en) | Persistent scratchpad memory for data exchange between programs | |
US10810784B1 (en) | Techniques for preloading textures in rendering graphics | |
EP3742350A1 (en) | Parallelization strategies for training a neural network | |
CN113256475A (zh) | 图计算优化 | |
US20200159669A1 (en) | Distributed address translation in a multi-node interconnect fabric | |
US20210279837A1 (en) | Cooperative parallel memory allocation | |
US11907717B2 (en) | Techniques for efficiently transferring data to a processor | |
US10684824B2 (en) | Stochastic rounding of numerical values | |
US20230368501A1 (en) | Few-shot training of a neural network | |
US11625279B2 (en) | Read-write page replication for multiple compute units | |
US10915445B2 (en) | Coherent caching of data for high bandwidth scaling | |
US11836361B2 (en) | Implementing compiler-based memory safety for a graphic processing unit | |
US20230061154A1 (en) | Implementing hardware-based memory safety for a graphic processing unit | |
US20230297499A1 (en) | Locating a memory unit associated with a memory address utilizing a mapper | |
US20240118899A1 (en) | Scalarization of instructions for simt architectures |
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 |