CN114296945B - 用于对gpu显存进行复用的方法及装置 - Google Patents
用于对gpu显存进行复用的方法及装置 Download PDFInfo
- Publication number
- CN114296945B CN114296945B CN202210202697.5A CN202210202697A CN114296945B CN 114296945 B CN114296945 B CN 114296945B CN 202210202697 A CN202210202697 A CN 202210202697A CN 114296945 B CN114296945 B CN 114296945B
- Authority
- CN
- China
- Prior art keywords
- memory
- multiplexing
- allocated
- memory object
- multiplexed
- 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.)
- Active
Links
Images
Landscapes
- Memory System (AREA)
Abstract
本说明书实施例提供了用于对GPU显存进行复用的方法及装置。在该方法中,在应用程序执行循环任务的过程中,记录应用程序访问的复用内存对象以及各个复用内存对象的对象信息,循环执行以下分配过程,直至一个循环中的所有复用内存对象分配完成:按照各个复用内存对象的数据量从大到小的顺序依次选取待分配复用内存对象;针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,分配复用内存段;根据各个复用内存对象以及对应分配的复用内存段,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。
Description
技术领域
本说明书实施例涉及计算机技术领域,具体地,涉及用于对GPU显存进行复用的方法及装置。
背景技术
GPU是一种广泛使用的能够减少对CPU依赖、并进行部分原本CPU工作的微处理器,并且具有高性能计算加速特点,广泛用于AI(Artificial Intelligence)、机器学习以及在线服务等。
GPU在应用程序运行过程中,大多数的功能任务都运行在GPU上,GPU为运行在其上的任务提供显存,以供各个任务正常运行。针对每个任务,GPU从显存中为该任务分配一个存储空间以用于存储该任务所需访问的参数、数据等。当多个任务并行运行时,GPU需要同时为该多个并行任务中的每个并行任务都提供对应的存储空间。然而,GPU的显存容量有限,比如,一般在16GB、32GB等,这样有限的显存空间制约了应用程序运行较大型的计算任务,比如,在深度学习训练中,BERT-large模型、GPT-3等高精度模型都需要较大的显存才能运行在GPU之上,否则无法完成训练。因此,GPU的显存容量成为制约在GPU上运行大规模计算任务的瓶颈。
在专利公开号为CN113485832A的发明专利申请案中,公开了用于对物理内存池进行分配管理的方法及装置、物理内存池。物理内存池由系统中的GPU显存和其他物理内存构成,物理内存池的管理结构信息包括已释放内存对象集和已分配内存对象集,已释放内存对象集包括物理内存池中经过分配后当前已释放的空闲内存对象,已分配内存对象集包括物理内存池中已分配且当前在使用的内存对象。在该方法中,响应于请求指定容量的内存,在已释放内存对象集中查询是否存在指定容量的内存对象;若存在,对所查询到的指定容量的内存对象进行分配;以及将所分配的内存对象从已释放内存对象集中删除,并增加至已分配内存对象集。
发明内容
鉴于上述,本说明书实施例提供了用于对GPU显存进行复用的方法及装置。通过本说明书实施例的技术方案,在实现对GPU显存复用的同时,能够减少GPU显存的碎片,提高GPU显存的利用率。
根据本说明书实施例的一个方面,提供了一种用于对GPU显存进行复用的方法,包括:在应用程序执行循环任务的过程中,记录所述应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,所述对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,所述各个复用内存对象包括属于所述循环任务的一个循环中的复用内存对象;循环执行以下分配过程,直至所述循环任务的一个循环中的所有复用内存对象分配完成:按照所述各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在所述GPU显存中分配复用内存段;以及根据所述各个复用内存对象以及对应分配的复用内存段,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用。
根据本说明书实施例的另一方面,还提供一种用于对GPU显存进行复用的装置,包括:信息记录单元,在应用程序执行循环任务的过程中,记录所述应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,所述对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,所述各个复用内存对象包括属于所述应用程序所执行的一个循环中的复用内存对象;内存对象选取单元,按照所述各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;内存段分配单元,针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在所述GPU显存中分配复用内存段;以及数据迁移单元,根据所述各个复用内存对象以及对应分配的复用内存段,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用,其中,所述内存对象选取单元和所述内存段分配单元循环执行,直至所述应用程序所执行的一次循环中的所有复用内存对象分配完成。
根据本说明书实施例的另一方面,还提供一种电子设备,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上述任一所述的用于对GPU显存进行复用的方法。
根据本说明书实施例的另一方面,还提供一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的用于对GPU显存进行复用的方法。
根据本说明书实施例的另一方面,还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上任一所述的用于对GPU显存进行复用的方法。
附图说明
通过参照下面的附图,可以实现对于本说明书实施例内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
图1示出了根据本说明书实施例的用于对GPU显存进行复用的方法的一个示例的流程图。
图2A和2B分别示出了根据本说明书实施例的GPU显存中各个内存区域设置的一个示例的示意图。
图3示出了根据本说明书实施例的为待分配复用内存对象分配复用内存段的一个示例的流程图。
图4示出了根据本说明书实施例的确定复用内存段的一个示例的流程图。
图5示出了根据本说明书实施例的确定待分配复用内存对象与已分配的复用内存对象在访问时间上是否有交集的一个示例的示意图。
图6示出了根据本说明书实施例的执行数据迁出操作的一个示例的流程图。
图7示出了根据本说明书实施例的复用内存段的内存状态变化的一个示例的示意图。
图8示出了根据本说明书实施例的执行数据迁入操作的一个示例的流程图。
图9示出了根据本说明书实施例的GPU显存复用装置的一个示例的方框图。
图10示出了根据本说明书实施例的内存段分配单元的一个示例的方框图。
图11示出了根据本说明书实施例的数据迁移单元的一个示例的方框图。
图12示出了根据本说明书实施例的数据迁移单元的另一个示例的方框图。
图13示出了本说明书实施例的用于实现GPU显存复用方法的电子设备的方框图。
具体实施方式
以下将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书实施例内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
GPU是一种广泛使用的能够减少对CPU依赖、并进行部分原本CPU工作的微处理器,并且具有高性能计算加速特点,广泛用于AI(Artificial Intelligence)、机器学习以及在线服务等。
GPU在应用程序运行过程中,大多数的功能任务都运行在GPU上,GPU为运行在其上的任务提供显存,以供各个任务正常运行。针对每个任务,GPU从显存中为该任务分配一个存储空间以用于存储该任务所需访问的参数、数据等内存对象。当多个任务并行运行时,GPU需要同时为该多个并行任务中的每个并行任务都提供对应的存储空间。然而,GPU的显存容量有限,比如,一般在16GB、32GB等,这样有限的显存空间制约了应用程序运行较大型的计算任务,比如,在深度学习训练中,BERT-large模型、GPT-3等高精度模型都需要较大的显存才能运行在GPU之上,否则无法完成训练。因此,GPU的显存容量成为制约在GPU上运行大规模计算任务的瓶颈,如何高效地利用GPU显存为应用程序提供更大的可利用存储空间成为亟待解决的问题。
鉴于上述,本说明书实施例提供了用于对GPU显存进行复用的方法及装置。在该方法中,在应用程序执行循环任务的过程中,记录应用程序访问的复用内存对象以及对象信息,循环执行以下分配过程,直至应用程序所执行的一次循环中的所有复用内存对象分配完成:按照各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在GPU显存中分配复用内存段;以及根据各个复用内存对象以及对应分配的复用内存段,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。通过本说明书实施例的技术方案,在实现对GPU显存复用的同时,能够减少GPU显存的碎片,提高GPU显存的利用率。
下面结合附图对本说明书实施例提供的用于对GPU显存进行复用的方法及装置进行详细说明。
图1示出了根据本说明书实施例的用于对GPU显存进行复用的方法的一个示例100的流程图。
如图1所示,在1100,在应用程序执行循环任务的过程中,可以记录该应用程序访问的复用内存对象以及各个复用内存对象的对象信息。
在本说明书实施例中,应用程序可以运行在GPU系统架构的应用层,应用程序在运行过程中需要GPU显存的支持。应用程序可以运行需要多轮循环执行的循环任务,比如,机器学习、深度学习等。循环任务可以由多轮循环(以下将循环任务中的每一轮循环称为任务循环)操作构成,在执行循环任务的过程中,需要执行多轮任务循环操作,每一轮任务循环所执行的操作相同,所访问的参数、数值等内存对象相同,且访问的次序也相同。
在一个示例中,应用程序可以用于机器学习,所执行的循环任务是机器学习任务,此时,本公开中的GPU可以用于机器学习的应用场景。在一个示例中,应用程序所执行的机器学习可以是深度学习,则所执行的循环任务是深度学习任务。当应用程序用于深度学习时,应用程序例如可以是用户模型,用户模型可以为如下任何一种,但是不限于以下举例:CNN(Convolutional Neural Networks,卷积神经网络)、RNN(Recurrent Neural Network,循环神经网络)、LSTM( Longshort term memory,长短期记忆网络)、GAN(GenerativeAdversarial Networks,生成式对抗网络)等模型。下面以深度学习为例进行说明。
本说明书实施例的GPU显存复用方法应用于应用程序执行循环任务的过程中,可以在循环任务开始执行时开始执行本说明书实施例的方案,也可以在循环任务开始一段时间后开始执行本说明书实施例的方案。
在本说明书实施例中,内存对象可以包括应用程序运行时访问的参数、数值等,例如,深度学习过程所需访问的内存对象可以包括学习率、权重、层数等参数。内存对象可以存储在GPU显存、CPU内存等物理内存中,在内存对象存储在GPU显存中时,应用程序可以直接从GPU显存中访问内存对象。在内存对象存储在CPU内存中时,当应用程序需要访问该内存对象时,在访问之前,可以将CPU内存中的内存对象迁移至GPU显存中,然后应用程序可以从GPU显存中访问该内存对象。
在本说明书实施例中,复用内存对象是可以复用GPU显存的内存对象。对于各个复用内存对象来说,在应用程序运行过程中可以被多次访问,但复用内存对象不会固定且持续地存储在GPU显存中。每个复用内存对象可以复用GPU显存中的内存段,所复用的内存段也可以被其他复用内存对象复用,即,GPU显存中的内存段可以用于轮流存储各个复用内存对象。当一个复用内存对象需要被访问时,可以将该复用内存对象存储在GPU显存中所复用的内存段中,复用该内存段的其他复用内存对象可以暂时存储在CPU内存中。在复用内存对象被访问完成时,可以将该复用内存对象迁移至CPU内存存储,以使该内存段空闲出来,便于其他复用内存对象来继续复用该内存段。
在本说明书实施例中,各个复用内存对象的对象信息可以包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长等。
各个复用内存对象在一次循环中的被访问次数包括至少一次,当一个复用内存对象在一次循环中被多次访问时,每次被访问时该复用内存对象在GPU显存中的存储地址不变,从而应用程序每次可以从相同的存储地址来访问该复用内存对象。
被访问时间点可以用相对时间来表示,相对时间可以是以循环任务的起始时间点为参照的基准时间点,各个复用内存对象的被访问时间点均以循环任务的起始时间点作为参照的基准时间点所确定。此外,相对时间还可以是以第一个内存对象的被访问时间点为参照的基准时间点,其他各个内存对象的访问时间点均以第一个内存对象为参照的基准时间点所确定。
各个复用内存对象每次被访问时的访问时长可以表示该复用内存对象在每次被访问过程中需要在GPU显存中存储的最短时长。针对每个复用内存对象,在不同时间被访问时的访问时长可以不同,也可以相同。
在一个示例中,各个复用内存对象的对象信息还可以包括存储地址以及迁移时长等。该存储地址是对应的复用内存对象在CPU内存中的存储地址,各个复用内存对象在CPU内存中的存储地址可以固定,这样,各个复用内存对象在每次从GPU显存迁出时均迁移至该复用内存对象在CPU内存中的固定存储地址。迁移时长是对应的复用内存对象在CPU显存和CPU内存之间进行迁移所需的时间,迁移时长可以包括复用内存对象从GPU迁出至CPU的迁出时长以及从CPU迁入至GPU的迁入时长。
在一个示例中,针对各个复用内存对象,可以以数组的方式来记录该复用内存对象以及对应的对象信息,每个复用内存对象对应一个数组。每个数组可以包括序号,数组中的序号可以是按照记录的顺序依次排序得到的。根据序号可以确定出所记录的复用内存对象的总数量,以及在每个任务循环中被访问的复用内存对象的数量。例如,一个复用内存对象被记录后,所记录的数组可以表示为:<内存对象1:数据量、被访问次数、被访问时间点、访问时长、存储地址、迁移时长>。
在记录复用内存对象的一种操作方式中,在应用程序执行循环任务的过程中,应用程序需要访问GPU显存中的内存对象时,可以发送GPU访问请求,GPU访问请求中可以包括待访问的内存对象的信息。基于此,可以截获应用程序发送的各个GPU访问请求,所截获的GPU访问请求可以包括GPU显存的分配请求、释放请求、计算请求、IO请求等,比如,计算请求可以包括卷积计算请求,IO请求可以包括HostToDevice数据传输请求等。然后,对应获取每个GPU访问请求的内存对象的对象信息,针对迁移时长,可以在所请求的内存对象的迁移过程中监测迁移的时间,从而得到该内存对象的迁移时长。
在一个示例中,在记录复用内存对象的过程中,可以通过滑动窗口的方式来确定任务循环长度,所确定的任务循环长度可以用内存对象来表示。在一个任务循环中,访问的第一个内存对象可以作为该任务循环的起点,访问的最后一个内存对象可以作为该任务循环的终点,则第一个内存对象、最后一个内存对象以及中间访问的内存对象可以作为一个任务循环。
在滑动窗口的一种方式中,可以调整滑动窗口的长度,当某一长度的滑动窗口中的各个内存对象与相邻的滑动窗口中的各个内存对象相同时,可以确定该长度即为任务循环长度。
在本说明书实施例的一个示例中,针对应用程序所访问的内存对象,可以将其分为三种类型:用于复用GPU显存的复用内存对象、用于固定存储在GPU显存中的常驻内存对象以及在GPU显存中一次性存储的一次性内存对象。相应地,不同类型的内存对象对应的存储属性不同,存储属性可以包括一次性存储、固定存储以及复用存储。
常驻内存对象可以是数据量比较小的内存对象,这样存储在GPU显存中不会占用较大内存空间,从而GPU显存可以存储更多的常驻内存对象。在一个示例中,常驻内存对象的数据量小于复用内存对象的数据量。在另一个示例中,常驻内存对象在一次任务循环中的被访问次数多于复用内存对象在一次任务循环中的被访问次数。
此外,常驻内存对象在循环任务执行过程中可以被频繁访问,比如,常驻内存对象在深度学习的运行过程中被频繁访问。将常驻内存对象存储在GPU显存中,便于执行循环任务操作的应用对象可以直接从GPU显存中读取,避免了常驻内存对象存储在其他物理内存时需要将其迁移至GPU显存的数据迁移处理,提高了常驻内存对象的读取效率。
一次性内存对象是该内存对象被某函数使用一次后不会再访问的内存对象。在一个示例中,一次性内存对象在某函数中使用一次,该一次性内存对象仅在被该函数使用期间起作用,该函数调用结束后,该一次性内存对象不会再被访问。例如,适用于深度学习中的workspace是一次性内存对象,在workspace调用结束后便不会再使用。
在该示例中,GPU显存可以划分为包括至少三个内存区域,不同内存区域可以分别用于存储不同类型的内存对象。例如,GPU显存可以划分为三个内存区域:用于存储一次性内存对象的一次性存储内存区域、用于存储常驻内存对象的固定存储内存区域以及用于存储复用内存对象的复用内存区域。
在一个示例中,一次性存储内存区域和固定存储内存区域可以分别位于GPU显存的存储空间的两端,其他的中间部分的存储空间可以作为复用内存区域,则复用内存区域分别与一次性存储内存区域和固定存储内存区域相邻。图2A和2B分别示出了根据本说明书实施例的GPU显存中各个内存区域设置的一个示例的示意图。如图2A所示,固定存储内存区域的结束地址端与复用内存区域的起始地址端相邻,一次性存储内存区域的起始地址端与复用内存区域的结束地址端相邻。如图2B所示,固定存储内存区域的起始地址端与复用内存区域的结束地址端相邻,一次性存储内存区域的结束地址端与复用内存区域的起始地址端相邻。
在上述示例中,在应用程序执行循环任务的过程中,可以记录应用程序访问的各个内存对象以及各个内存对象对应的存储属性,然后,可以根据存储属性来确定各个内存对象的类型。例如,可以将存储属性为一次性存储的内存对象确定为一次性内存对象,可以将存储属性为固定存储的内存对象确定为常驻内存对象,可以将存储属性为复用存储的内存对象确定为复用内存对象。在一个示例中,在应用程序执行循环任务的过程中,可以记录应用程序访问的所有内存对象,该所有内存对象中可以包括各个类型的内存对象。
在确定出各个内存对象的类型后,可以根据各个内存对象的类型针对各个内存对象执行相应的操作,其中,不同类型的内存对象对应的执行操作可以不同。在一个示例中,针对复用内存对象,可以记录各个复用内存对象以及各个复用内存对象的对象信息。针对一次性存储内存对象,可以将该一次性存储内存对象存储至一次性存储内存区域,针对固定存储内存对象,可以将该固定存储内存对象存储至固定存储内存区域中。
在本说明书实施例中,在应用程序执行循环任务的过程中所执行的记录操作的时长不小于应用程序所执行的一个循环的时长。在一个示例中,在应用程序执行循环任务的过程中,可以仅将该过程中的一段时间用于记录复用内存对象以及对应的对象信息。用于记录的该一段时间包括至少一个任务循环的时间,比如,可以将开始执行后的前指定数目个任务循环过程确定为用于记录的时间段。
在该示例中,在记录过程中,可以监测是否满足记录终止条件,若不满足,则继续记录。若满足,则停止记录复用内存对象以及对应的对象信息。记录终止条件可以包括记录时长达到指定时长、记录的复用内存对象的数量达到指定数量以及循环轮次达到指定轮次中的至少一种。
针对记录时长达到指定时长,记录时长可以是以循环任务的开始作为起始时间点,还可以是以记录的第一个复用内存对象的时间点作为起始时间点。指定时长大于一个任务循环的时长。针对记录的复用内存对象的数量达到指定数量,指定数量大于一个任务循环内所有复用内存对象的数量。
通过设置记录终止条件,仅耗费一段时间来用于记录复用内存对象,该一段时间相比于整个循环执行过程所花费的时间来说很小,对整个循环执行效率的影响也很小。
回到图1,在1200,按照各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象。
在本说明书实施例中,可以每次选取一个复用内存对象作为待分配复用内存对象,第一次选取的复用内存对象是所记录的复用内存对象中最大的一个,之后每次选取的复用内存对象是与上一次所选取的复用内存对象相邻的、按照数据量从大到小的顺序排在该上一次所选取的复用内存对象后面一位的复用内存对象。
当存在多个复用内存对象的数据量相同时,数据量相同的多个复用内存对象之间的排序可以随机。
针对所选取的待分配复用内存对象,当该待分配复用内存对象是所选取的第一个复用内存对象时,该第一个复用内存对象是一个任务循环中的数据量最大的复用内存对象,GPU显存中还不存在用于分配给复用内存对象的复用内存段。此时,可以在GPU显存中新划分一个复用内存段,以分配给该待分配复用内存对象。在一个示例中,所划分的复用内存段的存储空间容量与该待分配复用内存对象的数据量相同,例如,数据量最大的待分配复用内存对象是300M,则为该待分配复用内存对象所划分的复用内存段的存储空间容量是300M。
在一个示例中,当GPU显存被划分的复用内存区域用于存储复用内存对象时,可以在该复用内存区域中为数据量最大的待分配复用内存对象新划分一个复用内存段。新划分的该复用内存段的起始地址可以是该复用内存区域的起始地址,后续在复用内存区域中新划分的复用内存段的起始地址是上一个划分的复用内存段的终止地址。通过按序在复用内存区域中分别划分各个复用内存段,可以减少GPU显存中的内存碎片。
针对所选取的待分配复用内存对象,当该待分配复用内存对象不是第一个复用内存对象时,则对该待分配复用内存对象执行1300的操作。
在1300,针对所选取的待分配复用内存对象,可以根据该待分配复用内存对象的对象信息以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在GPU显存中分配复用内存段。
在本说明书实施例中,GPU显存中当前已存在的复用内存段可以包括一个或多个,已存在的各个复用内存段被分配有对应的复用内存对象。每个复用内存段可以分配有至少一个复用内存对象。当有多个复用内存对象分配至同一个复用内存段时,则该多个复用内存对象可以按照被访问时间先后顺序依次复用该复用内存段。
针对每个复用内存段,该复用内存段的存储空间容量不小于分配给该复用内存段的各个复用内存对象的数据量,这样,该复用内存段能够被所分配的各个复用内存对象所复用。复用内存段的存储空间容量与所分配的复用内存对象中的数据量最大的复用内存对象的数据量相同。
在一个示例中,为各个待分配复用内存对象所分配的复用内存段可以包括:为该待分配复用内存对象分配时已存在的复用内存段中的其中一个复用内存段,或者从GPU显存中新划分的一个复用内存段。在一个示例中,当GPU显存中的复用内存区域用于存储复用内存对象时,新划分的一个复用内存段可以在该复用内存区域中划分得到。
在该示例中,在当前已存在的各个复用内存段中存在至少一个可以被待分配复用内存对象复用的复用内存段时,则可以将所存在的至少一个复用内存段中的其中一个复用内存段分配给该待分配复用内存对象。在当前已存在的各个复用内存段都不能被待分配复用内存对象复用时,则可以为该待分配复用内存对象从GPU显存中新划分一个复用内存段,以分配给该待分配复用内存对象。
图3示出了根据本说明书实施例的为待分配复用内存对象分配复用内存段的一个示例300的流程图。
如图3所示,在1310,针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定用于被该待分配复用内存对象复用的复用内存段。
在本说明书实施例中,每个复用内存对象的被访问次数、被访问时间点和访问时长可以用于确定该复用内存对象在GPU显存中占用的最少时间以及复用GPU显存的具体时间段。最少时间可以等于每一次访问的访问时长之和,每一次访问的具体时间段可以由被访问时间点和访问时长来确定。被访问时间点可以是访问复用内存对象的起始时间点,则访问复用内存对象的终止时间点是起始时间点加上访问时长得到。从而起始时间点和终止时间点可以确定访问的具体时间段。
图4示出了根据本说明书实施例的确定复用内存段的一个示例400的流程图。
如图4所示,在1311,针对所选取的待分配复用内存对象,可以根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定该待分配复用内存对象与当前已存在的复用内存段所分配的各个复用内存对象在访问时间上是否有交集。
针对每个复用内存对象,可以根据该复用内存对象的被访问时间点和访问时长确定每次被访问的访问时间段,以及根据被访问次数以及每次被访问的访问时间段,可以确定在一个任务循环中该复用内存对象需要复用GPU显存的访问时间段。每次访问对应一个访问时间段,当被访问次数有多次时,所确定的需要复用GPU显存的访问时间段有多个。
在一个任务循环中,可以将待分配复用内存对象对应的各个访问时间段分别与已分配的复用内存对象对应的各个访问时间段进行比对,以确定该待分配复用内存对象与已分配的各个复用内存对象在访问时间上是否有交集。需要说明的是,复用内存对象对应的访问时间段是该复用内存对象需要复用GPU显存的访问时间段,已分配的复用内存对象是GPU显存中当前已存在的复用内存段所分配的各个复用内存对象。
图5示出了根据本说明书实施例的确定待分配复用内存对象与已分配的复用内存对象在访问时间上是否有交集的一个示例的示意图。
如图5所示,时间轴T表示一个任务循环的时间,已分配的复用内存对象有两个:已分配复用内存对象1和已分配复用内存对象2,已分配复用内存对象1在一个任务循环内被访问三次,第一次访问的被访问时间点是t3,相应地访问时间段是t3- t4;第二次访问的被访问时间点是t7,相应地访问时间段是t7- t9;第三次访问的被访问时间点是t11,相应地访问时间段是t11- t12。已分配复用内存对象2在一个任务循环内被访问两次,第一次访问的被访问时间点是t5,相应地访问时间段是t5- t6;第二次访问的被访问时间点是t13,相应地访问时间段是t13- t14。待分配复用内存对象在一个任务循环内被访问两次,第一次访问的被访问时间点是t1,相应地访问时间段是t1- t2;第二次访问的被访问时间点是t8,相应地访问时间段是t8- t10。则可以将待分配复用内存对象的每个访问时间段与已分配复用内存对象的每个访问时间段进行比较,以确定是否在访问时间上存在交集。由图5可知,待分配复用内存对象的第一个访问时间段与其他已分配复用内存对象的各个访问时间段均没有交集,而待分配复用内存对象的第二个访问时间段与已分配复用内存对象1的第二个访问时间段在访问时间上有交集。
在1313,可以将所分配的各个复用内存对象在访问时间上与该待分配复用内存对象无交集的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段。
所确定的复用内存段中当前所分配的各个复用内存对象与该待分配复用内存对象在访问时间上均无交集,从而所确定的复用内存段可以被待分配复用内存对象所复用。以图5为例,复用内存段中当前所分配的复用内存对象包括已分配复用内存对象1和2,已分配复用内存对象1和2在访问时间上与待分配复用内存对象均无交集,则可以确定该复用内存段可以被待分配复用内存对象所复用。
在一个示例中,在应用程序执行循环任务的过程中,记录的针对各个复用内存对象的对象信息还可以包括迁移时长,每个复用内存对象的迁移时长可以包括该复用内存对象从GPU显存迁出至CPU内存的迁出时长和/或从CPU内存迁入至GPU显存的迁入时长。
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及迁移时长,以及与该待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移。
针对待分配复用内存对象的每次访问,可以将该访问的访问时长和迁移时长之和确定为该待分配复用内存对象在被应用程序访问时在GPU显存端的总耗时,在该总耗时的时间段内需要保证所分配的复用内存段为可复用状态。基于此,可以根据被访问时间点、访问时长以及迁移时长,确定出在该次访问中的耗时时间段,该耗时时间段包括访问时间段和迁移时长对应的迁移时间段。
可以根据每次访问的耗时时间段和与待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段,来确定该待分配复用内存对象在该间隔时间内能否完成迁移。这里的两次访问是待分配复用内存对象待复用的复用内存段中已分配的其他复用内存对象的被访问时间点对应的访问,两次访问与待分配复用内存对象的被访问时间点相邻是该两次访问对应的被访问时间点分别与待分配复用内存对象的被访问时间点最接近,该两次访问包括在待分配复用内存对象被访问之前的一次访问和在待分配复用内存对象被访问之后的一次访问。当待分配复用内存对象的被访问次数只有一次时,该两次访问是与针对该待分配复用内存对象的访问在时间上最接近的两次访问,其中,一次访问在针对该待分配复用内存对象的访问之前,另一次访问在针对该待分配复用内存对象的访问之后。当待分配复用内存对象的被访问次数有多次时,该两次访问包括时间较早的一次访问和时间较晚的一次访问,其中,时间较早的一次访问与针对待分配复用内存对象的多次访问中的最早一次访问接近,且在该针对待分配复用内存对象的最早一次访问之前;时间较晚的一次访问与针对待分配复用内存对象的多次访问中的最晚一次访问接近,且在该针对待分配复用内存对象的最晚一次访问之后。
在一个示例中,可以判断每次访问的耗时时间段是否在间隔时间段内,且耗时时间段对应的时长是否小于间隔时间段对应的时长。当判断结果为是时,表示该待分配复用内存对象在该间隔时间内可以完成迁移。当判断出每次访问的耗时时间段不在间隔时间段内、和/或耗时时间段对应的时长不小于间隔时间段对应的时长时,表示该待分配复用内存对象在该间隔时间内不能完成迁移,从而该复用内存段不能被该待分配复用内存对象所复用。
在确定待分配复用内存对象与当前已存在的复用内存段所分配的各个复用内存对象在访问时间上是否有交集、以及确定待分配复用内存对象在间隔时间段内能否完成迁移后,可以将满足指定复用条件的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段。其中,指定复用条件可以包括:在访问时间上与待分配复用内存对象无交集,以及在与待分配复用内存对象的访问时间点相邻的两次访问之间的间隔时间段内该待分配复用内存对象能够完成迁移。
在一个示例中,当前已存在的复用内存段所分配的复用内存对象中存在被多次访问的复用内存对象,该复用内存对象可以在不同的访问时间点被访问,从而该复用内存对象需要在不同的访问时间点时存储在GPU显存中,以便于应用程序从GPU显存中访问该复用内存对象。
针对所选取的待分配复用内存对象,可以根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及迁移时长,以及被多次访问的复用内存对象在相邻两次访问之间的间隔时间段,可以确定该待分配复用内存对象在该间隔时间内能否完成迁移。
在该示例中,同一复用内存对象包括被多次访问的复用内存对象中的其中一个复用内存对象,相邻两次访问是针对同一复用内存对象的两次访问,针对同一复用内存对象的相邻两次访问是该复用内存对象被访问两次,且两次访问相邻。以图5为例,针对已分配复用内存对象1来说,相邻两次访问之间的间隔时间段可以是第一次被访问与第二次被访问之间的间隔时间段,还可以是第二次被访问与第三次被访问之间的间隔时间段。
当待分配复用内存对象的被访问时间点在针对同一复用内存对象的相邻两次访问之间的间隔时间段内时,可以将该访问时间点对应的访问时长和迁移时长之和确定为该待分配复用内存对象在该访问时间点被访问时在GPU端的总耗时,再根据被访问时间点和总耗时可以确定耗时时间段,然后可以判断该耗时时间段是否在上述间隔时间段内、且耗时时间段对应的时长是否小于间隔时间段对应的时长。当判断结果为是时,表示该待分配复用内存对象在该间隔时间内可以完成迁移。当判断出该耗时时间段不在间隔时间段内、和/或耗时时间段对应的时长不小于间隔时间段对应的时长时,表示该待分配复用内存对象在该间隔时间内不能完成迁移,从而该复用内存段不能被该待分配复用内存对象所复用。
在该示例中,指定复用条件还可以包括:在待分配复用内存对象的访问时间点所属的针对同一复用内存对象的相邻两次访问之间的间隔时间段内,该待分配复用内存对象能够完成迁移。在该指定复用条件中,针对同一复用内存对象的相邻两次访问之间的间隔时间段内包括待分配复用内存对象的访问时间点。以图5为例,待分配复用内存对象的访问时间点是t8,针对已分配复用内存对象2的相邻两次访问是第一次访问和第二次访问,则该两次访问时间点t8在该相邻两次访问之间的间隔时间段内。
当确定待分配复用内存对象在间隔时间内能完成迁移时,所确定出的被待分配复用内存对象所复用的复用内存段满足的指定复用条件可以包括:在访问时间上与待分配复用内存对象无交集,以及在待分配复用内存对象的访问时间点所属的针对同一复用内存对象的相邻两次访问之间的间隔时间段内该待分配复用内存对象能够完成迁移。即,当待分配复用内存对象与复用内存段中所分配的各个复用内存对象在访问时间上无交集、且在待分配复用内存对象的访问时间点所属的针对同一复用内存对象的相邻两次访问之间的间隔时间段内该待分配复用内存对象能够完成迁移时,可以确定该复用内存段能够分配给该待分配复用内存对象。
回到图3,在1320,将待分配复用内存对象分配给所确定的复用内存段。
在一个示例中,当所确定出的复用内存段仅包括一个时,可以将待分配复用内存对象分配给所确定出的一个复用内存段。
在另一个示例中,当所确定出的复用内存段包括至少两个时,可以根据所确定出的各个复用内存段的存储空间以及待分配复用内存对象的数据量确定待复用的复用内存段,将该待分配复用内存对象分配给待复用的复用内存段。
在该示例中,所确定出的各个复用内存段的存储空间容量均大于待分配复用内存对象的数据量,因此,该各个复用内存段都能够存储待分配复用内存对象。在一个示例中,可以将所确定出的各个复用内存段分别与待分配复用内存对象进行比较,选出存储空间容量与待分配复用内存对象的数据量之间的差值最小的复用内存段,并将该复用内存段确定为待复用的复用内存段。在该示例中,通过选择存储空间容量与待分配复用内存对象的数据量之间的差值最小的复用内存段作为待复用的复用内存段,可以使得复用内存段中的存储空间的利用率最大化。
在另一个示例中,可以按照存储空间容量从大到小的顺序对所确定出的各个复用内存段进行排序,然后可以根据待分配复用内存对象的数据量,确定出存储空间容量与待分配复用内存对象的数据量之间的差值最小的复用内存段,并将该复用内存段确定为待复用的复用内存段。在该示例中,按照存储空间从大到小的顺序进行排序后,便于找到存储空间容量与待分配复用内存对象的数据量之间的差值最小的复用内存段,从而可以提高确定出待复用的复用内存段的效率。
在将待分配复用内存对象分配给所确定的复用内存段后,在后续的循环任务执行过程中,该待分配复用内存对象可以固定地复用该复用内存段。
回到图1,在1400,可以判断所述应用程序所执行的一次任务循环中的所有复用内存对象是否分配完成。
如果是,执行1500的操作。如果否,返回执行1200的操作。即,针对应用程序所执行的一个任务循环中的各个复用内存对象,可以按照各个复用内存对象的数据量从大到小的顺序,选取下一个复用内存对象作为待分配复用内存对象,该下一个复用内存对象是在各个复用内存对象按照数据量从大到小排列的序列中与上一轮内存对象分配循环中的待分配复用内存对象相邻的后一个复用内存对象。
在1500,可以根据各个复用内存对象以及对应分配的复用内存段,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。
在本说明书实施例中,在应用程序所执行的一个任务循环中的各个复用内存对象均分配复用内存段后,针对每个复用内存段,可以按照该复用内存段中所分配的各个复用内存对象的访问时间顺序,依次对各个复用内存对象在GPU显存和CPU内存之间进行数据迁移。
针对各个复用内存对象的数据迁移,在该复用内存对象需要被访问时,可以将该复用内存对象迁入至GPU显存;当该复用内存对象被访问完成时,可以将该复用内存对象迁出至CPU内存。
在一个示例中,一个复用内存段中所分配的复用内存对象可以包括多个复用内存对象,该多个复用内存对象的访问时间点各不相同。针对该复用内存段,可以先将访问时间点最早的复用内存对象迁移至该复用内存段中,在该复用内存对象被访问后,将该复用内存对象从复用内存段迁出至CPU内存中存储。然后,将下一个待访问的复用内存对象从CPU内存迁入至复用内存段,在该复用内存对象被访问后,将该复用内存对象从复用内存段迁出至CPU内存中存储。以此类推,直至该复用内存段中分配的所有复用内存对象被访问完成。
在一个示例中,可以根据各个复用内存对象、对应分配的复用内存段以及各个复用内存对象对应的数据依赖事件,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。
在该示例中,复用内存对象对应有计算子任务,复用内存对象对应的计算子任务是应用程序访问并调用该复用内存对象所执行的计算子任务。在一个任务循环中,应用程序可以访问多个内存对象,每个内存对象被访问时执行相应的计算子任务,从而在一个任务循环中可以包括多个计算子任务。例如,复用内存对象是卷积计算的参数,则应用程序执行深度学习操作时在每个任务循环过程中调用该卷积计算的参数,以用来执行卷积计算操作。
在一个示例中,在应用程序执行循环任务的过程中,处理器可以启动一个任务队列,以用于管理各个待执行的计算子任务,任务队列可以按照先进先出的原则对队列中的各个计算子任务进行管理。当一个复用内存对象对应的计算子任务需要被执行时,可以将该复用内存对象对应的计算子任务提交至任务队列待执行。
此外,各个复用内存对象的数据迁移操作可以响应于对应的迁移操作请求被触发来执行,每个数据迁移操作可以对应一个迁移操作请求。在每个复用内存对象需要执行数据迁移操作前,可以生成对应的迁移操作请求,迁移操作请求可以包括待迁移的复用内存对象的标识、待迁移的复用内存对象的起始存储地址和目的存储地址。例如,待迁移的复用内存对象是从GPU显存迁出至CPU内存,则该复用内存对象的起始存储地址是该复用内存对象在GPU显存中的存储地址,目的存储地址是该复用内存对象在CPU显存中的存储地址。当迁移操作请求被触发时,可以针对对应的复用内存对象执行数据迁移操作。
在一个示例中,在应用程序执行循环任务的过程中,处理器可以启动迁移请求队列,以用于管理各个迁移操作请求,迁移请求队列可以按照先进先出的原则对队列中的各个迁移操作请求进行管理。当一个复用内存对象需要执行数据迁移时,可以将该复用内存对象对应的迁移操作请求提交至迁移请求队列待执行。
在一个示例中,各个复用内存对象对应的迁移操作请求包括迁入操作请求和迁出操作请求,迁移请求队列可以包括迁入请求队列和迁出请求队列,各个迁入操作请求被提交至迁入请求队列中待执行,各个迁出操作请求被提交至迁出请求队列中待执行。迁入请求队列和迁出请求队列可以按照先进先出的原则对队列中的请求进行管理。迁入请求队列和迁出请求队列可以并行执行,通过并行执行可以提高针对各个复用内存对象的数据迁移效率。
针对数据依赖事件,每个复用内存对象对应的数据依赖事件可以用于将该复用内存对象对应的计算子任务与对应的迁移操作请求进行关联。数据依赖事件关联的计算子任务可以依赖于该数据依赖事件所关联的迁移操作请求,数据依赖事件关联的迁移操作请求可以依赖于该数据依赖事件所关联的计算子任务。计算子任务不同,对应的数据依赖事件可以不同,从而数据依赖事件所关联的迁移操作请求可以不同。
在一个示例中,当复用内存对象对应的数据依赖事件用于触发执行计算子任务时,该计算子任务可以响应于数据依赖事件而执行。该数据依赖事件可以包括该数据依赖事件所关联的迁移操作请求执行完成,即,当迁移操作请求对应的数据迁移执行完成时,数据依赖事件被触发,从而可以触发该数据依赖事件关联的计算子任务开始执行。
当复用内存对象对应的数据依赖事件用于触发执行针对迁移操作请求的提交操作时,该针对迁移操作请求的提交操作可以响应于数据依赖事件而执行。该数据依赖事件可以包括该数据依赖事件所关联的计算子任务执行完成,即,当数据依赖事件所关联的计算子任务执行完成时,数据依赖事件被触发,从而可以触发该数据依赖事件关联的迁移操作请求的提交操作执行。
在上述示例中,在循环任务执行过程中,针对各个复用内存对象的每一次数据迁移,除了按照该复用内存对象被分配的复用内存段中各个复用内存对象的访问时间顺序以外,还需要根据所关联的数据依赖事件。
图6示出了根据本说明书实施例的执行数据迁出操作的一个示例600的流程图。
如图6所示,在1511,针对待迁出的各个复用内存对象,可以在任务队列中添加针对该复用内存对象的计算子任务的数据依赖事件。
在该示例中,任务队列中的待执行的计算子任务可以是在需要执行针对该复用内存对象的计算子任务时提交至任务队列的。所添加的数据依赖事件与计算子任务关联,数据依赖事件可以包括所关联的计算子任务执行完成。
在1513,当数据依赖事件被触发时,将该复用内存对象的迁出操作请求提交至迁出请求队列。
在该示例中,当关联的计算子任务执行完成时,数据依赖事件可以被触发。数据依赖事件还可以与复用内存对象的迁出操作请求关联,从而在数据依赖事件被触发时,将该复用内存对象的迁出操作请求提交至迁出请求队列。
在1515,根据迁出请求队列中的迁出操作请求执行针对复用内存对象的数据迁出操作。
在迁出请求队列中可以按序轮流对各个迁出操作请求进行处理,在轮到对待迁出的复用内存对象的迁出操作请求进行处理时,响应于该迁出操作请求,执行针对该复用内存对象的数据迁出操作,以将该复用内存对象从GPU显存迁出至CPU内存。
在一个示例中,在数据迁出过程中,可以对执行数据迁出操作的复用内存对象所分配的复用内存段的内存状态进行更新。其中,迁出的内存状态可以包括迁出进行状态和已迁出状态。当复用内存段中的复用内存对象在执行迁出操作时,该复用内存段的内存状态为迁出进行状态。当复用内存对象已完成迁出操作时,此时的复用内存对象存储在CPU内存中,而迁出之前复用内存对象所在的复用内存段为闲置状态,该复用内存段的内存状态为已迁出状态。
在一个示例中,可以用内存段管理信息来指示GPU显存中的复用内存段的内存状态以及其他相关信息,每个复用内存段可以对应一个内存段管理信息。内存段管理信息可以包括对应的复用内存段的标识、内存状态信息、复用内存对象的标识以及复用内存对象的起始地址等。
复用内存对象的标识用于指示当前存储在复用内存段中的复用内存对象,当复用内存段中未存储复用内存对象时,复用内存对象的标识可以为空。复用内存对象的起始地址用于指示当前存储在复用内存段中的复用内存对象在该复用内存段中的起始地址。
内存状态信息可以包括四种状态信息:待分配的初始化状态(init)、已迁入状态(mapped)、迁移进行状态(swapping)以及已迁出状态(swapped)。其中,迁移进行状态(swapping)可以包括迁入进行状态(swapping_in)和迁出进行状态(swapping_out)。
内存段管理信息中的内存状态信息可以实时指示对应复用内存段的内存状态,当复用内存段的内存状态发生变化时,对应的内存段管理信息中的内存状态信息也进行相应的更新。
图7示出了根据本说明书实施例的复用内存段的内存状态变化的一个示例的示意图。
如图7所示,针对各个复用内存段,当该复用内存段中存储有复用内存对象时,该复用内存段对应的内存段管理信息中的内存状态指示为mapped,即已迁入状态。然后,当对该复用内存对象执行迁出操作(swapout)时,在执行迁出操作的过程中,内存段管理信息中的内存状态指示为swapping_out,即迁出进行状态。在迁出操作执行完成时,内存段管理信息中的内存状态指示为swapped,即已迁出状态。
通过内存段管理信息,可以实时地指示对应的复用内存段的内存状态,从而便于对各个复用内存段的内存状态进行监控及管理,进一步地便于根据复用内存段的内存状态对复用内存段进行复用。
图8示出了根据本说明书实施例的执行数据迁入操作的一个示例800的流程图。
如图8所示,在1521,针对待迁入的各个复用内存对象,响应于在该复用内存对象所分配的复用内存段中上一个被访问的复用内存对象已迁出,将该复用内存对象的迁入操作请求提交至迁入请求队列。
在该示例中,上一个被访问的复用内存对象与待迁入的复用内存对象分配复用同一个复用内存段,该上一个被访问的复用内存对象在上一次访问的时间点在待迁入的复用内存对象待访问的时间点之前,且两个时间点之间没有其他复用内存对象需要复用该复用内存段。
在一个示例中,可以监测上一个被访问的复用内存对象的迁出状态,迁出状态可以包括正在迁出状态和已迁出状态,当上一个被访问的复用内存对象的迁出状态变更为已迁出状态时,表示该复用内存对象已从GPU显存迁移至CPU内存中。此时,可以将待迁入的复用内存对象的迁入操作请求提交至迁入请求队列。
在一个示例中,根据待迁入的复用内存对象的迁入时长以及被访问时间点将该复用内存对象的迁入操作请求提交至迁入请求队列。
在该示例中,可以将针对该待迁入的复用内存对象的被访问时间点减去迁入时长,得到一个时间点,可以将该时间点确定为提交迁入操作请求值迁入请求队列的时间点。这样,在待迁入的复用内存对象迁入值GPU显存后,便能立刻被应用程序访问以执行相应的计算子任务,减少复用内存对象占用GPU显存的时间,提高针对各个复用内存对象的迁入操作以及计算子任务之间的紧凑性,从而提高迁入操作以及计算子任务的效率。
在一个示例中,考虑到其他因素,可以在迁入时长的基础上增加一定的时间欲量,该时间欲量可以指定。在该示例中,可以将针对该待迁入的复用内存对象的被访问时间点减去迁入时长以及时间欲量得到的时间点确定为提交迁入操作请求至迁入请求队列的时间点。
在一个示例中,可以根据复用内存对象的迁入时长和被访问时间点,以及该复用内存对象的数据量、总线性能和迁入请求队列的执行进度等中的至少一种,将该复用内存对象的迁入操作请求提交至迁入请求队列。
待迁入的复用内存对象的数据量、总线性能、迁入请求队列的执行进度和任务队列的执行进度中的每一种因素都能够影响复用内存对象从CPU内存迁入至GPU内存所花费的时间。例如,复用内存对象的数据量越大,则迁移速度越慢,所花费的时间越长;数据量越小,则迁移速度越快,所花费的时间越短。总线性能越低,则迁移速度越慢,所花费的时间越长;总线性能越高,则迁移速度越快,所花费的时间越短。迁入请求队列的执行进度越短,执行迁入操作请求的等待时间越短,从而总花费时间越短;迁入请求队列的执行进度越长,执行迁入操作请求的等待时间越长,从而总花费时间越长。
从而,可以根据复用内存对象的迁入时长和被访问时间点,以及该复用内存对象的数据量、总线性能和迁入请求队列的执行进度等中的至少一种,来确定提交迁入操作请求的时间点,在所确定的时间点将复用内存对象的迁入操作请求提交至迁入请求队列。
在1523,在迁入请求队列中添加针对该复用内存对象的迁入操作请求的数据依赖事件。
所添加的数据依赖事件与迁入操作请求关联,数据依赖事件可以包括所关联的迁入操作请求对应的迁入操作执行完成。此外,所添加的数据依赖事件还与待迁入的复用内存对象的计算子任务关联,从而在数据依赖事件被触发时,开始执行该待迁入的复用内存对象的计算子任务。
在1525,根据迁入请求队列中的该迁入操作请求执行针对该复用内存对象的数据迁入操作。
迁入请求队列中按序轮流对各个迁入操作请求进行处理,在轮到对待迁入的复用内存对象的迁入操作请求进行处理时,响应于该迁入操作请求,执行针对该复用内存对象的数据迁入操作,以将该复用内存对象从CPU显存迁出至GPU内存。
在1527,响应于数据迁入操作完成,触发所添加的数据依赖事件,以执行任务队列中该复用内存对象的计算子任务。
在一个示例中,在数据迁入过程中,可以对执行数据迁入操作的复用内存对象所分配的复用内存段的内存状态进行更新。其中,迁入的内存状态可以包括迁入进行状态和已迁入状态。当复用内存段中的复用内存对象在执行迁入操作时,该复用内存段的内存状态为迁入进行状态。当复用内存对象已完成迁入操作时,此时的复用内存对象存储在GPU内存中的复用内存段中,该复用内存段的内存状态为已迁入状态。
以图7为例,针对各个复用内存段,当该复用内存段中未存储复用内存对象时,该复用内存段对应的内存段管理信息中的内存状态指示为swapped,即数据已迁出状态。然后,当对该复用内存对象执行迁入操作(swapin)时,在执行迁入操作的过程中,内存段管理信息中的内存状态指示为swapping_in,即迁入进行状态。在迁入操作执行完成时,内存段管理信息中的内存状态指示为mapped,即已迁入状态。
图9示出了根据本说明书实施例的GPU显存复用装置900的一个示例的方框图。
如图9所示,GPU显存复用装置900包括信息记录单元910、内存对象选取单元920、内存段分配单元930和数据迁移单元940。
信息记录单元910,可以被配置为在应用程序执行循环任务的过程中,记录应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,各个复用内存对象包括属于应用程序所执行的一个循环中的复用内存对象。
在一个示例中,信息记录单元910还可以被配置为:在应用程序执行循环任务的过程中,记录应用程序访问的各个内存对象以及各个内存对象的存储属性,存储属性包括一次性存储、固定存储以及复用存储;以及根据各个内存对象的存储属性针对各个内存对象执行相应的操作。
在一个示例中,信息记录单元910还可以被配置为:在满足记录终止条件时,停止记录复用内存对象以及对应的对象信息,其中,记录终止条件包括记录时长达到指定时长、记录的复用内存对象的数量达到指定数量以及循环轮次达到指定轮次中的至少一种。
内存对象选取单元920,可以被配置为按照各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象。
内存段分配单元930,可以被配置为针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在GPU显存中分配复用内存段。
其中,内存对象选取单元920和内存段分配单元930循环执行,直至应用程序所执行的一次循环中的所有复用内存对象分配完成。
在一个示例中,为各个待分配复用内存对象所分配的复用内存段包括:为该待分配复用内存对象分配时当前已存在的复用内存段中的一个,或者从GPU显存中新划分的一个复用内存段。
数据迁移单元940,可以被配置为根据各个复用内存对象以及对应分配的复用内存段,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。
在一个示例中,数据迁移单元940还可以被配置为:根据各个复用内存对象、对应分配的复用内存段以及各个复用内存对象对应的数据依赖事件,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。其中,每个复用内存对象对应的数据依赖事件用于将该复用内存对象对应的计算子任务与对应的迁移操作请求进行关联。
在一个示例中,各个复用内存对象对应的计算子任务被提交至任务队列中待执行,各个复用内存对象对应的迁移操作请求被提交至迁移请求队列中待执行。
在一个示例中,各个复用内存对象对应的迁移操作请求包括迁入操作请求和迁出操作请求,迁移请求队列包括迁入请求队列和迁出请求队列,各个迁入操作请求被提交至迁入请求队列中待执行,各个迁出操作请求被提交至迁出请求队列中待执行。
图10示出了根据本说明书实施例的内存段分配单元930的一个示例的方框图。
如图10所示,内存段分配单元930可以包括内存段确定模块931和内存段分配模块933。
内存段确定模块931,可以被配置为针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定用于被该待分配复用内存对象复用的复用内存段。
在一个示例中,内存段确定模块931还可以被配置为:针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定该待分配复用内存对象与当前已存在的复用内存段所分配的各个复用内存对象在访问时间上是否有交集;以及将所分配的各个复用内存对象在访问时间上与该待分配复用内存对象无交集的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段。
在一个示例中,信息记录单元910还可以被配置为:在应用程序执行循环任务的过程中,记录各个复用内存对象在GPU显存和CPU内存之间进行迁移的迁移时长,迁移时长包括从GPU显存迁出至CPU内存的迁出时长和从CPU内存迁入至GPU显存的迁入时长。
内存段确定模块931还可以被配置为:针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及迁移时长,以及与该待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移,这里的两次访问是该待分配复用内存对象待复用的复用内存段中已分配的其他复用内存对象的被访问时间点对应的访问;以及将满足指定复用条件的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段,其中,指定复用条件包括:在访问时间上与待分配复用内存对象无交集,以及与待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段内该待分配复用内存对象能够完成迁移。
在一个示例中,在当前已存在的复用内存段所分配的复用内存对象中存在被多次访问的复用内存对象时,内存段确定模块931还可以被配置为:针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及迁移时长,以及被多次访问的复用内存对象在相邻两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移。其中,指定复用条件还包括:在待分配复用内存对象的访问时间点所属的针对同一复用内存对象的相邻两次访问之间的间隔时间段内,该待分配复用内存对象能够完成迁移,同一复用内存对象包括被多次访问的复用内存对象中的其中一个复用内存对象。
内存段分配模块933,可以被配置为将该待分配复用内存对象分配给所确定的复用内存段。
在一个示例中,内存段分配模块933还可以被配置为:当所确定出的复用内存段包括至少两个时,根据所确定出的各个复用内存段的存储空间以及该待分配复用内存对象的数据量确定待复用的复用内存段;以及将该待分配复用内存对象分配给待复用的复用内存段。
图11示出了根据本说明书实施例的数据迁移单元940的一个示例的方框图。
如图11所示,数据迁移单元940可以包括:事件添加模块941、迁出请求提交模块942和迁出执行模块943。
事件添加模块941,可以被配置为针对待迁出的各个复用内存对象,在任务队列中添加针对该复用内存对象的计算子任务的数据依赖事件。
迁出请求提交模块942,可以被配置为当该数据依赖事件被触发时,将该复用内存对象的迁出操作请求提交至迁出请求队列。
迁出执行模块943,可以被配置为根据迁出请求队列中的该迁出操作请求执行针对该复用内存对象的数据迁出操作。
在一个示例中,数据迁移单元940还可以包括状态更新模块,该状态更新模块可以被配置为:在数据迁移过程中,对执行数据迁移操作的复用内存对象所分配的复用内存段的内存状态进行更新。
图12示出了根据本说明书实施例的数据迁移单元940的另一个示例的方框图。
如图12所示,数据迁移单元940可以包括:迁入请求提交模块945、事件添加模块946、迁入执行模块947和任务执行模块948。
迁入请求提交模块945,被配置为针对待迁入的各个复用内存对象,响应于在该复用内存对象所分配的复用内存段中上一个被访问的复用内存对象已迁出,将该复用内存对象的迁入操作请求提交至迁入请求队列。
在一个示例中,迁入请求提交模块945还可以被配置为:根据该复用内存对象的迁入时长以及被访问时间点将该复用内存对象的迁入操作请求提交至迁入请求队列。
在一个示例中,迁入请求提交模块945还可以被配置为:根据该复用内存对象的迁入时长和被访问时间点,以及该复用内存对象的数据量、总线性能和迁入请求队列的执行进度中的至少一种,将该复用内存对象的迁入操作请求提交至迁入请求队列。
事件添加模块946,被配置为在迁入请求队列中添加针对该复用内存对象的迁入操作请求的数据依赖事件。需要说明的是,事件添加模块946与事件添加模块941可以是同一功能模块,还可以是不同的功能模块。
迁入操作执行模块947,被配置为根据迁入请求队列中的该迁入操作请求执行针对该复用内存对象的数据迁入操作。
任务执行模块948,被配置为响应于数据迁入操作完成,触发所添加的数据依赖事件,以执行任务队列中该复用内存对象的计算子任务。
以上参照图1到图12,对根据本说明书实施例的用于对GPU显存进行复用的方法及装置的实施例进行了描述。
本说明书实施例的用于对GPU显存进行复用的装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将存储器中对应的计算机程序指令读取到内存中运行形成的。在本说明书实施例中,用于对GPU显存进行复用的装置例如可以利用电子设备实现。
图13示出了本说明书实施例的用于实现GPU显存复用方法的电子设备1300的方框图。
如图13所示,电子设备1300可以包括至少一个处理器1310、存储器(例如,非易失性存储器)1320、内存1330和通信接口1340,并且至少一个处理器1310、存储器1320、内存1330和通信接口1340经由总线1350连接在一起。至少一个处理器1310执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器1310:在应用程序执行循环任务的过程中,记录应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,各个复用内存对象包括属于循环任务的一个循环中的复用内存对象;循环执行以下分配过程,直至循环任务的一个循环中的所有复用内存对象分配完成:按照各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在GPU显存中分配复用内存段;以及根据各个复用内存对象以及对应分配的复用内存段,在循环任务执行过程中将各个复用内存对象在GPU显存和CPU内存之间进行数据迁移,以对GPU显存进行复用。
应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1310进行本说明书的各个实施例中以上结合图1-12描述的各种操作和功能。
根据一个实施例,提供了一种例如机器可读介质的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1-12描述的各种操作和功能。
具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
本说明书各部分操作所需的计算机程序代码可以用任意一种或多种程序语言编写,包括面向对象编程语言,如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB、NET以及Python等,常规程序化编程语言如C语言、Visual Basic 2003、Perl、COBOL 2002、PHP以及ABAP,动态编程语言如Python、Ruby和Groovy,或者其他编程语言等。该程序编码可以在用户计算机上运行,或者作为独立的软件包在用户计算机上运行,或者部分在用户计算机上运行另一部分在远程计算机运行,或者全部在远程计算机或服务器上运行。在后一种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或者在云计算环境中,或者作为服务使用,比如软件即服务(SaaS)。
可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD-RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
以上结合附图详细描述了本说明书的实施例的可选实施方式,但是,本说明书的实施例并不限于上述实施方式中的具体细节,在本说明书的实施例的技术构思范围内,可以对本说明书的实施例的技术方案进行多种简单变型,这些简单变型均属于本说明书的实施例的保护范围。
本说明书内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本说明书内容。对于本领域普通技术人员来说,对本说明书内容进行的各种修改是显而易见的,并且,也可以在不脱离本说明书内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本说明书内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。
Claims (22)
1.一种用于对GPU显存进行复用的方法,包括:
在应用程序执行循环任务的过程中,记录所述应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,所述对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,所述各个复用内存对象包括属于所述循环任务的一个循环中的复用内存对象;
循环执行以下分配过程,直至所述循环任务的一个循环中的所有复用内存对象分配完成:
按照所述各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在所述GPU显存中分配复用内存段;以及
根据所述各个复用内存对象以及对应分配的复用内存段,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用。
2.如权利要求1所述的方法,其中,为各个待分配复用内存对象所分配的复用内存段包括:为该待分配复用内存对象分配时已存在的复用内存段中的一个,或者从所述GPU显存中新划分的一个复用内存段。
3.如权利要求2所述的方法,其中,针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在所述GPU显存中分配复用内存段包括:
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定用于被该待分配复用内存对象复用的复用内存段;以及
将该待分配复用内存对象分配给所确定的复用内存段。
4.如权利要求3所述的方法,其中,将该待分配复用内存对象分配给所确定的复用内存段包括:
当所确定出的复用内存段包括至少两个时,根据所确定出的各个复用内存段的存储空间以及该待分配复用内存对象的数据量确定待复用的复用内存段;以及
将该待分配复用内存对象分配给所述待复用的复用内存段。
5.如权利要求3所述的方法,其中,针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定用于被该待分配复用内存对象复用的复用内存段包括:
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的在一次循环中的被访问次数、被访问时间点和访问时长,确定该待分配复用内存对象与当前已存在的复用内存段所分配的各个复用内存对象在访问时间上是否有交集;以及
将所分配的各个复用内存对象在访问时间上与该待分配复用内存对象无交集的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段。
6.如权利要求5所述的方法,还包括:
在所述应用程序执行循环任务的过程中,记录所述各个复用内存对象在所述GPU显存和所述CPU内存之间进行迁移的迁移时长,所述迁移时长包括从所述GPU显存迁出至所述CPU内存的迁出时长和从所述CPU内存迁入至所述GPU显存的迁入时长;以及
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述迁移时长,以及与该待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移,所述两次访问是该待分配复用内存对象待复用的复用内存段中已分配的其他复用内存对象的被访问时间点对应的访问;以及
将在访问时间上与该待分配复用内存对象无交集的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段包括:
将满足指定复用条件的复用内存段确定为用于被该待分配复用内存对象复用的复用内存段,其中,所述指定复用条件包括:在访问时间上与待分配复用内存对象无交集,以及与待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段内该待分配复用内存对象能够完成迁移。
7.如权利要求6所述的方法,其中,在所述当前已存在的复用内存段所分配的复用内存对象中存在被多次访问的复用内存对象时,
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述迁移时长,以及与该待分配复用内存对象的被访问时间点相邻的两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移包括:
针对所选取的待分配复用内存对象,根据该待分配复用内存对象的被访问次数、被访问时间点、访问时长以及所述迁移时长,以及所述被多次访问的复用内存对象在相邻两次访问之间的间隔时间段,确定该待分配复用内存对象在该间隔时间段内能否完成迁移,
其中,所述指定复用条件还包括:在待分配复用内存对象的访问时间点所属的针对同一复用内存对象的相邻两次访问之间的间隔时间段内,该待分配复用内存对象能够完成迁移,所述同一复用内存对象包括所述被多次访问的复用内存对象中的其中一个复用内存对象。
8.如权利要求1所述的方法,其中,根据所述各个复用内存对象以及对应分配的复用内存段,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用包括:
根据所述各个复用内存对象、对应分配的复用内存段以及所述各个复用内存对象对应的数据依赖事件,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用,
其中,每个复用内存对象对应的数据依赖事件用于将该复用内存对象对应的计算子任务与对应的迁移操作请求进行关联。
9.如权利要求8所述的方法,其中,所述各个复用内存对象对应的计算子任务被提交至任务队列中待执行,所述各个复用内存对象对应的迁移操作请求被提交至迁移请求队列中待执行。
10.如权利要求9所述的方法,其中,所述各个复用内存对象对应的迁移操作请求包括迁入操作请求和迁出操作请求,所述迁移请求队列包括迁入请求队列和迁出请求队列,各个迁入操作请求被提交至迁入请求队列中待执行,各个迁出操作请求被提交至迁出请求队列中待执行。
11.如权利要求10所述的方法,其中,根据所述各个复用内存对象、对应分配的复用内存段以及所述各个复用内存对象对应的数据依赖事件,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用包括:
针对待迁出的各个复用内存对象,在所述任务队列中添加针对该复用内存对象的计算子任务的数据依赖事件;
当该数据依赖事件被触发时,将该复用内存对象的迁出操作请求提交至所述迁出请求队列;以及
根据所述迁出请求队列中的该迁出操作请求执行针对该复用内存对象的数据迁出操作。
12.如权利要求10所述的方法,其中,根据所述各个复用内存对象、对应分配的复用内存段以及所述各个复用内存对象对应的数据依赖事件,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用包括:
针对待迁入的各个复用内存对象,响应于在该复用内存对象所分配的复用内存段中上一个被访问的复用内存对象已迁出,将该复用内存对象的迁入操作请求提交至所述迁入请求队列;
在所述迁入请求队列中添加针对该复用内存对象的迁入操作请求的数据依赖事件;
根据所述迁入请求队列中的该迁入操作请求执行针对该复用内存对象的数据迁入操作;以及
响应于所述数据迁入操作完成,触发所添加的数据依赖事件,以执行所述任务队列中该复用内存对象的计算子任务。
13.如权利要求12所述的方法,其中,将该复用内存对象的迁入操作请求提交至所述迁入请求队列包括:
根据该复用内存对象的迁入时长以及被访问时间点将该复用内存对象的迁入操作请求提交至所述迁入请求队列。
14.如权利要求13所述的方法,其中,根据该复用内存对象的迁入时长以及被访问时间点将该复用内存对象的迁入操作请求提交至所述迁入请求队列包括:
根据该复用内存对象的迁入时长和被访问时间点,以及该复用内存对象的数据量、总线性能和所述迁入请求队列的执行进度中的至少一种,将该复用内存对象的迁入操作请求提交至所述迁入请求队列。
15.如权利要求11或12所述的方法,还包括:
在数据迁移过程中,对执行数据迁移操作的复用内存对象所分配的复用内存段的内存状态进行更新。
16.如权利要求1所述的方法,还包括:
在所述应用程序执行循环任务的过程中,记录所述应用程序访问的各个内存对象以及所述各个内存对象的存储属性,所述存储属性包括一次性存储、固定存储以及复用存储;以及
根据所述各个内存对象的存储属性针对所述各个内存对象执行相应的操作。
17.如权利要求1所述的方法,还包括:
在满足记录终止条件时,停止记录所述复用内存对象以及对应的对象信息,其中,所述记录终止条件包括记录时长达到指定时长、记录的复用内存对象的数量达到指定数量以及循环轮次达到指定轮次中的至少一种。
18.如权利要求1所述的方法,其中,所述应用程序用于机器学习。
19.一种用于对GPU显存进行复用的装置,包括:
信息记录单元,在应用程序执行循环任务的过程中,记录所述应用程序访问的用于复用GPU显存的复用内存对象以及各个复用内存对象的对象信息,所述对象信息包括数据量、在一次循环中的被访问次数、被访问时间点以及每次被访问的访问时长,所述各个复用内存对象包括属于所述应用程序所执行的一个循环中的复用内存对象;
内存对象选取单元,按照所述各个复用内存对象的数据量从大到小的顺序,依次选取复用内存对象作为待分配复用内存对象;
内存段分配单元,针对所选取的待分配复用内存对象,根据该待分配复用内存对象的对象信息以及所述GPU显存中当前已存在的复用内存段所分配的各个复用内存对象的对象信息,为该待分配复用内存对象在所述GPU显存中分配复用内存段;以及
数据迁移单元,根据所述各个复用内存对象以及对应分配的复用内存段,在所述循环任务执行过程中将所述各个复用内存对象在所述GPU显存和CPU内存之间进行数据迁移,以对所述GPU显存进行复用,
其中,所述内存对象选取单元和所述内存段分配单元循环执行,直至所述应用程序所执行的一次循环中的所有复用内存对象分配完成。
20.一种电子设备,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如权利要求1-18中任一所述的方法。
21.一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1-18中任一所述的方法。
22.一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如权利要求1-18中任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210202697.5A CN114296945B (zh) | 2022-03-03 | 2022-03-03 | 用于对gpu显存进行复用的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210202697.5A CN114296945B (zh) | 2022-03-03 | 2022-03-03 | 用于对gpu显存进行复用的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114296945A CN114296945A (zh) | 2022-04-08 |
CN114296945B true CN114296945B (zh) | 2022-05-20 |
Family
ID=80978540
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210202697.5A Active CN114296945B (zh) | 2022-03-03 | 2022-03-03 | 用于对gpu显存进行复用的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114296945B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103020320A (zh) * | 2013-01-11 | 2013-04-03 | 西安交通大学 | 一种基于动态搜索的运行时gpu显存级数据复用优化方法 |
CN109766183A (zh) * | 2018-12-28 | 2019-05-17 | 郑州云海信息技术有限公司 | 一种集群gpu复用及智能负载的方法及系统 |
CN110457135A (zh) * | 2019-08-09 | 2019-11-15 | 重庆紫光华山智安科技有限公司 | 一种资源调度方法、装置及共享gpu显存的方法 |
CN111047505A (zh) * | 2019-12-20 | 2020-04-21 | 北京浪潮数据技术有限公司 | 一种gpu复用方法、装置、设备及可读存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20200264891A1 (en) * | 2019-02-20 | 2020-08-20 | Nanjing Iluvatar CoreX Technology Co., Ltd. (DBA “Iluvatar CoreX Inc. Nanjing”) | Constant scalar register architecture for acceleration of delay sensitive algorithm |
-
2022
- 2022-03-03 CN CN202210202697.5A patent/CN114296945B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103020320A (zh) * | 2013-01-11 | 2013-04-03 | 西安交通大学 | 一种基于动态搜索的运行时gpu显存级数据复用优化方法 |
CN109766183A (zh) * | 2018-12-28 | 2019-05-17 | 郑州云海信息技术有限公司 | 一种集群gpu复用及智能负载的方法及系统 |
CN110457135A (zh) * | 2019-08-09 | 2019-11-15 | 重庆紫光华山智安科技有限公司 | 一种资源调度方法、装置及共享gpu显存的方法 |
CN111047505A (zh) * | 2019-12-20 | 2020-04-21 | 北京浪潮数据技术有限公司 | 一种gpu复用方法、装置、设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114296945A (zh) | 2022-04-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9959313B2 (en) | Database management system and method capable of dynamically issuing inputs/outputs and executing operations in parallel | |
US20180032380A1 (en) | Co-allocating a reservation spanning different compute resources types | |
US9715406B2 (en) | Assigning and scheduling threads for multiple prioritized queues | |
US11175940B2 (en) | Scheduling framework for tightly coupled jobs | |
US20140344814A1 (en) | Scheduling homogeneous and heterogeneous workloads with runtime elasticity in a parallel processing environment | |
JP2006515690A (ja) | 複数のプロセッサを有するデータ処理システムと、複数のプロセッサを有するデータ処理システムのためのタスクスケジューラと、タスクスケジューリングの対応する方法 | |
CN108549574B (zh) | 线程调度管理方法、装置、计算机设备和存储介质 | |
US20100325637A1 (en) | Allocation of resources to a scheduler in a process | |
CN107958018B (zh) | 缓存中的数据更新方法、装置及计算机可读介质 | |
CN110597606B (zh) | 一种高速缓存友好的用户级线程调度方法 | |
KR20130033020A (ko) | 매니코어 시스템에서의 파티션 스케줄링 장치 및 방법 | |
US8291426B2 (en) | Memory allocators corresponding to processor resources | |
US11366689B2 (en) | Hardware for supporting OS driven observation and anticipation based on more granular, variable sized observation units | |
CN109800092A (zh) | 一种共享数据的处理方法、装置及服务器 | |
US8954969B2 (en) | File system object node management | |
CN116893899A (zh) | 资源分配方法、装置、计算机设备和存储介质 | |
CA3141319C (en) | Reducing cache interference based on forecasted processor use | |
CN115658277A (zh) | 一种任务调度方法、装置及电子设备和存储介质 | |
CN112925616A (zh) | 任务分配方法、装置、存储介质及电子设备 | |
CN114296945B (zh) | 用于对gpu显存进行复用的方法及装置 | |
CN113377545A (zh) | 用于分配gpu物理内存的方法及装置 | |
Chen et al. | Data prefetching and eviction mechanisms of in-memory storage systems based on scheduling for big data processing | |
JP2013182502A (ja) | リソース配分システム、リソース配分方法、及びリソース配分プログラム | |
US10719357B1 (en) | Hardware for supporting OS driven load anticipation based on variable sized load units | |
US8887162B2 (en) | Persistent local storage for processor resources |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder | ||
CP01 | Change in the name or title of a patent holder |
Address after: 100192 No. 306, 3 / F, building 28, Baosheng Beili West District, Haidian District, Beijing Patentee after: Ant yunchuang digital technology (Beijing) Co.,Ltd. Address before: 100192 No. 306, 3 / F, building 28, Baosheng Beili West District, Haidian District, Beijing Patentee before: Beijing ant cloud Financial Information Service Co.,Ltd. |