CN104516823B - 一种数据存储方法和装置 - Google Patents
一种数据存储方法和装置 Download PDFInfo
- Publication number
- CN104516823B CN104516823B CN201310464285.XA CN201310464285A CN104516823B CN 104516823 B CN104516823 B CN 104516823B CN 201310464285 A CN201310464285 A CN 201310464285A CN 104516823 B CN104516823 B CN 104516823B
- Authority
- CN
- China
- Prior art keywords
- data
- stored
- function
- contribution value
- memory
- 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
Abstract
本发明的实施例提供一种数据存储的方法和装置,应用于计算机领域,能够支持混合内存中待存储数据的存储。所述数据存储方法用于编译器,包括:判断待存储数据的数据类型;若所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值;根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成。本发明的实施例提供一种数据存储方法和装置,用于混合内存中数据的存储。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种数据存储方法和装置。
背景技术
内存性能为内存的访存速度,内存性能是影响计算机性能的重要因素之一,近年来,随着计算机的发展,内存的访存速度已经成为制约计算机性能的主要瓶颈。目前,数据在普通内存进行访存时的,数据粒度是固定不变的,但是在实际应用中,待存储数据不同,数据粒度也是变化的,对于一些数据粒度较小的数据的访存,按照固定不变的数据粒度在普通内存进行存储必然造成浪费,如普通内存的存储粒度占用缓存链路(cache line)32个字节,而待存储数据的实际数据粒度为4个字节,所述待存储数据在普通内存进行存储时,需要填充28个空白字节。
现有技术中,针对数据粒度较小的数据访存,提出了一种新的内存结构,即称为消息式内存,所述消息式内存支持随机的小数据粒度的待存储数据的访存。但是目前,消息式内存还不能完全取代普通内存,因此普通内存和消息式内存构成的混合内存将广泛存在,但是,现有的数据存储方法,只针对普通内存进行待存储数据的存储,无法支持混合内存中待存储数据的存储。
发明内容
本发明的实施例提供一种数据存储的方法和装置,能够支持混合内存中待存储数据的存储。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,提供一种数据存储方法,用于编译器,包括:
判断待存储数据的数据类型;
若所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值;
根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成。
结合第一方面,在第一种可实现方式中,所述获取所述待存储数据的贡献值包括:
根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值;
层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;
按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;
获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
结合第一种可实现方式,在第二种可实现方式中,所述计算所述各个函数的贡献值包括:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;
获取所述函数f中各个访存点的估计执行次数;
获取所述函数f中各个访存点的贡献值;
获取所述函数f的估计执行次数;
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
结合第一方面,第一种可实现方式或第二种可实现方式,在第三种可实现方式中,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
结合第三种可实现方式,在第四种可实现方式中,所述根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置包括:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
结合第一方面,第一至第四种可实现方式,在第五种可实现方式中,在所述判断待存储数据的数据类型之后,所述方法还包括:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
第二方面,提供一种编译器,其特征在于,包括:
第一判断单元,用于判断待存储数据的数据类型;
获取单元,用于若判断单元判断出所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值;
第二判断单元,用于根据所述获取单元获取的所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成。
结合第二方面,在第一种可实现方式中,所述获取单元还包括:
标记子单元,用于根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值;
生成子单元,用于层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;
第一计算子单元,用于按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;
第二计算子单元,用于获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
结合第一种可实现方式,在第二种可实现方式中,所述第一计算子单元具体用于:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;
获取所述函数f中各个访存点的估计执行次数;
获取所述函数f中各个访存点的贡献值;
获取所述函数f的估计执行次数;
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
结合第二方面,第一种可实现方式或第二种可实现方式,在第三种可实现方式中,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
结合第三种可实现方式,在第四种可实现方式中,其特征在于,
所述第二判断单元具体用于:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
结合第二方面,第一至第四种可实现方式,在第五种可实现方式中,所述编译器还包括第三判断单元,用于:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
本发明实施例提供的数据存储方法,通过在存储数据时,首先判断所述待存储数据的贡献值,根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,已解决现有技术中,在数据存储时没有考虑混合内存的结构,不能支持待存储数据在混合内存中的存储的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种数据存储方法流程图;
图2为本发明实施例提供的另一种数据存储方法流程图;
图3为本发明实施例提供的一种函数调用图;
图4为本发明实施例提供的又一种数据存储方法流程图;
图5为本发明实施例提供的另一种函数调用图;
图6为本发明实施例提供的又一种函数调用图;
图7为本发明实施例提供的一种编译器;
图8为本发明实施例提供的另一种编译器;
图9为本发明实施例提供的又一种编译器;
图10为本发明实施例提供的再一种编译器。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施例提供一种数据存储方法,用于编译器,应用于由消息式内存和普通内存构成的混合内存中,如图1所示,包括:
步骤101、判断待存储数据的数据类型。
步骤102、若所述待存储数据的数据类型是预设数据类型,获取所述待存储数据的贡献值。
所述预设数据类型可以为占用内存空间大于预设阈值的数组、第一复杂类型数据或者第二复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组,所述第二复杂类型数据包含自身类型指针,例如链表,该链表结构中包含指向自身结构的指针。
示例的,可以根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中每一个作用域函数的各个访存点的贡献值;层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
步骤103、根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置。
若所述待存储数据的贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中。
若所述待存储数据的贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
这样一来,在存储数据时,首先判断待存储数据的贡献值,然后根据所得贡献值判断待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
需要说明的,在步骤102中计算所述各个函数的贡献值时,对所述作用域函数集合中的任意一个函数f,可以获取函数f中访存点的个数;获取所述函数f中各个访存点的估计执行次数;获取所述函数f中各个访存点的贡献值;获取所述函数f的估计执行次数,然后根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
进一步的,在步骤101之后,若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
本发明实施例提供的数据存储方法,由于在存储数据时,首先判断所述待存储数据的贡献值,然后根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
本发明实施例提供一种数据存储方法,用于编译器,应用于由消息式内存和普通内存构成的混合内存中,如图2所示,包括:
步骤201、获取待存储数据,执行步骤202。
步骤202、判断待存储数据的数据类型,若待存储数据的数据类型为预设数据类型,执行步骤203;若待存储数据的数据类型不是预设数据类型,执行步骤208。
所述预设数据类型可以为占用内存空间大于预设阈值的数组、第一复杂类型数据或者第二复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组,所述第二复杂类型数据包含自身类型指针,例如链表,该链表结构中包含指向自身结构的指针。所述空间大于阈值的数组为占用的内存空间大于预设阈值的数组,所述预设阈值是根据编译器中混合内存的具体结构来设定的,不同的编译器中的预设阈值不同。例如数组a,它所占用的内存空间大于预设阈值M,所述M=4096KB,所述B为内存单位比特,因此,数组a为空间大于阈值的数组。
步骤203、获取待存储数据的作用域函数组成作用域函数集合,执行步骤204。
所述待存储数据的作用域函数指的是一个访问了待存储数据的函数或者调用了该函数的另一函数。所述作用域函数集合包含至少一个作用域函数。
步骤204、标记所述待存储数据在所述作用域函数集合中每个作用域函数的各访存点的贡献值,执行步骤205。
每一个所述作用域函数中包括至少一个待存储数据的访存点,所述访存点指的是作用域函数中待存储数据的使用点。由于待存储数据的数据类型的不同、每一个访存点调用待存储数据的方式不同,因此每一个访存点的贡献值也不相同。
当所述待存储数据为占用内存空间大于预设阈值的数组时,若所述待存储数据在所述作用域函数集合中为循环外数组,标记所述待存储数据的贡献值为0;若所述待存储数据在所述作用域函数集合中指针值为自增或自减,或者固定步长而且循环内连续访问步长个数组元素,标记所述待存储数据的贡献值为k,所述k为相对值,可根据具体情况设定,一般为负;若所述待存储数据在所述作用域函数集合中为除了上述两种类型的其他类型,标记所述待存储数据的贡献值为1。
当所述待存储数据为复杂类型的数组时,若所述待存储数据在所述作用域函数集合中为循环外数组,标记所述待存储数据的贡献值为0;若所述待存储数据在所述作用域函数集合中包含自身类型的指针,且循环内访问的内存空间小于等于待存储数据总存储空间的一半,标记所述待存储数据的贡献值为1;若所述待存储数据在所述作用域函数集合中为除了上述两种类型的其他类型,标记所述待存储数据的贡献值为k,所述k可根据具体情况设定,一般为负值。
假设待存储数据在作用域函数集合中的执行次数为s+h次,即对于所述待存储数据的访问次数为s+h次,其中有适合将待存储数据存储在消息式内存中的访存,共计s次,有适合将待存储数据存储在普通内存中的访存,共计h次。假设将所述待存储数据存储在消息式内存中,则所述s次适合将待存储数据存储在消息式内存中的访存的平均访存时间为t,所述h次适合将待存储数据存储在普通内存中的访存的平均访存时间为k1*t;将所述待存储数据存储在普通内存中,则所述s次适合将待存储数据存储在消息式内存中的访存的平均访存时间为k0*t,所述h次适合将待存储数据存储在普通内存中的访存的平均访存时间为k2*t;则所述k=(k2-k1)/(k0-1)。
步骤205、层次遍历所述待存储数据的作用域函数集合的函数调用图,生成队列q,执行步骤206。
所述遍历(Traversal)是指沿着某条搜索路线,依次对所述函数调用图中每个结点均做一次且仅做一次访问,所述层次遍历是按层次对所述函数调用图进行遍历。所述函数调用图为一种函数关系描述图。对所述待存储数据的作用域函数集合的函数调用图进行层次遍历之后生成队列q,所述队列q由所述待存储数据的作用域函数组成,且每一个所述作用域函数仅出现一次,所述q中所述作用域函数是按层次遍历后的顺序排列的。实际应用中,也可以获取当前编译程序的函数调用图中所有函数作为待存储数据的作用域函数集合,层次遍历后生成队列q,q包括当前编译程序的函数调用图中的所有函数。
例如,函数X中调用函数Y和函数Z,函数Y中调用函数W,则其函数调用图如图3所示。层次遍历所述函数调用图,生成队列q={X,Y,Z,W},其中函数X,函数Y,函数Z,函数W各出现一次,且按照层次顺序排列。
步骤206、按照从后往前的顺序计算所述队列q中的各个函数的贡献值,执行步骤207。
所述从后往前计算也称为逆序遍历。从后往前计算是因为计算一个作用域函数的贡献值时,需要用到它下一个层次的作用域函数的贡献值。
步骤207、根据每个所述作用域函数的贡献值得到所述待存储数据的贡献值V,执行步骤213。
对于所述待存储数据的作用域函数集合中任意一个作用域函数f,可以获取函数f中访存点的个数;获取所述函数f中各个访存点的估计执行次数;获取所述函数f中各个访存点的贡献值;获取所述函数f的估计执行次数。
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
获取所述作用域函数集合中各个作用域函数的贡献值,所述待存储数据的贡献值为各个作用域函数的贡献值之和。
例如,如图3所示的函数调用图,生成队列q={X,Y,Z,W},假设待存储数据在函数W中有两个访存点,第一访存点的贡献值为0,即V1=0,估计执行次数为1,即L1=1;第二访存点的贡献值为k,即V2=k,估计执行次数为100,即L2=100;函数W在整个程序中的估计执行次数为2,即m=2;则函数W的贡献值满足下述公式:
V(W)=m*(V1*L1+V2*L2)=2*(0*1+k*100)=200k+2;
同理,假设函数X的贡献值为10,即V(X)=10;函数Y的贡献值为-200,即V(Y)=-200;函数Z的贡献值为10,即V(Z)=50;则作用域函数集合由函数X,函数Y,函数Z和函数W组成的待存储数据的贡献值为。
如果所述队列q中包括当前编译程序的函数调用图中的所有函数,则所述队列q中未使用待存储数据的函数的贡献值为0。
步骤208、判断待存储数据同层次的数据中是否含有存储在消息式内存的数据,若所述同层次数据中含有存储在消息式内存的数据,执行步骤209;若所述同层次数据中没有存储在消息式内存的数据,执行步骤210。
若待存储数据的数据类型不是预设数据类型,如果将所述待存数数据直接存入普通内存,可能会破坏数据的局部性,而导致不能充分利用计算机缓存,所述局部性指的是CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。数据的局部性越好,越能高效利用计算机缓存。若待存储数据的数据类型不是预设数据类型,可以判断所述待存储数据同层次的数据中是否含有存储在消息式内存的数据,所述同层次的数据为同一个函数内声明的数据。
步骤209、标记所述待存储数据的贡献值大于预设贡献值阈值,执行步骤211。
若所述待存储数据同层次数据中含有存储在消息式内存的数据,由于实际应用中,所述待存储数据与其同层次的数据的调用方式基本相同,因此可以直接判断所述待存储数据的贡献值大于预设贡献值阈值。
步骤210、标记所述待存储数据的贡献值小于等于预设贡献值阈值,执行步骤211。
若所述待存储数据同层次数据中没有存储在消息式内存的数据,可以认为所述待存储数据与其同层次的数据的调用方式没有相似性,则可以直接判断所述待存储数据的贡献值小于等于预设贡献值阈值。
步骤211、判断所述待存储数据的贡献值,若所述贡献值大于预设贡献值阈值,执行步骤212;若所述贡献值小于等于预设贡献值阈值,执行步骤213。
所述预设贡献值阈值可以根据具体情况进行设置。
步骤212、将所述待存储数据存入消息式内存。
步骤213、将所述待存储数据存入普通内存。
需要说明的是,本发明实施例提供的数据存储方法步骤的先后顺序可以进行适当调整,步骤也可以根据情况进行相应增减,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化的方法,都应涵盖在本发明的保护范围之内,因此不再赘述。
本发明实施例提供的数据存储方法,由于在待存储数据存入混合内存之前,首先判断所述待存储数据的贡献值,然后根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
本发明实施例提供一种数据存储方法,用于编译器,如图4所示,包括:
选取GUPS(Giga Updates Per Second)作为具体实施例,GUPS是HPC挑战基准测试程序(HPC Challenge Benchmark)所包含的七个标准的测试用例之一,主要测试内存的随机更新速率,是当前对消息式内存的研究的主要测试用例,
具体实施例代码为:
以上代码只是举例说明,实际应用中可以根据具体情况对该代码进行调整,本发明对此不做详述。
本实施例中待存储数据的任意一个访存点j的贡献值设置遵循下列规则:
当所述待存储数据为占用内存空间大于预设阈值的数组时,若所述待存储数据在所述作用域函数集合中为循环外数组,标记所述待存储数据的贡献值为0;若所述待存储数据在所述作用域函数集合中指针值为自增或自减,或者固定步长而且循环内连续访问步长个数组元素,标记所述待存储数据的贡献值为k,所述k为相对值,可根据具体情况设定,一般为负;若所述待存储数据在所述作用域函数集合中为除了上述两种类型的其他类型,标记所述待存储数据的贡献值为1。
当所述待存储数据为复杂类型的数组时,若所述待存储数据在所述作用域函数集合中为循环外数组,标记所述待存储数据的贡献值为0;若所述待存储数据在所述作用域函数集合中包含自身类型的指针,且循环内访问的内存空间小于等于待存储数据总存储空间的一半,标记所述待存储数据的贡献值为1;若所述待存储数据在所述作用域函数集合中为除了上述两种类型的其他类型,标记所述待存储数据的贡献值为k,所述k可根据具体情况设定,一般为负值。
根据以上规则,本实施例中预设贡献值阈值为0。
步骤401、判断函数A中数据Table的数据类型。
所述Table的数据类型为第一复杂类型。
步骤402、若所述Table的数据类型为预设数据类型,获取所述Table的作用域函数集合。
所述预设数据类型可以为占用内存空间大于预设阈值的数组、第一复杂类型数据或者第二复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组,所述第二复杂类型数据包含自身类型指针。
由于所述Table的数据类型为第一复杂类型,所以Table为所述预设数据类型中的一种。获取所述Table的作用域函数集合,所述Table的作用域函数集合{A,B}。
步骤403、标记数据Table在所述Table的作用域函数集合中每个作用域函数的各个访存点的贡献值。
所述Table在函数A中有一个访存点,即实施例代码中①指示的访存点,称为访存点1,由于所述Table在访存点1处调用方式为循环内且顺序访问数据Table,则所述Table在访存点1处的贡献值为k。
所述Table在函数B中有一个访存点,即实施例代码中②指示的访存点,称为访存点2,由于所述Table在访存点2处调用方式为循环内,且随机访问数据Table,则所述Table在访存点2处的贡献值为1。
步骤404、层次遍历数据Table的作用域函数集合的函数调用图,生成队列q。
所述Table的作用域函数集合的函数调用图如图5所示,层次遍历所述Table的作用域函数集合的函数调用图,生成队列q1={A,B}
所述当前编译程序的函数调用图如图6所示,层次遍历所述当前编译程序的函数调用图生成队列q2={A,B,C}。
步骤405、按照从后往前的顺序计算队列q中每个作用域函数的贡献值。
如果成成的队列q为q1,按照从后往前的顺序计算q1中每个作用域函数的贡献值,首先计算函数B的贡献值,得到V(B)=4*Tablesize,然后计算函数A的贡献值,得到V(A)=k*Tablesize。
如果成成的队列q为q2,从后往前计算q2中每个作用域函数的贡献值,首先计算函数B和函数C的贡献值,得到V(C)=0,V(B)=4*Tablesize,然后计算函数A的贡献值,得到V(A)=k*Tablesize。
步骤406、根据所述队列q中每个作用域函数的贡献值,计算所述待存储数据的贡献值。
如果成成的队列q为q1,由于函数A的贡献值为V(A)=k*Tablesize,函数B的贡献值为V(B)=4*Tablesize,则所述Table的贡献值为VTable=V(A)+V(B)=(4+k)*Tablesize。
如果成成的队列q为q2,由于函数A的贡献值为V(A)=k*Tablesize,函数B的贡献值为V(B)=4*Tablesize,函数C的贡献值为V(C)=0,则所述Table的贡献值为VTable=V(A)+V(B)+V(C)=(4+k)*Tablesize。
步骤407、根据所述待存储数据的贡献值,判断所述待存储数据是否存储在消息式内存中。
VTable=(4+k)*Tablesize,根据待存储数据的访存情况可得所述k=-1.5,则VTable=2.5*Tablesize>0,所以所述Table适合消息式内存。
本发明实施例提供的数据存储方法,由于在存储数据时,首先判断所述待存储数据的贡献值,然后根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
本发明实施例提供一种编译器70,如图7所示,包括:
第一判断单元701,用于判断待存储数据的数据类型。
获取单元702,用于若第一判断单元判断出所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值。
第二判断单元703,用于根据所述获取单元702获取的所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成。
如图8所示,所述获取单元702还包括:
标记子单元7021,用于根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值。
生成子单元7022,用于层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列。
第一计算子单元7023,用于按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值。
第二计算子单元7024,用于获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
具体的,所述第一计算子单元7023用于:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;获取所述函数f中各个访存点的估计执行次数;获取所述函数f中各个访存点的贡献值;获取所述函数f的估计执行次数;根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
需要说明的,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
进一步的,所述第二判断单元703具体用于:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
如图9所示,所述编译器70还包括第三判断单元704,用于:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
本发明实施例提供的编译器,在数据存储时,首先判断待存储数据的贡献值,根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
本发明实施例提供的编译器100,如图10所示,包括处理器1001,用于:
判断待存储数据的数据类型。
若判断单元判断出所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值。
根据所述获取单元获取的所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成。
进一步的,所述处理器1001还用于:
根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值;
于层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;
按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;
获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
具体的,所述处理器1001还用于:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;
获取所述函数f中各个访存点的估计执行次数;
获取所述函数f中各个访存点的贡献值;
获取所述函数f的估计执行次数;
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
需要说明的,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
所述处理器1001还用于:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
进一步的,所述处理器1001还用于:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
本发明实施例提供的编译器,由于在存储数据时,首先判断所述待存储数据的贡献值,然后根据贡献值是否大于预设贡献值阈值来判断所述待存储数据在混合内存中的存储位置,相较于现有技术,在数据存储时考虑到了混合内存的结构,能够支持待存储数据在混合内存中的存储。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理包括,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种数据存储方法,其特征在于,用于编译器,包括:
判断待存储数据的数据类型;
若所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值;
根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成;
所述获取所述待存储数据的贡献值包括:
根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值;
层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;
按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;
获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
2.根据权利要求1所述的方法,其特征在于,所述计算所述各个函数的贡献值包括:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;
获取所述函数f中各个访存点的估计执行次数;
获取所述函数f中各个访存点的贡献值;
获取所述函数f的估计执行次数;
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
<mrow>
<mi>V</mi>
<mrow>
<mo>(</mo>
<mi>f</mi>
<mo>)</mo>
</mrow>
<mo>=</mo>
<mi>m</mi>
<mo>*</mo>
<munder>
<mo>&Sigma;</mo>
<mrow>
<mi>j</mi>
<mo>=</mo>
<mn>1</mn>
<mo>,</mo>
<mi>n</mi>
</mrow>
</munder>
<mrow>
<mo>(</mo>
<msub>
<mi>V</mi>
<mi>j</mi>
</msub>
<mo>*</mo>
<msub>
<mi>L</mi>
<mi>j</mi>
</msub>
<mo>)</mo>
</mrow>
</mrow>
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
3.根据权利要求1至2任意一项权利要求所述的方法,其特征在于,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
4.根据权利要求3所述的方法,其特征在于,
所述根据所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置包括:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
5.根据权利要求1至2任意一项权利要求所述的方法,其特征在于,在所述判断待存储数据的数据类型之后,所述方法还包括:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
6.一种编译器,其特征在于,包括:
第一判断单元,用于判断待存储数据的数据类型;
获取单元,用于若判断单元判断出所述待存储数据的数据类型是预设数据类型,获取所述待存储数据贡献值;
第二判断单元,用于根据所述获取单元获取的所述待存储数据的贡献值判断所述待存储数据在混合内存的存储位置,所述混合内存由消息式内存和普通内存构成;
所述获取单元还包括:
标记子单元,用于根据所述待存储数据的数据类型,标记所述待存储数据在作用域函数集合中的各个访存点的贡献值;
生成子单元,用于层次遍历所述作用域函数集合的函数调用图,生成所述待存储数据的作用域函数队列;
第一计算子单元,用于按照从后往前的顺序计算所述作用域函数队列中的各个函数的贡献值;
第二计算子单元,用于获取所述各个函数的贡献值之和得到所述待存储数据的贡献值。
7.根据权利要求6所述的编译器,其特征在于,所述第一计算子单元具体用于:
获取函数f中访存点的个数,所述函数f为所述作用域函数集合中的任意函数;
获取所述函数f中各个访存点的估计执行次数;
获取所述函数f中各个访存点的贡献值;
获取所述函数f的估计执行次数;
根据所述函数f中访存点的个数、所述函数f中各个访存点的估计执行次数、所述函数f中各个访存点的贡献值及所述函数f的估计执行次数获取所述函数f的贡献值,所述函数f的贡献值V(f)满足下列公式:
<mrow>
<mi>V</mi>
<mrow>
<mo>(</mo>
<mi>f</mi>
<mo>)</mo>
</mrow>
<mo>=</mo>
<mi>m</mi>
<mo>*</mo>
<munder>
<mo>&Sigma;</mo>
<mrow>
<mi>j</mi>
<mo>=</mo>
<mn>1</mn>
<mo>,</mo>
<mi>n</mi>
</mrow>
</munder>
<mrow>
<mo>(</mo>
<msub>
<mi>V</mi>
<mi>j</mi>
</msub>
<mo>*</mo>
<msub>
<mi>L</mi>
<mi>j</mi>
</msub>
<mo>)</mo>
</mrow>
</mrow>
其中,所述Vj表示所述函数f中第j个访存点的贡献值,所述Lj表示所述函数f中第j个访存点的估计执行次数,所述n表示所述函数f中访存点的个数,所述m表示所述函数f的估计执行次数。
8.根据权利要求6至7任意一项权利要求所述的编译器,其特征在于,所述预设数据类型为占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第一复杂类型数据,所述第一复杂类型数据包含至少一个所述占用内存空间大于预设阈值的数组;
或,所述预设数据类型为第二复杂类型数据,所述第二复杂类型数据包含自身类型指针。
9.根据权利要求8所述的编译器,其特征在于,
所述第二判断单元具体用于:
若所述贡献值大于预设贡献值阈值,则将所述待存储数据存储在消息式内存中;
若所述贡献值小于等于所述预设贡献值阈值,则将所述待存储数据存储在普通内存中。
10.根据权利要求6至7任意一项权利要求所述的编译器,其特征在于,所述编译器还包括第三判断单元,用于:
若所述待存储数据的数据类型不是预设数据类型,判断所述待存储数据同层次的数据中是否含有存储在消息式内存中的数据;
若所述待存储数据的同层次的数据中含有存储在消息式内存中的数据,则将待存储数据存储在消息式内存中;
若所述待存储数据的同层次的数据中不含存储在消息式内存中的数据,则将待存储数据存储在普通内存中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310464285.XA CN104516823B (zh) | 2013-09-30 | 2013-09-30 | 一种数据存储方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310464285.XA CN104516823B (zh) | 2013-09-30 | 2013-09-30 | 一种数据存储方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104516823A CN104516823A (zh) | 2015-04-15 |
CN104516823B true CN104516823B (zh) | 2018-04-27 |
Family
ID=52792165
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310464285.XA Active CN104516823B (zh) | 2013-09-30 | 2013-09-30 | 一种数据存储方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104516823B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107391393A (zh) * | 2017-07-28 | 2017-11-24 | 郑州云海信息技术有限公司 | 一种ftl映射表的统计方法及装置 |
CN107741962B (zh) * | 2017-09-26 | 2020-09-29 | 平安科技(深圳)有限公司 | 数据缓存方法及服务器 |
CN116431066B (zh) * | 2023-03-21 | 2024-04-26 | 深圳市万翼数字技术有限公司 | 数据存储方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101441597A (zh) * | 2007-11-22 | 2009-05-27 | 威刚科技股份有限公司 | 可调式混合密度内存储存装置及其控制方法 |
CN101794253A (zh) * | 2009-02-04 | 2010-08-04 | 威刚科技股份有限公司 | 内存储存装置及其控制方法、热门数据控管模块 |
CN102609378A (zh) * | 2012-01-18 | 2012-07-25 | 中国科学院计算技术研究所 | 一种消息式内存访问装置及其访问方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5399508B2 (ja) * | 2009-10-21 | 2014-01-29 | パイオニア株式会社 | コンテンツ複製装置及びコンテンツ複製システム |
-
2013
- 2013-09-30 CN CN201310464285.XA patent/CN104516823B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101441597A (zh) * | 2007-11-22 | 2009-05-27 | 威刚科技股份有限公司 | 可调式混合密度内存储存装置及其控制方法 |
CN101794253A (zh) * | 2009-02-04 | 2010-08-04 | 威刚科技股份有限公司 | 内存储存装置及其控制方法、热门数据控管模块 |
CN102609378A (zh) * | 2012-01-18 | 2012-07-25 | 中国科学院计算技术研究所 | 一种消息式内存访问装置及其访问方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104516823A (zh) | 2015-04-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Davis et al. | Analysis of probabilistic cache related pre-emption delays | |
US8402223B2 (en) | Cache eviction using memory entry value | |
US6098152A (en) | Method and apparatus for miss sequence cache block replacement utilizing a most recently used state | |
US20120179882A1 (en) | Cooperative memory management | |
WO2018072408A1 (zh) | 一种内存分析方法、装置、系统以及计算设备 | |
US20210191765A1 (en) | Method for static scheduling of artificial neural networks for a processor | |
US8495302B2 (en) | Selecting a target number of pages for allocation to a partition | |
US20160012110A1 (en) | General and automatic approach to incrementally computing sliding window aggregates in streaming applications | |
CN111984400A (zh) | 神经网络的内存分配方法及装置 | |
CN108205469B (zh) | 一种基于MapReduce的资源分配方法及服务器 | |
Herrmann et al. | Acyclic partitioning of large directed acyclic graphs | |
US9836396B2 (en) | Method for managing a last level cache and apparatus utilizing the same | |
CN104516823B (zh) | 一种数据存储方法和装置 | |
CN106598674A (zh) | 一种基于可重定位elf文件的软件快速加载方法 | |
CN109587072A (zh) | 分布式系统全局限速系统及方法 | |
US6615316B1 (en) | Using hardware counters to estimate cache warmth for process/thread schedulers | |
CN109597771B (zh) | 用于控制分层存储器系统的方法和装置 | |
CN111858612B (zh) | 基于图数据库的数据加速访问方法、装置及存储介质 | |
CN104050189B (zh) | 页面共享处理方法及装置 | |
US20140372704A1 (en) | Least-recently-used (lru) to first-dirty-member distance-maintaining cache cleaning scheduler | |
CN110162272A (zh) | 一种内存计算缓存管理方法及装置 | |
CN113806089A (zh) | 集群负载资源调度方法、装置、电子设备及可读存储介质 | |
CN110096315B (zh) | 一种组件加载方法和装置 | |
JP6038955B2 (ja) | 高時間的参照局所性のデータフィルバッファの排除防止 | |
US8621156B1 (en) | Labeled cache system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |