1.本公开的实施例涉及一种存储资源分配方法、装置及非暂时性存储介质。
背景技术:
2.在当前设计的并行处理器(通用图形处理器(gpgpu))中,一个工作组(workgroup)会被分配到一个计算单元(computing unit,cu)上处理。每个计算单元包括多个处理单元(pe)、共享存储器(parallel memory unit,pmu)、寄存器堆、工作项集合调度模块。每个处理单元包括算术逻辑单元(alu)、浮点计算单元等。工作组可以被分为若干个工作项集合(subgroup),例如,工作组可以被分为一个子任务对应的多个工作项集合,这些工作项集合通过计算单元中的工作项集合调度模块调度、分发,并且通过共享存储器进行数据共享。由于多个工作组可以在同一个计算单元上并行处理,通过共享存储器中的多个工作项集合的协同工作,有效隐藏读取缓存(cache)的延迟,提升并行计算单元的工作效率。共享存储器中的存储空间可以分为多个独立存储段。需要根据每个工作组所需要使用的存储段动态地分配存储资源,使得各个工作组能够相互独立的进行工作。
技术实现要素:
3.本公开至少一些实施例提供一种存储资源分配方法,用于计算单元中共享存储器的分配,其中,所述共享存储器包括n个存储段,所述n个存储段按照分段编号依序排列,n为大于1的正整数,所述资源分配方法包括:接收占用连续m个存储段的分配请求;响应于所述n个存储段包括第一数量的可用存储段组,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,用于响应所述分配请求,其中,所述可用存储段组每个包括m个连续且处于空闲状态的存储段以满足所述分配请求,m为正整数且小于n。
4.例如,本公开一些实施例提供的存储资源分配方法还包括:确定所述n个存储段是否包括所述第一数量的可用存储段组。
5.例如,在本公开一些实施例提供的资源分配方法中,确定所述n个存储段是否包括所述可用存储段组,包括:获取用于所述共享存储器的存储状态数据,其中,所述存储状态数据具有n位,所述存储状态数据的n位用于一一对应地记载所述n个存储段是空闲或占用;使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组。
6.例如,在本公开一些实施例提供的存储资源分配方法中,使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组,包括:在所述存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组,响应于存在以所述当前位作为起始位的可用存储段组,记录对应于所述当前位具有可用存储段组。
7.例如,在本公开一些实施例提供的存储资源分配方法中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,逐位判断是否存在以所述当前位作为起始位的可用存储段组,包括:获取掩模数据,其中,所述掩模数据包括n位,所述掩模数据的n位一一对应于所述存储状态数据的n位,所述掩模数据包括从对应于以所述当前位作为起
始位的连续m位且值均为1的掩模段,将所述掩模数据取反之后与所述存储状态数据进行按位或运算,然后将所述按位或运算所得到的n位结果逐位进行与运算,响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与操作的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。
8.例如,在本公开一些实施例提供的存储资源分配方法中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,逐位判断是否存在以所述当前位作为起始位的可用存储段组,包括:将所述存储状态数据中以所述当前位作为起始位的连续m位逐位进行与运算,响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。
9.例如,本公开一些实施例提供的存储资源分配方法还包括:在逐位判断是否存在以所述当前位作为起始位的可用存储段组之后,通过记录对应于所述当前位具有可用存储段,得到可选位置数据,其中,所述可选位置数据包括n位,所述可选位置数据的n位用于一一对应地记载从所述n个存储段开始按所述升序或所述降序是否具有可用存储段。
10.例如,在本公开一些实施例提供的存储资源分配方法中,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,包括:对于所述可选位置数据的n位,采用二分法确定所述n个存储段两端边界距离最近的一个可用存储段组。
11.例如,本公开一些实施例提供的存储资源分配方法还包括:输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。
12.例如,本公开一些实施例提供的存储资源分配方法还包括:响应于所述n个存储段不包括可用存储段组,持续监测所述n个存储段直到所述n个存储段包括所述可用存储段组。
13.例如,本公开一些实施例提供的存储资源分配方法还包括:接收占用连续m个存储段的分配请求之前或同时,接收对于所述n个存储段中至少一个当前被占用的存储段的释放请求,在处理所述分配请求之前,处理所述释放请求。
14.本公开至少一些实施例还提供一种存储资源分配装置,用于计算单元中共享存储器的分配,其中,所述共享存储器包括n个存储段,所述n个存储段按照分段编号依序排列,n为大于1的正整数,所述资源分配装置包括:分配请求接收模块,被配置为接收占用连续m个存储段的分配请求;可用存储段确定模块,被配置为响应于所述n个存储段包括第一数量的可用存储段组,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,用于响应所述分配请求,其中,所述可用存储段组每个包括m个连续且处于空闲状态的存储段以满足所述分配请求,m为正整数且小于n。
15.例如,在本公开一些实施例提供的存储资源分配装置中,所述可用存储段确定模块还被配置为确定所述n个存储段是否包括所述可用存储段组。
16.例如,在本公开一些实施例提供的存储资源分配装置中,所述可用存储段确定模块包括:存储状态数据获取子模块,被配置为获取用于所述共享存储器的存储状态数据,其中,所述存储状态数据具有n位,所述存储状态数据的n位用于一一对应地记载所述n个存储段是空闲或占用;其中,所述可用存储段确定模块被配置为使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组。
17.例如,在本公开一些实施例提供的存储资源分配装置中,所述可用存储段确定模块还包括:可用存储段组存在判断子模块,被配置为在所述存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组,以及被配置为响应于存在以当前位作为起始位的可用存储段组,记录对应于所述当前位具有可用存储段。
18.例如,在本公开一些实施例提供的存储资源分配装置中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,所述可用存储段组存在判断单元,包括:掩模数据获取单元,被配置为获取掩模数据,其中,所述掩模数据包括n位,所述掩模数据的n位一一对应于所述存储状态数据的n位,所述掩模数据包括从对应于所述当前位作为起始位的连续m位且值均为1的掩模段;掩模数据操作单元,被配置为将所述掩模数据取反之后与所述存储状态数据进行按位或运算,然后将所述按位或运算所得到的n位结果逐位进行与运算,以及被配置为响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。
19.例如,在本公开一些实施例提供的存储资源分配装置中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,所述可用存储段组存在判断子模块,包括:存储状态数据操作单元,被配置为将所述存储状态数据中以所述当前位作为起始位的连续m位逐位进行与运算;操作结果判断单元,被配置为响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。
20.例如,在本公开一些实施例提供的存储资源分配装置中,所述可用存储段组存在判断子模块还包括:可选位置数据确定单元,被配置为在逐位判断是否存在以所述当前位作为起始位的可用存储段组之后,通过记录对应于所述当前位具有可用存储段,得到可选位置数据,其中,所述可选位置数据包括n位,所述可选位置数据的n位用于一一对应地记载从所述n个存储段开始按所述升序或所述降序是否具有可用存储段。
21.例如,在本公开一些实施例提供的存储资源分配装置中,所述可用存储段确定模块还包括:二分法确定子模块,被配置为对于所述可选位置数据的n位,采用二分法确定所述n个存储段两端边界距离最近的一个可用存储段组。
22.例如,本公开一些实施例提供的存储资源分配装置还包括:输出模块,被配置为输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。
23.例如,本公开一些实施例提供的存储资源分配装置还包括:可用存储段确定模块还被配置为响应于所述n个存储段不包括可用存储段组,持续监测所述n个存储段直到所述n个存储段包括所述可用存储段组。
24.例如,本公开一些实施例提供的存储资源分配装置还包括:释放请求处理模块,被配置为接收占用连续m个存储段的分配请求之前或同时,接收对于所述n个存储段中至少一个当前被占用的存储段的释放请求,在处理所述分配请求之前,处理所述释放请求。
25.本公开至少一些实施例还提供一种存储资源分配装置,该存储资源分配装置包括:存储器,用于非暂时性存储计算机可读指令;以及处理器,用于运行所述计算机可读指令,其中,所述计算机可读指令被所述处理器运行时执行本公开任一实施例提供的存储资
源分配方法。
26.本公开至少一些实施例还提供一种非暂时性存储介质,非暂时性地存储计算机可读指令,其中,当所述计算机可读指令由计算机执行时,执行本公开任一实施例提供的存储资源分配方法。
附图说明
27.为了更清楚地说明本公开实施例的技术方案,下面将对实施例的附图作简单地介绍,显而易见地,下面描述中的附图仅仅涉及本公开的一些实施例,而非对本公开的限制。
28.图1为用于管理并行处理器的计算单元中共享存储器的存储资源的存储段掩模的示意图;
29.图2为图1所示的存储段掩模中为编号为2~4的存储段被分配后的示意图;
30.图3为图2所示的存储段掩模中分段编号为0~1的存储段被释放后的示意图;
31.图4为本公开一实施例提供的存储资源分配方法的流程图;
32.图5为本公开一实施例提供的存储资源分配装置的结构示意图;
33.图6为本公开一实施例提供的存储资源分配方法的一个示例的流程示意图;
34.图7为本公开一实施例提供的示例性掩模数据的示意图;
35.图8a为本公开一实施例提供的掩模数据阵列示意图;
36.图8b为本公开一实施例提供的可选位置数据的示意图;
37.图9为本公开一实施例提供的确定n个存储段是否包括可用存储段组的方法流程图;
38.图10为本公开一实施例提供的采用二分法确定n个存储段两端边界距离最近的一个可用存储段组的电路模块示意图;
39.图11a为本公开一实施例提供的采用二分法确定n个存储段中与最高位距离最近的一个可用存储段组的示意图;
40.图11b为本公开一实施例提供的采用二分法确定n个存储段中与最低位距离最近的一个可用存储段组的示意图;
41.图12为本公开一实施例提供的存储资源分配方法分配的工作组队列中剩余的工作组变化仿真图;
42.图13为本公开一实施例提供的存储资源分配方法分配的剩余存储资源量变化仿真图;
43.图14为本公开一实施例提供的存储资源分配方法和现有分配方法完成相同任务的时间差示意图;
44.图15为本公开一实施例提供的一种存储资源分配装置的示意性框图;
45.图16为本公开一实施例提供的另一种存储资源分配装置的示意性框图;以及
46.图17为本公开一实施例提供的一种非暂时性存储介质的示意图。
具体实施方式
47.为了使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例的附图,对本公开实施例的技术方案进行清楚、完整地描述。显然,所描述的实施例是本
公开的一部分实施例,而不是全部的实施例。基于所描述的本公开的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
48.除非另外定义,本公开使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“一个”、“一”或者“该”等类似词语也不表示数量限制,而是表示存在至少一个。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
49.下面通过几个具体的实施例对本公开进行说明。为了保持本公开实施例的以下说明清楚且简明,本公开省略了已知功能和已知部件的详细说明。当本公开实施例的任一部件在一个以上的附图中出现时,该部件在每个附图中由相同或类似的参考标号表示。
50.当前设计的并行处理器,例如通用图形处理器(gpgpu),包括多个计算单元,每个计算单元包括多个处理单元、共享存储器等,每个处理单元包括算术逻辑单元、浮点计算单元等。计算任务一般通过多个工作项(work item)执行。这些工作项在通用图形处理器中执行前,在工作组调度模块中被划分成多个工作组(workgroup),然后经由工作组分发模块,将多个工作组分发到各个计算单元(cu)。一个工作组中的所有工作项必须要分配到同一个计算单元上执行。同时,工作组可能会被拆分成若干个工作项集合(subgroup),每个工作项集合包含了固定数量(或小于这个固定数量)的工作项,例如,32个工作项。多个工作组可以在同一个计算单元中执行。
51.当一个工作组被分配到一个计算单元上处理时,基于计算单元中的共享存储器中当前存储资源的占有情况,根据当前工作组需要占用的存储资源的大小,确定当前存储资源中可分配的存储资源,该工作组中的多个工作项集合可以同时执行或分时执行。该工作组在可分配的存储资源中计算完成时,释放该工作组所占用的存储资源。
52.例如,用于并行处理器的计算单元的共享存储器的存储资源被配置为依序连续的n个存储段(slot),该n个存储段按照分段编号依序排列,n为大于1的正整数。例如,共享存储器的存储空间共有64kb,被分为n=128个存储段,每个存储段表征0.5kb的存储空间,即分配的最小颗粒度为0.5kb。为了方便表征,共享存储器的存储资源虚拟为存储段掩模(slot_mask),通过存储段掩模对共享存储器中存储资源进行管理。
53.例如,如图1所示,存储段掩模(slot_mask)(也称为共享存储器的存储状态数据)为一维数组,共有128比特位(bit),分别对应128个存储段,对应的分段编号(slot_id)为0~127。如果某一分段编号的存储段被占用,在存储段掩模中,该存储段对应的比特位为0,说明该存储段已经被分配,有正在运行工作组,在该存储段被释放之前不能再对其进行工作组分配。相对应地,如果某一分段编号的存储段未被占用,在存储段掩模中,该存储段对应的比特位为1,说明该存储段处于空闲状态,能够进行工作组分配。
54.例如,图1还示出了存储段掩模被0~n-1个工作组(wg0~wg(n-1)等)占用的情况。例如,如图1所示,存储段0~1(slot_mask[0:1])被工作组wg0占用,从存储段6开始的一段
存储段(slot_mask[6:m],m》6)被工作组wg(n-1)占用;存储段2~5(slot_mask[2:5])此时则处于空闲状态,可以对其分配工作组。
[0055]
目前,当某一工作组提出对于p个(p大于等于1)存储段的存储资源请求时,需要为该工作组分配相应的存储资源,这时,根据该工作组的存储资源需求的大小,按照从低地址段到高地址段的方式,在存储段掩模中,寻找满足依序连续的p个存储段,以找到满足该工作组的存储资源需求的p个连续存储段。
[0056]
例如,相对于图1所示的状态,当需要为存储资源需求为3个存储段(size=3)对应的存储空间的工作组进行分配时,在存储段掩模中从0到127位依次寻找满足存储资源需求为3的连续存储段,确定分段编号为2~4的存储段(slot_mask[2:4])满足需求,将分段编号为2~4的存储段(slot_mask[2:4])分配该工作组,由此将slot_mask[2:4]对应的比特位(bit)从空闲状态1变为占用状态0,表明这些存储段已经进行分配,如图2所示。以上整个过程定义为分配存储资源(allocate)。
[0057]
例如,相对于图2所示的状态,如果某一工作组(例如工作组wg0)计算完成,需要回收用于运行该工作组的各种资源(包括回收用于运行该工作组的存储段)时,通过标定该工作组所占用的存储段(例如,slot_mask[0:1])的起始地址和工作组所需要的存储资源大小(例如,该工作组占用的存储段的起始位置为wg_alloc_base=0,该工作组所占用的存储资源的大小wg_alloc_size=2),找到运行该工作组的2个存储段,并释放(例如,释放分段编号为0~1的存储段)。例如,slot_mask[0:1]对应的比特位从占用状态0变为空闲状态1,表明对应的存储资源已经进行回收,如图3所示。以上整个过程定义为释放存储资源(deallocate)。
[0058]
用于并行处理器的计算单元的共享存储器按照连续的存储段分配给工作组,上述连续分配存储资源的方式,具有逻辑简单,易于实现的特点,能够很好的适应在工作组相对稳定情况下的工作。但是,对存储资源需求较大的工作组和对存储资源需求相对较小的工作组随机被分配到单个计算单元上运行,同时又有存储资源需求大小不定的工作组由计算单元完成其计算任务而释放其在共享存储器中占用的存储资源,在此情形长时间运行后,计算单元上的存储资源会形成许多小数目连续或者单个的存储段,形成细小的碎片(例如图2中的slot_mask[5]对应的存储段)。一旦这样的碎片过多,则将导致后续对存储资源需求相对大一些的工作组不能被分配到计算单元上运行。而且,随着越来越多的工作组在同一个计算单元上运行,碎片化会越来越严重。所以,计算单元的共享存储资源不能被及时有效地利用起来,这导致资源使用效率变得低下,造成硬件资源浪费。同时,由于多个工作组的存储资源分配和释放是动态变化的,一个工作组计算结束后释放存储资源,所释放的存储资源可能会被下一个工作组占用。共享存储器本身并不支持地址域的首未相接(即wrap)的分配方法,只能按照低地址到高地址的顺序进行分配,这导致低地址的存储资源总是优先被占用,低地址的存储资源被占用的概率较大,高地址的存储资源被占用的概率较小,最终导致共享存储器工作疲劳度不均衡,整体工作寿命减少。
[0059]
本公开至少一些实施例提供一种存储资源分配方法,用于计算单元中共享存储器的分配,其中,该共享存储器包括n个存储段,n个存储段按照分段编号依序排列,n为大于1的正整数。该资源分配方法包括:接收占用连续m个存储段的分配请求;响应于n个存储段包括第一数量的可用存储段组,在这些可用存储段组中,确定与n个存储段两端边界距离最近
的一个可用存储段组,用于响应分配请求,其中,可用存储段组每个包括m个连续且处于空闲状态的存储段以满足分配请求,m为正整数且小于n。
[0060]
本公开的一些实施例还提供对应于上述存储资源分配方法的存储资源分配装置,该资源分配装置包括:分配请求接收模块,被配置为接收占用连续m个存储段的分配请求;可用存储段确定模块,被配置为响应于n个存储段包括第一数量的可用存储段组,在可用存储段组中,确定与n个存储段两端边界距离最近的一个可用存储段组,用于响应分配请求。
[0061]
本公开的一些实施例还提供对应于上述存储资源分配方法的非暂时性存储介质,该存储介质非暂时性地存储计算机可读指令,其中,当计算机可读指令由计算机执行时,执行上述本公开的实施例提供的存储资源分配方法。
[0062]
本公开的上述实施例提供的存储资源分配方法,根据占用连续m个存储段的分配请求,分配与n个存储段两端边界距离最近的一个可用存储段组,使得n个存储段两端高地址存储段和低地址存储段具有相同的分配优先级,避免集中分配n个存储段的低地址存储段,使得共享存储器工作疲劳度均衡,提高使用寿命。同时,将未被占用的存储资源有效聚集到n个存储段的中部,且使得存储资源碎片化的问题得到优化。
[0063]
下面结合附图对本公开的一些实施例及其示例进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本公开,并不用于限制本公开。
[0064]
图4为本公开一些实施例提供的一种存储资源分配方法的流程图。图5为本公开一些实施例提供的一种存储资源分配装置的结构示意图。
[0065]
例如,如图4所示,该存储资源分配方法包括以下步骤s100至步骤s400,结合图5所示的一种存储资源分配装置,来说明存储资源分配方法s100至步骤s500应用于分配装置的具体流程。
[0066]
步骤s100:接收占用连续m个存储段的分配请求。
[0067]
例如,图5所示的存储资源分配装置100例如通过数字电路实现,连接计算单元(图5中未示出)或作为计算单元的一部分,用于控制计算单元中的共享存储器的分配。在对计算单元分配需要处理的一个或多个工作组后,计算单元生成当前工作组对应的对于共享存储器的存储空间的分配请求,并将分配请求发送至存储资源分配装置100中的缓存模块(allocate_fifo)中。缓存模块作为分配请求接收模块110,用于接收分配请求,例如可以包括一个存储队列(例如先进先出(fifo)队列)以存储多个分配请求,每个分配请求可以在此等待,直到共享存储器中有存储资源足以满足,才被分发、处理。
[0068]
该分配请求包括当前工作组需要占用的存储资源大小为连续m个存储段。需要指出的是,可以根据共享存储器的存储空间的大小,和/或计算单元能够处理的工作组所需要的存储资源大小来配置每个存储段所占用存储空间的大小。
[0069]
步骤s200:响应于n个存储段包括可用存储段组,在可用存储段组中,确定与n个存储段两端边界距离最近的一个可用存储段组,用于响应分配请求。
[0070]
这里,该可用存储段组每个包括m个连续且处于空闲状态的存储段以满足分配请求,m为正整数且小于n,也即存储段组包括一个或多个存储段。
[0071]
例如,当确定共享存储器中存在满足分配请求的第一数量的可用存储段组(即连续且处于空闲状态的m个存储段)时,响应该分配请求。该第一数量为例如一个或多个,也即,在不同情形下,当在共享存储器中存在可用存储段组时,可用存储段组的数量为一个或
多个,然后在这一个或多个可用存储段组进一步选择用于响应分配的一个可用存储段组。可用存储段确定模块120在共享存储器中n个存储段中找寻满足分配请求的可用存储段组,并在这一个或多个可用存储段组中,确定与n个存储段的两端边界(也即共享存储器的两端边界)距离最近的一个可用存储段组,并通过输出模块130输出被确定的一个可用存储段组。
[0072]
例如,在备选的一个或多个可用存储段组中,具有最低起始位的可用存储段组的起始位具有至共享存储器的低位端边界(例如图1中slot_id为0)的第一距离,而具有最高结束位的可用存储段组的结束位具有至共享存储器的高位端边界(例如图1中slot_id为127)的第二距离,如果第一距离小于第二距离,那么选择具有最低起始位的可用存储段组,如果第一距离大于第二距离,那么选择具有最高结束位的可用存储段组。
[0073]
步骤s300:输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。
[0074]
例如,图5示出的输出模块130输出被确定的一个可用存储段的起始地址,以及可用存储段组的长度m。可用存储段组的长度m与分配请求中当前工作组需要占用的存储资源大小为连续m个存储段相等。输出模块130将输出结果反馈至计算单元,计算单元根据输出结果将当前工作组下发至被确定的一个可用存储段进行计算。
[0075]
例如,在一些实施例中,如图4所示,本公开的实施例提供的存储资源分配方法还可以包括步骤s400。
[0076]
步骤s400:响应于n个存储段不包括可用存储段组,持续监测n个存储段直到n个存储段包括可用存储段组。
[0077]
例如,当共享存储器中n个存储段不存在满足分配请求的可用存储段组时,可对共享存储器中n个存储段持续监测,也即,可以持续进行尝试以确定是否存在满足分配请求的可用存储段组(具体如下所述),直到确定存在满足分配请求的可用存储段组。
[0078]
例如,在一些实施例中,本公开的实施例提供的存储资源分配方法还包括步骤s500。
[0079]
步骤s500:接收占用连续m个存储段的分配请求之前或同时,接收对于n个存储段中至少一个当前被占用的存储段的释放请求,在处理分配请求之前,处理释放请求。
[0080]
图5所示的存储资源分配装置通过例如数字电路实现的情形,对于存储资源的分配操作和释放操作可以彼此独立地并行,二者可以同时进行。例如,如果在分配请求接收模块110接收分配请求之前,释放请求处理模块150接收到了释放请求,那么分别依次处理释放请求和分配请求。如果同时接收分配请求和释放请求,那么可以先处理释放请求。释放请求处理完成后,根据分配请求确定是否可以将工作组下发至包括已释放的处于空闲状态的共享存储器中进行计算。这可以提高分配请求的命中率,从而可以更有效地提高存储资源整体的分配效率。
[0081]
例如,释放请求处理的过程如下:在接收占用连续m个存储段的分配请求之前或同时,释放请求处理模块150接收用于触发存储资源释放的存储资源释放操作来响应释放请求。释放请求包括需要释放存储段的起始地址和存储段的数量(例如,连续p个存储段,p为正整数),根据需要释放存储段的起始地址和存储段的数量进行标定,对被标定的需要释放的存储段的存储空间完成释放。
[0082]
下面结合图5和图6所示,进一步说明本公开实施例的存储资源分配方法中确定是否存在可用存储段组的示例性流程图。
[0083]
如图6所示,在分配存储资源的流程中,例如,可以通过如图5所示的存储资源分配装置(或软件线程)对分配请求进行管理。首先,确定是否存在分配请求,如果存在分配请求,则在共享存储器提供的n(例如n=128)个存储段中寻找是否存在可用存储段组,如果不存在分配请求,则返回继续等待分配请求。
[0084]
当存在分配请求时,判断是否存在可用存储段组的过程的至少一个示例如下:
[0085]
1)根据分配请求中需要分配的存储资源的大小(例如,m个存储段)通过图5所示的掩模数据获取单元(size_mask)获取分配存储段的掩模数据(allocate_mask)。
[0086]
例如,对于共享存储器具有128个存储段的情形(参考图1-图3),如图7所示,获得一个掩模数据,该掩模数据为一维数组,包括128个位,其中对应于被请求的存储资源的大小(request_size=m)的m个存储段为1,其余为0。图7中对应于为slot_id为0时的掩模数据,也即第0到第m-1位的值为1,而第m到第127位的值为0。
[0087]
2)根据需要分配的存储资源的大小(例如,m个存储段),通过掩模数据操作单元中的移位标定操作(shift_array)在n个存储段上按照升序或降序依次标定m个存储段。
[0088]
例如,如图8a所示,对于共享存储器具有128个存储段的情形(参考图1-图3),根据分段编号为0~m-1的m个存储段得到第一个掩模数据,根据分段编号为1~m的m个存储段得到第二个掩模数据,根据分段编号为2~m+1的m个存储段得到第三个掩模数据,以此类推,最后根据分段编号为128-m~127得到第128个掩模数据,将这128个掩模数据(数组)组合在一起,产生一个128*128二维矩阵,即掩模数据阵列(allocate_array)。该掩模数据阵列可以在产生之后预存在存储装置之中,也可以通过掩模数据在处理过程总动态生成,而无需提前预存整个掩模数据阵列。
[0089]
掩模数据阵列中的每一行对应一种分配情况,因此共有128种不同的分配情况,用于与存储状态数据(slot_resource)各比特位进行适配,存储状态数据为当前的存储段掩模(slot_mask),如前所述,为具有128位的一维数组,对于共享存储器的每一存储段,相应地通过0来表示占用,通过1来表示空闲,这样也便于后续进行“与”、“或”等操作。
[0090]
掩模数据操作单元中的掩模数据适配操作(match_array),从存储状态数据获取子模块中,获取共享存储器中当前的存储状态数据(slot_resource),得到用于预判的存储状态数据(slot_resource_pre),并将掩模数据阵列的每一行与获取的存储状态数据进行适配,逐位判断是否存在以当前位作为起始位的可用存储段组,并通过记录对应于当前位具有可用存储段,得到可选位置数据(avail_mask)。
[0091]
可选位置数据为一维数组,具有128位(bit),与存储状态数据的128位一一对应,表明以当前位为起始位的存储段组是否允许进行m个存储段资源分配。如果可选位置数据中存在某一位为1的情况,说明分配请求能够被响应,且是以该位为起始位的存储段组可以用于进行分配,并可以对共享存储器进行存储资源的分配。如果可选位置数据中所有的位都为0,则说明当前共享存储器中不够m个存储段资源分配,因此不能对共享存储器进行分配。
[0092]
例如,对于图1所示的情形(即对于图1示出的存储状态数据),如果当前请求分配的存储资源的大小为3,则所得到的可选位置数据,如图8b所示,其中,对于值为1的位表示
起始位与该位的序号相同的存储段组可以用于满足分配请求。例如,第2位的值为1,这表明在存储段掩模中以第2位为起始位且长度为3的存储段组(即存储段2-4的构成的存储段组)可以用于进行分配以相应分配请求;类似地,第3位的值为1,这表明在存储段掩模中以第3位为起始位且长度为3的存储段组(即存储段3-5的构成的存储段组)可以用于进行分配以相应分配请求;第124位的值为1,这表明在存储段掩模中以第124位为起始位且长度为3的存储段组(即存储段124-126的构成的存储段组)可以用于进行分配以相应分配请求;第125位的值为1,这表明在存储段掩模中以第125位为起始位且长度为3的存储段组(即存储段125-127的构成的存储段组)可以用于进行分配以相应分配请求。当不存在可用分配存储段组从而不能进行分配时,返回存储资源分配装置中,例如在下一个操作周期(时间周期)再次尝试上述流程。
[0093]
当存在可用分配存储段组从而能够进行分配时,分别从最低位和最高位开始分别顺序找到第一个比特位为1的位置,确定最低位距离与第一个比特位为1的位置的第一距离,和确定最高位距离第一个比特位为1的位置的第二距离,由此根据第一距离和第二距离的大小确定距离最短的比特位为1的位置,进而确定与n个存储段两端边界距离最近的一个可用存储段组(allocate_mask_sel)。上述确定与n个存储段两端边界距离最近的一个可用存储段组的操作,例如,可将可选位置数据(avail_mask)输入至二分法确定子模块进行操作。
[0094]
如果确定出具有这样的一个可用存储段组,产生可分配结果信号(avail_en),并且利用该可用存储段组(allocate_mask_sel)相应分配请求,且对当前的存储状态数据进行更新。
[0095]
在同时具备可分配结果信号(avail_en)和缓存模块发出的关于相应分配请求的操作信号时,生成表示当前能够分配的信号(alloc_en),操作(使能)输出模块,根据分配请求,输出可用存储段的起始地址和存储段长度(例如,连续m个存储段)。
[0096]
在释放存储资源的流程中,可以通过存储资源释放管理模块对释放请求进行管理。如果收到释放请求,根据释放请求中包括的需要释放存储段的长度(例如,m个存储段)从掩模数据获取子单元(size_mask)获取释放存储段的掩模数据(deallocate_mask)。利用平移操作(mask_shift)对释放存储段的掩模数据进行移位,移位量由需要释放存储段的数量决定。通过释放请求中包括的需要释放存储段的长度,在n个存储段上标定出需要释放的存储段的起始位置。根据需要释放的存储段的起始位置,进而对当前的存储状态数据进行更新。
[0097]
如上所述,如图4所示的存储资源分配方法,该存储资源分配方法在步骤s200之前还可以包括步骤s210。
[0098]
步骤s210:确定n个存储段是否包括可用存储段组。
[0099]
在进行比较、判断之后,可以确定n个存储段是否包括可用存储段组,可用存储段组的数量为一个或多个(即至少一个),由此可以进行步骤s200。
[0100]
以下进一步通过不同的示例说明如何确定n个存储段是否包括可用存储段组的操作。
[0101]
例如,在至少一个示例中,如图9所示,上述存储资源分配方法的步骤s210可以进一步包括步骤s211和步骤s212。
[0102]
步骤s211:获取用于共享存储器的存储状态数据,其中,存储状态数据具有n位,存储状态数据的n位用于一一对应地记载n个存储段是空闲或占用。
[0103]
步骤s212:使用存储状态数据来确定n个存储段是否包括可用存储段组。
[0104]
例如,图5示出存储状态数据获取子模块(slot-resource_update),用于获取存储状态数据(slot_mask或slot_resource),该存储状态数据为一维数组,具有n位,存储状态数据的n位用于一一对应地记载n个存储段是空闲或占用。例如,存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1。可用存储段确定模块120使用存储状态数据来确定n个存储段是否包括可用存储段组。
[0105]
例如,可用存储段组存在判断子模块执行步骤s212,例如,在至少一个示例中,步骤s212进一步包括如下的步骤s2121和步骤s2122:
[0106]
步骤s2121:在存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组。
[0107]
步骤s2122:响应于存在以当前位作为起始位的可用存储段组,记录对应于当前位具有可用存储段组。
[0108]
例如,在存储状态数据中,按照从低地址到高地址,或者从高地址到低地址的顺序,逐位判断是否存在以当前位作为起始位的连续m个存储段的状态数据为1,即处于空闲状态。如果存在,那么记录当前位为起始位的连续m个存储段为可用存储段组。
[0109]
例如,对于图1所示的情形,对于m=3的情形,可以从0位开始以升序的方式一直到第127位,逐位判断是否存在可以用于满足分配请求的可用存储段组,例如,第0位不存在,第1位不存在,第2位存在,第3位存在,
……
,第124位存在,第125位存在,第126位不存在,第127位不存在。或者,可以从第127位开始以降序的方式一直到第0位,逐位判断是否存在可以用于满足分配请求的可用存储段组,例如,第127位不存在,第126位不存在,第125位存在,第124位存在,
……
,第3位存在,第2位存在,第1位不存在,第0位不存在。
[0110]
逐位判断是否存在以当前位作为起始位的可用存储段组,可以通过多种方式进行,下面对至少两个示例进行说明。
[0111]
例如,在一个示例中,存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,步骤s2121进一步包括如下的步骤s21211~步骤s21213:
[0112]
步骤s21211:获取掩模数据,其中,掩模数据包括n位,掩模数据的n位一一对应于存储状态数据的n位,掩模数据包括从对应于以当前位作为起始位的连续m位且值均为1的掩模段;
[0113]
步骤s21212:将掩模数据取反之后与存储状态数据进行按位或运算,然后将按位或运算所得到的n位结果逐位进行与运算;
[0114]
步骤s21213:响应于与运算的结果为1,确定存在以当前位作为起始位的可用存储段组,响应于与操作的结果为0,确定不存在以当前位作为起始位的可用存储段组。
[0115]
例如,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组时,掩模数据获取单元获取掩模数据,掩模数据如图8a所示的二维矩阵数据,根据运算逻辑公式为:
[0116]
avail_mask[i]=&(~allocate_array[i]|slot_resource),i是二维矩阵数据的行数,例如,0≤i≤128-m,来计算可用存储段组。
[0117]
例如,以m=4为例,下面分步进行说明。如果当前的存储状态数据slot_resource[0:15]=0111_1001_1111_1100,对于与slot_id[0]对应的掩模数据矩阵(参考图8a)的第一行数据slot_mask[0][0:15]=1111_0000_0000_0000,对slot_mask[0][0:15]取反,得到slot_mask[0][0:15]=0000_1111_1111_1111,当前的存储状态数据与取反得到的掩模数据逐位对应地进行“或”运算,那么得到0111_1111_1111_1111,就该计算结果再逐位进行“与”运算,得到结果0,所以就slot_id[0]而言不存在m=4的可用存储段组。
[0118]
同样地,对于与slot_id[1]对应的掩模数据矩阵的第二行数据slot_mask[1][0:15]=0111_1000_0000_0000,按照同样的计算方法,对slot_mask[1][0:15]取反,得到slot_mask[1][0:15]=1000_0111_1111_1111,与当前的存储状态数据slot_resource[0:15]=0111_1001_1111_1100逐位对应地进行“或”运算,得到1111_1111_1111_1111再逐位进行与运算,得到结果1,所以就slot_id[1]而言存在m=4的可用存储段组。
[0119]
如下,依次对于slot_id[2:15]进行判断,确定就slot_id[2:15]而言是否存在m=4的可用存储段组,所得到的结果为对于slot_id[2:15]这14个位中的slot_id[7]~slot_id[10]而言分别存在m=4的可用存储段组。
[0120]
例如,在另一个示例中,存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,步骤s2121进一步包括如下的步骤s21214和步骤s21215:
[0121]
步骤s21214:将存储状态数据中以当前位作为起始位的连续m位逐位进行与运算,
[0122]
步骤s21215:响应于与运算的结果为1,确定存在以当前位作为起始位的可用存储段组,响应于与运算的结果为0,确定不存在以当前位作为起始位的可用存储段组。
[0123]
例如,仍然以m=4且当前的存储状态数据为slot_resource[0:15]=0111_1001_1111_1100为例,首先将第一个四位(即最左侧的0111)逐位进行“与”运算,运算结果为0,那么对应于slot_id[0]的前四位的存储段不是可用存储段组,接下来将第二个四位(即从最左侧第二位开始的1111)逐位进行“与”运算,运算结果为1,那么对应于slot_id[1]的第二个四位的存储段是可用存储段组,类似地进行计算,所得到的结果为对于slot_id[2:15]这9个位中的slot_id[7]~slot_id[10]而言分别存在m=4的可用存储段组。
[0124]
在本公开的实施例中,例如,在至少一个示例中,对于步骤s212,在步骤s2121之后,步骤s212进一步包括步骤s2123:
[0125]
步骤s2123:在逐位判断是否存在以当前位作为起始位的可用存储段组之后,通过记录对应于当前位具有可用存储段,得到可选位置数据。
[0126]
该可选位置数据也可以是一维数组,包括n位,可选位置数据的n位用于一一对应地记载从n个存储段开始按升序或降序是否具有可用存储段。
[0127]
例如,仍然以m=4且当前的存储状态数据为slot_resource[0:15]=0111_1001_1111_1100为例,那么经过上面的方式,可以得到可选位置数据为slot_mask[0:15]=0100_0001_1110_0000,分段编号为1、7~10的存储段均为可选存储段组的起始位置。这里,基于分段编号为1作为起始位置的存储段组与该共享存储器的最低位(低位端边界)的距离为1,而基于分段编号为10作为起始位置的存储段组与该共享存储器的最高位(高位端边界)的距离为2,那么基于分段编号为1作为起始位置的存储段组将被选择用于响应分配请求。
[0128]
例如,步骤s200中,在可用存储段组中,确定与n个存储段两端边界距离最近的一个可用存储段组,可以通过多个方式实现,在一个示例中,可以通过如下步骤s220实现:
[0129]
步骤s220:对于可选位置数据的n位,采用二分法确定n个存储段两端边界距离最近的一个可用存储段组。
[0130]
例如,基于可用存储段组(avail_mask)的结果,找寻其中最低位为1的位置和最高位为1的位置,比较两者与共享存储器的左右边界(低位端边界和高位端边界)的距离,选择距离最近的可用存储段组用于响应分配请求。由于可用存储段组(avail_mask)中标定的位置是基于分配存储段的掩模数据(allocate_mask)最低有效位的位置决定的,因此allocate_array[i]覆盖slot_resource区域与左右边界的距离与标定的位置存在偏差。假定可用存储段组(avail_mask)最低前导1位置在第i位,最高前导1位置在第j位,对于一个分配请求中需要占用的连续m个存储段,显然最低前导1位置对应的分配区域与下边界(slot_resource[0])的距离为i;对应的最高前导1位置对应的分配区域与上边界(slot_resource[127])的距离需要考虑m的大小,为128-j-m。因此最终输出的可用存储段组的起始地址(mask_det)存在关系:
[0131]
mask_det=i,i+j小于或等于128-m,或
[0132]
mask_det=j,i+j大于128-m。
[0133]
具体的示例性的电路模块示意图,如图10所示。输入当前的存储状态数据的信号(例如,data0[127:0])分别输入至mlop(最高前导1预测,most leading one prediction)模块和llop(最低前导1预测,least leading oneprediction)模块中。llop模块中通过二分法快速寻找可用存储段组(avail_mask)最低前导1位置在第i位,输出“i位置”信号。mlop模块中通过二分法快速寻找可用存储段组(avail_mask)最高前导1位置在第j位,即“j位置”信号。输入128bit的信号以及用于表示被请求的存储资源的大小的信号(例如,request_size=m),至减法器得到表示“128-m”信号,“i位置”信号和“j位置”信号输入至加法器得到“i+j”信号,“i+j”信号与“128-m”信号通过比较器进行比较,当“i+j”小于或等于“128-m”时,选择器输出可用存储段组(allocate_mask_sel)的起始地址为:mask_det=i,当“i+j”大于“128-m”时,选择器输出可用存储段组(allocate_mask_sel)的起始地址为:mask_det=j。
[0134]
例如,由于共享存储器的当前的存储状态数据有n位,例如n=128bit位,128bit位可以转换为二进制,由于2n’-1=127,n’=7,因此,在二进制中需要7bit表征找寻“i位置”和“j位置”。llop模块包括5个子模块,分别为llop_fetch(n’=7)、llop_fetch(n’=6)、llop_fetch(n’=5)、llop_fetch(n’=4)和llop_last8。llop_fetch(n’=7)用于判断“i位置”存在于[63:0]或是[127:64]中:当“i位置”存在于[127:64]中时,输出llop[6]=1,且将[127:64]作为data1[63:0]输入到达llop_fetch(n’=6)中。当“i位置”存在于[63:0]中时,输出llop[6]=0,且将[63:0]作为data1[63:0]输入到达llop_fetch(n’=6)中。同理,llop_fetch(n’=6)用于判断“i位置”存在于[63:32]或是[31:0]中,当“i位置”存在于[63:32]中时,输出llop[5]=1,且将[63:32]作为data2[31:0]输入到llop_fetch(n’=5)中。当“i位置”存在于[31:0]中时,输出llop[5]=0,且将[63:32]作为data2[31:0]输入到llop_fetch(n’=5)中。类似的,llop_fetch(n’=5)用于判断“i位置”存在于[31:16]或是[15:0]中。llop_fetch(n’=4)用于判断“i位置”存在于[15:8]或是[7:0]中,llop_fetch(n’=4)输出data4[7:0]至llop_last8中。由于data4[7:0]位宽度较小,只有8bit,直接通过简单的查表法进行检索即可。基于以上步骤最终得到“i位置”即llop[6:0]。同理,mlop模块得到“j位
置”即mlop[6:0],具体过程不再叙述,参考llop模块的处理过程。再通过比较llop[6:0]与低位端边界的距离,与mlop[6:0]与高位端边界的距离,选择距离最小的bit位1所在的可用存储段组(allocate_mask_sel)作为最终的输出。
[0135]
采用二分法确定n个存储段两端边界距离最近的一个可用存储段组的硬件实现如图11a和图11b所示。llop模块可以采用如图11a所示的结构。mlop模块可以采用如图11b的结构。
[0136]
如图11a,当前的存储状态数据data0[2n’-1:0](data0[127:0],n’=7)分成两部分,第一部分数据(低n/2bit数据)是从最低位0bit起始至中间位的数据data0[2n’‑
1-1:0](data0[63:0]),第二部分数据(高n/2bit数据)是从中间位至最高位的数据data0[2n’-1:2n’‑1](data0[63:127])。通过判断第一部分数据中是否存在一个或多个1bit位的情况,来确定“i位置”是否在data0[2n’-1:0]中,同时确定二分法选择的一半数据。例如,当第一部分数据中存在一个1bit位时,表明“i位置”在第一部分数据中,则选择第一部分数据,显然逻辑|data0[2n’‑
1-1:0]的结果为1,|data0[2n’‑
1-1:0]=1按位取反输出llop_1[n
’‑
1]=0(例如,图10中llop[6]=0),data1[2n’‑
1-1:0](例如,图10中data1[63:0])作为最终的结果输出。当第一部分数据都为0时,表明“i位置”在第二部分数据中,则选择第二部分数据,显然逻辑|data0[2n’‑
1-1:0]的结果为0,|data0[2n’-1-1:0]=0按位取反输出llop_1[n
’‑
1]=1(例如,图10中llop[6]=1),data1[2n’‑
1-1:0](例如,图10中data1[63:0])作为最终的结果输出。
[0137]
如图11b,通过判断第二部分数据中是否存在一个或多个1bit位的情况,来确定图11a中“j位置”是否在data0[2n’-1:2n’‑1]中,同时确定二分法选择的一半数据。例如,当第二部分数据中存在一个1bit位时,表明“j位置”在第二部分数据中,则选择第二部分数据,显然逻辑|data0[2n’-1:2n’‑1]的结果为1,|data0[2n’-1:2n’‑1]=1按位取反输出mlop_1[n
’‑
1]=0(例如,图10中mlop[6]=0),data1[2n’‑
1-1:0](例如,图10中data1[63:0])作为最终的结果输出。当第二部分数据都为0bit位时,表明“j位置”在第一部分数据中,则选择第一部分数据,显然逻辑|data0[2n’-1:2n’‑1]的结果为0,|data0[2n’-1:2n’‑1]=0按位取反输出mlop_1[n
’‑
1]=1(例如,图10中mlop[6]=1)。data1[2n’‑
1-1:0](例如,图10中data1[63:0])作为最终的结果输出。
[0138]
例如,分别利用本公开提出的存储资源分配方法和现有的存储资源分配方法对进行存储资源分配的仿真。图12和图13表明,通过软件仿真,在每个工作组需要存储资源的大小随机且每个工作组计算时间随机的情况下,处理相同工作组队列,利用本公开提出的存储资源分配方法能够更快的完成存储资源分配。
[0139]
例如,如图12所示,利用本公开实施例提出的存储资源分配方法分配的工作组队列中剩余的工作组(workgroup remaining)降低至0的速度更快(图12中的标号a1指向的曲线(虚线)表示本公开实施例提出的存储资源分配方法分配的工作组队列中剩余的工作组随时间的变化曲线,标号a2指向的曲线(实线)表示现有的存储资源分配方法分配的工作组队列中剩余的工作组随时间的变化曲线);如图13所示,利用本公开提出的存储资源分配方法分配的剩余存储资源(resource remaining)的大小在一段时间内保持更低值,以上表明利用本公开提出的存储资源分配方法为工作组序列更快的分配存储资源,以更快的完成计算(图13中的标号b1指向的曲线(实线)表示本公开实施例提出的存储资源分配方法分配的
剩余存储资源的变化曲线,标号b2指向的曲线(虚线)表示现有的存储资源分配方法分配的剩余存储资源的变化曲线)。也就是说,在分配和释放的动态变化过程中,本公开实施例提出的存储资源分配方法出现连续存储段的概率较大,碎片化的存储段的概率较小。例如,图14所示,通过对分配过程进行多次(大约200次)仿真,统计现有的存储资源分配方法和本公开实施例提出的存储资源分配方法完成同样任务的时间(workgroup process time),并计算时间差(delta time)。在大多数情况下,200次仿真得到的时间差中,大部分仿真的时间差为正值,说明本公开实施例的存储资源分配方法的分配时间更短,分配更有效率。
[0140]
本公开至少一些实施例还提供一种存储资源分配装置,该装置例如用于并行处理器,该并行处理器例如为通用图形处理器(gpgpu),本公开的实施例对此不作限制。例如,该并行处理器包括第一个或多个计算单元,每个计算单元包括多个处理单元、共享存储器、寄存器堆、工作项集合调度模块以及根据本公开实施例的存储资源分配装置,也即存储资源分配装置集成于计算单元的内部,例如以模块的方式集成于工作项集合调度模块之中。在其他示例中,存储资源分配装置也可以设置于计算单元的外部。
[0141]
图15为本公开一些实施例提供的一种存储资源分配装置的示意性框图,存储资源分配装置例如可以通过硬件、固件等实现,例如下面提及的各个模块可以采用数字电路或数字电路与模拟电路的任意组合实现,例如可以参考图5所示的具体示例,本公开的实施例对此不作限制。例如,如图15所示,该存储资源分配装置100包括分配请求接收模块110和可用存储段确定模块120。
[0142]
分配请求接收模块110被配置为接收占用连续m个存储段的分配请求。
[0143]
可用存储段确定模块120被配置为响应于n个存储段包括第一数量的可用存储段组,在可用存储段组中,确定与n个存储段两端边界距离最近的一个可用存储段组,用于响应分配请求,其中,可用存储段组每个包括m个连续且处于空闲状态的存储段以满足分配请求,m为正整数且小于n。
[0144]
例如,可用存储段确定模块120还被配置为确定n个存储段是否包括该第一数量的可用存储段组。
[0145]
例如,可用存储段确定模块120可以包括存储状态数据获取子模块,该存储状态数据获取子模块被配置为获取用于共享存储器的存储状态数据。存储状态数据具有n位,存储状态数据的n位用于一一对应地记载n个存储段是空闲或占用。此时,可用存储段确定模块还被配置为使用存储状态数据来确定n个存储段是否包括可用存储段组。
[0146]
例如,可用存储段确定模块120还可以包括可用存储段组存在判断子模块,该可用存储段组存在判断子模块被配置为在存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组,以及被配置为响应于存在以当前位作为起始位的可用存储段组,记录对应于当前位具有可用存储段。
[0147]
例如,存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1。例如,可用存储段组存在判断单元,包括:掩模数据获取单元和掩模数据操作单元。
[0148]
该掩模数据获取单元被配置为获取掩模数据,其中,掩模数据包括n位,该掩模数据的n位一一对应于存储状态数据的n位,掩模数据包括从对应于当前位作为起始位的连续m位且值均为1的掩模段。
[0149]
该掩模数据操作单元被配置为将掩模数据取反之后与存储状态数据进行按位或
运算,然后将按位或运算所得到的n位结果逐位进行与运算,以及被配置为响应于与运算的结果为1,确定存在以当前位作为起始位的可用存储段组,响应于与运算的结果为0,确定不存在以当前位作为起始位的可用存储段组。
[0150]
例如,存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1。例如,可用存储段组存在判断子模块,包括:存储状态数据操作单元和操作结果判断单元。
[0151]
该存储状态数据操作单元被配置为将存储状态数据中以当前位作为起始位的连续m位逐位进行与运算。
[0152]
该操作结果判断单元被配置为响应于与运算的结果为1,确定存在以当前位作为起始位的可用存储段组,响应于与运算的结果为0,确定不存在以当前位作为起始位的可用存储段组。
[0153]
例如,可用存储段组存在判断子模块还包括可选位置数据确定单元,该可选位置数据确定单元被配置为在逐位判断是否存在以当前位作为起始位的可用存储段组之后,通过记录对应于当前位具有可用存储段,得到可选位置数据,其中,可选位置数据包括n位,可选位置数据的n位用于一一对应地记载从n个存储段开始按升序或降序是否具有可用存储段。
[0154]
例如,可用存储段确定模块120还可以包括二分法确定子模块,该二分法确定子模块被配置为对于可选位置数据的n位,采用二分法确定n个存储段两端边界距离最近的一个可用存储段组。例如,存储资源分配装置100还包括输出模块130,该输出模块130被配置为输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。
[0155]
例如,可用存储段确定模块120还被配置为响应于n个存储段不包括可用存储段组,持续监测n个存储段直到n个存储段包括可用存储段组。可用存储段确定模块120对于一个分配请求进行分配操作不成功之后,可以等待预定时间之后(例如在下一个操作周期),可再次进行分配操作,直到分配操作成功。
[0156]
例如,存储资源分配装置100还可以包括释放请求处理模块150,该释放请求处理模块150被分配为接收占用连续m个存储段的分配请求之前或同时,接收对于n个存储段中至少一个当前被占用的存储段的释放请求,在处理分配请求之前,处理释放请求。
[0157]
例如,分配请求接收模块110、可用存储段确定模块120、输出模块130和释放请求处理模块140中的各个模块可以通过硬件、固件或软件实现。
[0158]
因此,例如,处理器可以执行代码和程序以实现如上的各个模块的部分或全部功能。又例如,分配请求接收模块110、可用存储段确定模块120、输出模块130和释放请求处理模块140中的各个模块可以是硬件器件,用来实现如上的各个模块的部分或全部功能。例如,分配请求接收模块110、可用存储段确定模块120、输出模块130和释放请求处理模块140中的各个模块可以是一个电路板或多个电路板的组合,用于实现如上的功能。
[0159]
需要说明的是,存储资源分配装置100可以用于实现前述存储资源分配方法。例如,分配请求接收模块110可以用于实现前述存储资源分配方法中的步骤s100,具体实现过程和细节可以参考前述步骤s100的相关描述,在此不再重复赘述。例如,存储段确定模块120可以用于实现前述存储资源分配方法中的步骤s200,具体实现过程和细节可以参考前述步骤s200的相关描述,在此不再重复赘述。例如,输出模块130可以用于实现前述存储资源分配方法中的步骤s300,具体实现过程和细节可以参考前述步骤s300的相关描述,在此
不再重复赘述。例如,存储段确定模块120还可以用于实现前述存储资源分配方法中的步骤s400,具体实现过程和细节可以参考前述步骤s400的相关描述,在此不再重复赘述。例如,释放请求处理模块140可以用于实现前述存储资源分配方法中的步骤s500,具体实现过程和细节可以参考前述步骤s500的相关描述,在此不再重复赘述。
[0160]
图16为本公开一些实施例提供的另一种存储资源分配装置的示意性框图。例如,如图16存储资源分配装置500包括存储器510和处理器520,该存储资源分配装置例如可以用于并行处理器,该并行处理器例如为通用图形处理器(gpgpu),本公开的实施例对此不作限制。例如,存储器510用于非暂时性存储计算机可读指令,处理器520用于运行该计算机可读指令,该计算机可读指令被处理器520运行时执行本公开任一实施例提供的存储资源分配方法。
[0161]
例如,存储器510和处理器520之间可以直接或间接地互相通信。例如,在一些示例中,如图16该存储资源分配装置500还可以包括系统总线530,存储器510和处理器520之间可以通过系统总线530互相通信,例如,处理器520可以通过系统总线1006访问存储器510。例如,在另一些示例中,存储器510和处理器520等组件之间可以通过片上网络(noc)连接进行通信。
[0162]
例如,处理器520可以控制存储资源分配装置中的其它组件以执行期望的功能。处理器520可以是中央处理单元(cpu)、张量处理器(tpu)、网络处理器(np)或者图形处理器gpu等具有数据处理能力和/或程序执行能力的器件,还可以是数字信号处理器(dsp)、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。
[0163]
例如,存储器510可以包括一个或多个计算机程序产品的任意组合,计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(rom)、硬盘、可擦除可编程只读存储器(eprom)、便携式紧致盘只读存储器(cd-rom)、usb存储器、闪存等。
[0164]
例如,在存储器510上可以存储一个或多个计算机指令,处理器520可以运行该计算机指令,以实现各种功能。在计算机可读存储介质中还可以存储各种应用程序和各种数据,以及应用程序使用和/或产生的各种数据等。
[0165]
例如,存储器510存储的一些计算机指令被处理器520执行时可以执行根据上文的存储资源分配方法中的一个或多个步骤。
[0166]
例如,如图16所示,存储资源分配装置500还可以包括允许外部设备与存储资源分配装置500进行通信的输入接口540。例如,输入接口540可被用于从外部计算机设备、从用户等处接收指令。存储资源分配装置500还可以包括使存储资源分配装置500和一个或多个外部设备相互连接的输出接口550。例如,存储资源分配装置500可以通过输出接口550显示图像等。
[0167]
例如,关于本公开上述实施例的存储资源分配方法的处理过程的详细说明可以参考上述存储资源分配方法的实施例中的相关描述,重复之处不再赘述。
[0168]
需要说明的是,本公开的实施例提供的存储资源分配装置是示例性的,而非限制性的,根据实际应用需要,该存储资源分配装置还可以包括其他常规部件或结构,例如,为
实现存储资源分配装置的必要功能,本领域技术人员可以根据具体应用场景设置其他的常规部件或结构,本公开的实施例对此不作限制。
[0169]
本公开的实施例提供的存储资源分配装置的技术效果可以参考上述实施例中关于存储资源分配方法的相应描述,在此不再赘述。
[0170]
本公开至少一些实施例还提供一种非暂时性存储介质。图17为本公开一些实施例提供的一种非暂时性存储介质的示意图。例如,如图17,该存储介质600非暂时性地存储计算机可读指令610,当非暂时性计算机可读指令610由计算机(包括处理器)执行时可以执行本公开任一实施例提供的存储资源分配方法。
[0171]
例如,在存储介质600上可以存储一个或多个计算机指令。存储介质600上存储的一些计算机指令可以是例如用于实现上述存储资源分配方法中的一个或多个步骤的指令。
[0172]
例如,存储介质可以包括平板电脑的存储部件、个人计算机的硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom)、光盘只读存储器(cd-rom)、闪存、或者上述存储介质的任意组合,也可以为其他适用的存储介质。例如,存储介质600可以包括前述存储资源分配装置500中的存储器510。
[0173]
本公开的实施例提供的存储介质的技术效果可以参考上述实施例中关于存储资源分配方法的相应描述,在此不再赘述。
[0174]
对于本公开,有以下几点需要说明:
[0175]
(1)本公开实施例附图中,只涉及到与本公开实施例涉及到的结构,其他结构可参考通常设计。
[0176]
(2)在不冲突的情况下,本公开同一实施例及不同实施例中的特征可以相互组合。
[0177]
以上,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以权利要求的保护范围为准。
技术特征:
1.一种存储资源分配方法,用于计算单元中共享存储器的分配,其中,所述共享存储器包括n个存储段,所述n个存储段按照分段编号依序排列,n为大于1的正整数,所述资源分配方法包括:接收占用连续m个存储段的分配请求;响应于所述n个存储段包括第一数量的可用存储段组,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,用于响应所述分配请求,其中,所述可用存储段组每个包括m个连续且处于空闲状态的存储段以满足所述分配请求,m为正整数且小于n。2.根据权利要求1所述的方法,还包括:确定所述n个存储段是否包括所述第一数量的可用存储段组。3.根据权利要求2所述的方法,其中,确定所述n个存储段是否包括所述可用存储段组,包括:获取用于所述共享存储器的存储状态数据,其中,所述存储状态数据具有n位,所述存储状态数据的n位用于一一对应地记载所述n个存储段是空闲或占用;使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组。4.根据权利要求3所述的方法,其中,使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组,包括:在所述存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组,响应于存在以所述当前位作为起始位的可用存储段组,记录对应于所述当前位具有可用存储段组。5.根据权利要求4所述的方法,其中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,逐位判断是否存在以所述当前位作为起始位的可用存储段组,包括:获取掩模数据,其中,所述掩模数据包括n位,所述掩模数据的n位一一对应于所述存储状态数据的n位,所述掩模数据包括从对应于以所述当前位作为起始位的连续m位且值均为1的掩模段,将所述掩模数据取反之后与所述存储状态数据进行按位或运算,然后将所述按位或运算所得到的n位结果逐位进行与运算,响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与操作的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。6.根据权利要求4所述的方法,其中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,逐位判断是否存在以所述当前位作为起始位的可用存储段组,包括:将所述存储状态数据中以所述当前位作为起始位的连续m位逐位进行与运算,响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。7.根据权利要求5或6所述的方法,还包括:在逐位判断是否存在以所述当前位作为起始位的可用存储段组之后,通过记录对应于
所述当前位具有可用存储段,得到可选位置数据,其中,所述可选位置数据包括n位,所述可选位置数据的n位用于一一对应地记载从所述n个存储段开始按所述升序或所述降序是否具有可用存储段。8.根据权利要求7所述的方法,其中,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,包括:对于所述可选位置数据的n位,采用二分法确定所述n个存储段两端边界距离最近的一个可用存储段组。9.根据权利要求1所述的方法,还包括:输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。10.根据权利要求1所述的方法,还包括:响应于所述n个存储段不包括可用存储段组,持续监测所述n个存储段直到所述n个存储段包括所述可用存储段组。11.根据权利要求1所述的方法,还包括:接收占用连续m个存储段的分配请求之前或同时,接收对于所述n个存储段中至少一个当前被占用的存储段的释放请求,在处理所述分配请求之前,处理所述释放请求。12.一种存储资源分配装置,用于计算单元中共享存储器的分配,其中,所述共享存储器包括n个存储段,所述n个存储段按照分段编号依序排列,n为大于1的正整数,所述资源分配装置包括:分配请求接收模块,被配置为接收占用连续m个存储段的分配请求;可用存储段确定模块,被配置为响应于所述n个存储段包括第一数量的可用存储段组,在所述可用存储段组中,确定与所述n个存储段两端边界距离最近的一个可用存储段组,用于响应所述分配请求,其中,所述可用存储段组每个包括m个连续且处于空闲状态的存储段以满足所述分配请求,m为正整数且小于n。13.根据权利要求12所述的装置,其中,所述可用存储段确定模块还被配置为确定所述n个存储段是否包括所述第一数量的可用存储段组。14.根据权利要求13所述的装置,其中,所述可用存储段确定模块包括:存储状态数据获取子模块,被配置为获取用于所述共享存储器的存储状态数据,其中,所述存储状态数据具有n位,所述存储状态数据的n位用于一一对应地记载所述n个存储段是空闲或占用;其中,所述可用存储段确定模块还被配置为使用所述存储状态数据来确定所述n个存储段是否包括所述可用存储段组。15.根据权利要求14所述的装置,其中,所述可用存储段确定模块还包括:可用存储段组存在判断子模块,被配置为在所述存储状态数据中,按升序或降序,逐位判断是否存在以当前被判定的当前位作为起始位的可用存储段组,以及被配置为响应于存在以当前位作为起始位的可用存储段组,记录对应于所述当前位具有可用存储段组。16.根据权利要求15所述的装置,其中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,
所述可用存储段组存在判断子模块,包括:掩模数据获取单元,被配置为获取掩模数据,其中,所述掩模数据包括n位,所述掩模数据的n位一一对应于所述存储状态数据的n位,所述掩模数据包括从对应于所述当前位作为起始位的连续m位且值均为1的掩模段,掩模数据操作单元,被配置为将所述掩模数据取反之后与所述存储状态数据进行按位或运算,然后将所述按位或运算所得到的n位结果逐位进行与运算,以及被配置为响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。17.根据权利要求15所述的装置,其中,所述存储状态数据中每一位在被占用时被设置为0,在空闲时被设置为1,所述可用存储段组存在判断子模块,包括:存储状态数据操作单元,被配置为将所述存储状态数据中以所述当前位作为起始位的连续m位逐位进行与运算,操作结果判断单元,被配置为响应于所述与运算的结果为1,确定存在以所述当前位作为起始位的可用存储段组,响应于所述与运算的结果为0,确定不存在以所述当前位作为起始位的可用存储段组。18.根据权利要求16或17所述的装置,其中,所述可用存储段组存在判断子模块还包括:可选位置数据确定单元,被配置为在逐位判断是否存在以所述当前位作为起始位的可用存储段组之后,通过记录对应于所述当前位具有可用存储段,得到可选位置数据,其中,所述可选位置数据包括n位,所述可选位置数据的n位用于一一对应地记载从所述n个存储段开始按所述升序或所述降序是否具有可用存储段。19.根据权利要求18所述的装置,其中,所述可用存储段确定模块还包括:二分法确定子模块,被配置为对于所述可选位置数据的n位,采用二分法确定所述n个存储段两端边界距离最近的一个可用存储段组。20.根据权利要求12所述的装置,还包括:输出模块,被配置为输出被确定的一个可用存储段组的起始地址以及可用存储段组的长度m。21.根据权利要求12所述的装置,其中,所述可用存储段确定模块还被配置为响应于所述n个存储段不包括可用存储段组,持续监测所述n个存储段直到所述n个存储段包括所述可用存储段组。22.根据权利要求18所述的装置,还包括:释放请求处理模块,被配置为接收占用连续m个存储段的分配请求之前或同时,接收对于所述n个存储段中至少一个当前被占用的存储段的释放请求,在处理所述分配请求之前,处理所述释放请求。23.一种存储资源分配装置,包括:存储器,用于非暂时性存储计算机可读指令;以及处理器,用于运行所述计算机可读指令,其中,所述计算机可读指令被所述处理器运行时执行根据权利要求1-11任一项所述的存储资源分配方法。
24.一种非暂时性存储介质,非暂时性地存储计算机可读指令,其中,当所述计算机可读指令由计算机执行时,执行根据权利要求1-11任一项所述的资源分配方法。
技术总结
一种存储资源分配方法、装置及非暂时性存储介质,用于计算单元中共享存储器的分配,其中,共享存储器包括N个存储段,N个存储段按照分段编号依序排列,N为大于1的正整数。该资源分配方法包括:接收占用连续M个存储段的分配请求;响应于N个存储段包括第一数量的可用存储段组,在可用存储段组中,确定与N个存储段两端边界距离最近的一个可用存储段组,用于响应分配请求,其中,可用存储段组每个包括M个连续且处于空闲状态的存储段以满足分配请求,M为正整数且小于N。该方法可使得共享存储器工作均衡,提高使用寿命,同时使得存储资源碎片化的问题得到优化。的问题得到优化。的问题得到优化。
技术研发人员:袁庆 陈庆 华芮 潘于
受保护的技术使用者:海光信息技术股份有限公司
技术研发日:2021.12.06
技术公布日:2022/3/8