CN102096638B - 静态存储的分配方法和装置 - Google Patents
静态存储的分配方法和装置 Download PDFInfo
- Publication number
- CN102096638B CN102096638B CN 201010567232 CN201010567232A CN102096638B CN 102096638 B CN102096638 B CN 102096638B CN 201010567232 CN201010567232 CN 201010567232 CN 201010567232 A CN201010567232 A CN 201010567232A CN 102096638 B CN102096638 B CN 102096638B
- Authority
- CN
- China
- Prior art keywords
- variable
- population
- addr
- size
- storage space
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明提供一种静态存储的分配方法和静态存储的分配装置,涉及数据存储技术领域,为解决现有技术中静态存储时仅限于函数内部定义的静态变量进行存储优化的技术问题而发明。所述方法包括:获取待优化的模块根据所述函数之间的耦合关系,生成一模块模型;获取所述模块的所有的函数调度顺序;获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息;选择优化后所有变量占用的存储空间最小的函数调度顺序;根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译。本发明能够根据函数的全局变量进行存储地址的优化。
Description
技术领域
本发明涉及数据存储技术领域,特别是指一种静态存储的分配方法和装置。
背景技术
静态存储分配是指在程序编译时完成的存储地址的分配,静态存储分配与在程序运行时完成的动态存储分配不同。静态分配没有运行时的开销,对程序的性能没有影响,不存在动态分配时可能出现的分配失败等问题。
静态存储分配的灵活性差比较差,主要体现在:一个变量往往在程序的整个生存期都一直占据所分配的存储空间,降低了存储空间使用上的灵活性。
现有技术中,在Intel 8051的一些C语言编译器里,实现了一定程度的存储复用。例如下面的两个函数f1、f2,如果它们不可能同时处于活动状态(被调用状态),那么可以将f1、f2里静态分配的变量v1、v2复用同一100字节的存储空间。若不进行复用,则需要200个字节的存储空间。
void f1()
{
static char v1[100];
}
void f2()
{
static char v2[100];
}
上述复用技术仅限于函数内部定义的静态变量,而不能处理函数的全局变量。
发明内容
本发明要解决的技术问题是提供一种静态存储的分配方法和装置,能够减少对存储空间的需求。
为解决上述技术问题,本发明的实施例提供技术方案如下:
一方面,提供一种静态存储的分配方法,包括:
步骤1,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
步骤2,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
步骤3,根据所述模块模型,获取所述模块的所有的函数调度顺序;
步骤4,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
步骤5,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值;
步骤6,选择优化后所有变量占用的存储空间最小的函数调度顺序;
步骤7,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址。
所述步骤4之后,所述方法还包括:
将每个所述函数调度顺序按照其对应的所述下确界的大小从小到大排序,选择前第一预定数量个所述函数调度顺序;
所述步骤5具体为:对选择出的每一种函数调度顺序,通过遗传算法优化所有变量的地址分配,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值。
所述步骤5包括:
步骤A,设置当前种群Population为初始种群FirstGen,设置当前种群的上一代种群中的各个体所需存储空间的最小值LastSize的当前值为无穷大,设置演化时存储空间大小未变化的次数SizeCounter的当前值为0,设置总演化次数TotalCounter的当前值为0;
步骤B,设置当前变异概率值Pmut和当前种群规模值Spopu;
步骤C,对当前种群Population里的每一个体Candi,使其以所述概率值Pmut进行变异处理,以概率(1-Pmut)进行交叉处理,产生各新个体NewCandi;
步骤D,从新一代种群NewGen中选出满足以下公式的个体,并用选择出的个体组成选择出的种群SelectedNewGen;
所述公式为:对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Ф;
其中,[Addrx,Addrx+fs(vx)-1]表示变量vx所用存储空间的起止位置所对应的区间;
步骤E,对选择出的种群SelectedNewGen的各个体,去除未使用的存储空间;
步骤F,将当前种群Population和选择出的种群SelectedNewGen合并,得到集合NewAllPopu,将集合NewAllPopu里的各个体按所需存储空间的大小从小到大排序,从中选出前第二预定数量个个体以构成下一代种群NewPopulation,获取当前种群的各个体所需存储空间的最小值NewSize;所述第二预定数量小于或等于当前种群规模值Spopu;
步骤G,将TotalCounter加1,并使用所述下一代种群更新当前种群;当NewSize小于LastSize时,将SizeCounter的当前值设置为0,并使用NewSize的值更新LastSize;当NewSize大于或等于LastSize时,将SizeCounter的当前值加1;
步骤H,判断NewSize是否等于所述下确界中的最小值,如果判断结果为是,则结束演化过程;如果判断结果为否,则转向步骤工;
步骤I,判断是否满足(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),如果判断结果为否,则转向所述步骤B,否则,结束演化过程,其中,第三预定值MAX_NO_IMPROVEMENT、第四预定值MAX_TOTAL为预先设置的值。
所述进行变异处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,产生一个随机分布于区间的整数Offset,其中表示向上取整运算,Size为个体Candi所需存储空间的大小,即Size=maxl=1…N(Addrl+fs(vl)),其中,元素<vl,Addrl>表示变量<vl,Addrl>和所述变量的起始地址<vl,Addrl>;
先以预定概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi,其中,mod表示取余运算;
其中,Size=maxl=1…N(Addrl+fs(vl))表示:如果变量名是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储空间大小的最大值;否则返回变量名所占存储空间的大小;
所述Offset生成方法为:
其中,round表示四舍五入运算。
所述进行交叉处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,从当前种群Population中以等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l。
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
所述初始种群FirstGen通过以下步骤生成:
求出共存变量集的集合VarGroupi中各元素的并集,记作AllVar;
将AllVar里的所有元素的个数记作N,得到AllVar里的所有元素的第五预定数量种排列,记作Perms,所述第五预定数量小于或者等于INIT_POPU_SIZE,所述INIT_POPU_SIZE为预先设置值;
针对Perms里的每一种排列,得到对应的各个个体,将这些个体组成集合,生成所述初始种群FirstGen;
所述个体为以下步骤获取的:
将种群的各变量按照先后顺序依次分配相邻的存储空间,即得到对应的个体。
所述共存变量集的集合是通过以下步骤获取的:
获取所述模块按照所述函数调度顺序进行处理时,根据所述模块执行过程中同时存在的变量的情况,生成与该调度顺序对应的共存变量集;
组合所述共存变量集,生成共存变量集的集合;
所述下确界是通过以下步骤获取的:
获取每个函数调度顺序的各个所述共存变量集占用的存储空间的最大值,作为所述函数调度顺序对应的所有变量所需存储空间的下确界。
所述步骤2中模块模型按照如下方式生成:
函数包括函数名称、输入变量、输出变量以及输出变量所占存储空间的大小;函数的输出变量包括函数执行过程中用到的临时变量;
同一函数被多次调用时,使用不同的函数名称;
模块模型包括输入变量、输入变量所占存储空间的大小、输出变量、例外变量以及至少一个别名变量集,所述输出变量包含所述模块内的函数的输出变量,所述例外变量不被优化处理,每个别名变量集包含多个互为别名关系的变量;当一个变量出现N次写入,则引入N个新变量,使得任何一个变量只被写入一次;新变量与原变量互称别名,其中,N为>1的自然数。
另一方面,提供一种静态存储的分配装置,包括:
模块获取单元,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
模型生成单元,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
函数调度顺序获取单元,根据所述模块模型,获取所述模块的所有的函数调度顺序;
下确界获取单元,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
优化单元,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值;
选择单元,选择优化后所有变量占用的存储空间最小的函数调度顺序;
编译单元,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址。
本发明的实施例具有以下有益效果:
上述方案中,通过函数间的数据依赖关系,从程序的全局出发,对变量的静态分配进行优化,能够尽可能多地复用存储空间,减少对存储空间的需求。
附图说明
图1为本发明的所述的静态存储的分配方法的流程示意图;
图2为本发明的所述的静态存储的分配装置的结构示意图;
图3为一待优化模块的示意图;
图4为本发明的所述的静态存储的分配方法的应用场景的流程示意图;
图5为本发明的所述的静态存储的分配方法中遗传算法的流程示意图;
图6为本发明的所述的静态存储的分配装置的应用场景的结构示意图。
具体实施方式
为使本发明的实施例要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明是一种适用于静态存储分配的优化方法和装置,尤其适用于存储资源有限的嵌入式处理器领域的静态存储分配。通过一系列函数间的数据依赖关系,从全局出发,对静态变量、全局变量等的静态分配进行优化,以尽可能多地复用存储空间,减少对存储空间的需求。
例如下面的例子中,v1仅被函数f1、f2使用,v2仅被函数f3、f4使用,四个函数被顺次调用,这时,v1、v2也可复用相同的存储空间。
char v1[100];
char v2[100];
void f1(){//使用v1}
void f2(){//使用v1}
void f3(){//使用v2}
void f4(){//使用v2}
本发明中用到了集合的若干种运算,为描述方便,集中说明如下:
如图1所示,为本发明所述的一种静态存储的分配方法,包括:
步骤11,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
步骤12,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
步骤13,根据所述模块模型,获取所述模块的所有的函数调度顺序;
步骤14,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
步骤15,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值;
步骤16,选择优化后所有变量占用的存储空间最小的函数调度顺序;
步骤17,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址。
所述步骤14之后,所述方法还包括:
将每个所述函数调度顺序按照其对应的所述下确界的大小从小到大排序,选择前第一预定数量个所述函数调度顺序;
所述步骤15具体为:对选择出的每一种函数调度顺序,通过遗传算法优化所有变量的地址分配,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值。
所述步骤15包括:
步骤A,设置当前种群Population为初始种群FirstGen,设置当前种群的上一代种群中的各个体所需存储空间的最小值LastSize的当前值为无穷大,设置演化时存储空间大小未变化的次数SizeCounter的当前值为0,设置总演化次数TotalCounter的当前值为0;
步骤B,设置当前变异概率值Pmut和当前种群规模值Spopu;
步骤C,对当前种群Population里的每一个体Candi,使其以所述概率值Pmut进行变异处理,以概率(1-Pmut)进行交叉处理,产生各新个体NewCandi;
步骤D,从新一代种群NewGen中选出满足以下公式的个体,并用选择出的个体组成选择出的种群SelectedNewGen;
所述公式为:对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Ф;
其中,G表示集合VarGroupi里的一个元素。“∈”表示集合里的“属于”关系。
其中,[Addrx,Addrx+fs(vx)-1]表示变量vx所用存储空间的起止位置所对应的区间;
步骤E,对选择出的种群SelectedNewGen的各个体,去除未使用的存储空间;
步骤F,将当前种群Population和选择出的种群SelectedNewGen合并,得到集合NewAllPopu,将集合NewAllPopu里的各个体按所需存储空间的大小从小到大排序,从中选出前第二预定数量个个体以构成下一代种群NewPopulation,获取当前种群的各个体所需存储空间的最小值NewSize;所述第二预定数量小于或等于当前种群规模值Spopu;
步骤G,将TotalCounter加1,并使用所述下一代种群更新当前种群;当NewSize小于LastSize时,将SizeCounter的当前值设置为0,并使用NewSize的值更新LastSize;当NewSize大于或等于LastSize时,将SizeCounter的当前值加1;
步骤H,判断NewSize是否等于所述下确界中的最小值,如果判断结果为是,则结束演化过程;如果判断结果为否,则转向步骤I;
步骤I,判断是否满足(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),如果判断结果为否,则转向所述步骤B,否则,结束演化过程,
其中,第三预定值MAX_NO_IMPROVEMENT、第四预定值MAX_TOTAL为预先设置的值。
所述进行变异处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,产生一个随机分布于区间的整数Offset,其中表示向上取整运算,Size为个体Candi所需存储空间的大小,即Size=maxl=1…N(Addrl+fs(vl)),其中,元素<vl,Addrl>表示变量<vl,Addrl>和所述变量的起始地址<vl,Addrl>;
先以预定概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi,其中,mod表示取余运算;
其中,Size=maxl=1…N(Addrl+fs(vl))表示:如果变量名是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储空间大小的最大值;否则返回变量名所占存储空间的大小;
所述Offset生成方法为:
所述进行交叉处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,从当前种群Population中以等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l。
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
所述初始种群FirstGen通过以下步骤生成:
求出共存变量集的集合VarGroupi中各元素的并集,记作AllVar;
将AllVar里的所有元素的个数记作N,得到AllVar里的所有元素的第五预定数量种排列,记作Perms,所述第五预定数量小于或者等于INIT_POPU_SIZE,所述INIT_POPU_SIZE为预先设置值;
针对Perms里的每一种排列,得到对应的各个个体,将这些个体组成集合,生成所述初始种群FirstGen;
所述个体为以下步骤获取的:
将种群的各变量按照先后顺序依次分配相邻的存储空间,即得到对应的个体。
所述共存变量集的集合是通过以下步骤获取的:
获取所述模块按照所述函数调度顺序进行处理时,根据所述模块执行过程中同时存在的变量的情况,生成与该调度顺序对应的共存变量集;
组合所述共存变量集,生成共存变量集的集合;
所述下确界是通过以下步骤获取的:
获取每个函数调度顺序的各个所述共存变量集占用的存储空间的最大值,作为所述函数调度顺序对应的所有变量所需存储空间的下确界。
所述步骤12中模块模型按照如下方式生成:
函数包括函数名称、输入变量、输出变量以及输出变量所占存储空间的大小;函数的输出变量包括函数执行过程中用到的临时变量;
同一函数被多次调用时,使用不同的函数名称;
模块模型包括输入变量、输入变量所占存储空间的大小、输出变量、例外变量以及至少一个别名变量集,所述输出变量包含所述模块内的函数的输出变量,所述例外变量不被优化处理,每个别名变量集包含多个互为别名关系的变量;当一个变量出现N次写入,则引入N个新变量,使得任何一个变量只被写入一次;新变量与原变量互称别名,其中,N为>1的自然数。
如图2所示,为本发明所述的静态存储的分配装置,包括:
模块获取单元21,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
模型生成单元22,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
函数调度顺序获取单元23,根据所述模块模型,获取所述模块的所有的函数调度顺序;
下确界获取单元24,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
优化单元25,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小趋近或到达所述下确界的最小值;
选择单元26,选择优化后所有变量占用的存储空间最小的函数调度顺序;
编译单元27,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址。
所述优化单元25包括:
第一设置子单元,设置当前种群Population为初始种群FirstGen,设置当前种群的上一代种群中的各个体所需存储空间的最小值LastSize的当前值为无穷大,设置演化时存储空间大小未变化的次数SizeCounter的当前值为0,设置总演化次数TotalCounter的当前值为0;
第二设置子单元,设置当前变异概率值Pmut和当前种群规模值Spopu;
变异/交叉子单元,对当前种群Population里的每一个体Candi,使其以所述概率值Pmut进行变异处理,以概率(1-Pmut)进行交叉处理,产生各新个体NewCandi;
第一选择子单元,从新一代种群NewGen中选出满足以下公式的个体,并用选择出的个体组成选择出的种群SelectedNewGen;
所述公式为:对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Ф;
其中,[Addrx,Addrx+fs(vx)-1]表示变量vx所用存储空间的起止位置所对应的区间;
存储空间去除子单元,对选择出的种群SelectedNewGen的各个体,去除未使用的存储空间;
第二选择子单元,将当前种群Population和选择出的种群SelectedNewGen合并,得到集合NewAllPopu,将集合NewAllPopu里的各个体按所需存储空间的大小从小到大排序,从中选出前第二预定数量个个体以构成下一代种群NewPopulation,获取当前种群的各个体所需存储空间的最小值NewSize;所述第二预定数量小于或等于当前种群规模值Spopu;
更新子单元,将TotalCounter加1,并使用所述下一代种群更新当前种群;当NewSize小于LastSize时,将SizeCounter的当前值设置为0,并使用NewSize的值更新LastSize;当NewSize大于或等于LastSize时,将SizeCounter的当前值加1;
第一判断子单元,判断NewSize是否等于所述下确界中的最小值,如果判断结果为是,则结束演化过程;如果判断结果为否,则启动第二判断子单元;
第二判断子单元,判断是否满足(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),如果判断结果为否,则转向所述步骤B,否则,结束演化过程,其中,第三预定值MAX_NO_IMPROVEMENT、第四预定值MAX_TOTAL为预先设置的值。
所述变异/交叉子单元进行变异处理具体为:
从个体Candi中以等概率选出一组元素(vl,Addrl),产生一个随机分布于区间的整数Offset,其中表示向上取整,Size为个体Candi所需存储空间的大小,即Size=maxl=1…N(Addrl+fs(vl)),其中,元素(vl,Addrt)表示变量和所述变量的起始地址;
先以预定概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi,其中,mod表示取余运算;
其中,Size=maxl=1…N(Addrl+fs(vl))表示:如果变量名是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储空间大小的最大值;否则返回变量名所占存储空间的大小;
所述Offset生成方法为:
所述变异/交叉子单元进行交叉处理具体为:
从个体Candi中以等概率选出一组元素<vl,Addrl>,从当前种群Population中以等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l。
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
图3为一示例性的待优化模块的示意图,以下结合图3说明本发明所述的静态存储的分配方法的应用场景。如图4所示,所述方法包括:
步骤1,确定要处理的模块。本发明中所述的模块由一系列紧密耦合在一起的函数构成,具备明确的输入和输出。如图3所示的例子中,3个函数紧密耦合在一起构成一个模块,该模块的输入为“变量1”,输出为“变量4”。
步骤2,生成模块模型,规则如下:
(1)函数模型包括函数名、输入以及输出。
(2)同一函数多次调用时,使用不同的函数名称加以区分。
(3)函数的输入包含一系列变量(称为函数的输入变量集)。
(4)函数的输出包含一系列变量及其所占的存储大小(称为函数的输出变量集)。
(5)对于函数执行过程中用到的临时变量,也归为函数的输出。
(6)模块模型包括输入(称为模块的输入变量集)、输出(称为模块的输出变量集)和一个称为例外变量集(记作ExcludeSet)的变量集合,该例外变量集里的变量将被视为由程序外的其它机制分配而不在本方法所优化的范围。
(7)模块的输入包含一系列变量及其所占的存储大小。
(8)模块的输出包含一系列由模块内的函数输出的变量。
(9)如果一个变量出现N(N>1)次写入,则分别引入N个新的变量,使得任何一个变量只被写入一次;这样的新变量与原变量互称“别名”。
(10)模型中包括若干别名变量集,每个别名变量集包含若干互为别名关系的变量。变量间的别名关系用模型里的别名变量集来表征。
将所有函数里出现的别名变量集加以归并,具体为:若含有相同的变量,则并入同一集合。为归并后的每一别名变量集定义一个唯一的变量名(下称“替代名”),并保存从别名变量集里的变量到新定义的变量名的映射关系。为描述方便,定义函数fm(变量名):如果“变量名”包含于某归并后的别名变量集中,则fm(变量名)返回为该别名变量集定义的变量名;否则直接返回“变量名”。fm也可作用于变量名的集合:fm({x|x是变量名})返回{fm(x)|x是变量名}。
为描述方便,定义函数fs(变量名):如果“变量名”是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储大小的最大值;否则直接返回“变量名”所占存储的大小。
例如,在图3所示的例子中,模块的输入为“变量1”,输出为“变量4”,其中“变量1”由外部控制,不在优化范围内,“变量1”属于例外变量集;“变量1”、“变量2”、“变量3”、“变量4”、“变量5”的大小分别为S--1、S--2、S--3、S--4、S--5,函数2执行后,变量2内的内容被更新,函数3用变量3和更新过的变量2为输入,据此可得到模块的模型如下:
(1)函数1:输入变量集{变量1},输出变量集{变量2(大小为S--2),变量5(大小为S--5)};
(2)函数2:输入变量集{变量2,变量5},输出变量集{变量2’(大小为S--2),变量3(大小为S--3)};
(3)函数3:输入变量集{变量2’,变量3},输出变量集{变量4(大小为S--4)};
(4)模块:输入变量集{变量1(大小为S--1)},输出变量集{变量4},例外变量集{变量1},别名变量集{变量2,变量2’}。
其中,由于函数2改写了变量2,模型中引入了新的变量“变量2’”来表示更新后的变量2,同时将它们写入了一个别名变量集里。
步骤3,根据模块模型,得到所有可能的函数调度路径。
为描述方便,定义一个包含两项内容的数据结构ScheduleType:一项为调度路径Path,为函数名的列表;一项为与该路径对应的已有输入的集合ReadySet。
该步骤得到包含若干ScheduleType型数据的集合ScheduleSet,其中所有的Path即构成所有可能的函数调度方法,具体包括:
步骤30,初始化ScheduleType集,ScheduleSet为只含一个ScheduleType数据Schedule0,其Path0为空列表,其ReadySet0为模块的输入变量集。
步骤31,初始化一个空集NewScheduleSet,针对ScheduleSet里的每一项Schedulei执行步骤311-313,其中将Schedulei里的调度路径记作Pathi,已有输入的集合记作ReadySeti。
步骤311,如果模块的输出变量全部包含于ReadySeti,将Schedulei放入NewScheduleSet,并转步骤31处理ScheduleSet里的下一个元素。
步骤312,从尚未调用的函数里选出当前可以被调用的所有候选函数,记入集合FunCandidates。候选函数的判断准则为:其输入变量全部包含于ReadySeti。如果FunCandidates为空集,则提示模块模型有误,直接结束。
步骤313,对FunCandidates里的每一候选函数Candidatej,执行步骤3131-3132,其中,j表示候选函数的序号。
步骤3131,将Candidatej附加到Pathi的末尾,记作Pathi|j,将Candidatej的输出合并到集合ReadySeti,记作ReadySeti|j。
步骤3132,用Pathij、ReadySeti|j构成Schedulei|j,并放入集合NewScheduleSet。
步骤32,比较集合NewScheduleSet与ScheduleSet,如果两者不同,则以NewScheduleSet代替ScheduleSet并转步骤31.
步骤33,将ScheduleSet中的每一Schedule里的Path提取出来,并组成集合PathSet。
为描述方便,定义函数fdeps(函数名),其返回fm(该函数的输入变量集∪输出变量集),并将fdeps返回的集合称为函数的“依赖集”。
例如,在图3所示的例子中,函数所有的调度顺序为一种,即:函数1→函数2→函数3。
步骤4,为PathSet里的每一Pathi导出存储分配方案AllocPlani,具体如步骤41-45。这里AllocPlani为一系列存储分配和释放命令的列表。分配命令包含所分配变量的变量名,释放命令包含要释放变量的变量名。
步骤41,将命令行表AllocPlani初始化为空,设置表示已分配变量集的临时变量Allocated为空集,将Pathi复制一份记作ThisPath。
步骤42,设置表示待分配变量集的临时变量NeedAllocSet为fm(模块的输入变量集),设置表示待释放变量集的临时变量CanFreeSet为空集。
步骤43,为临时变量CanFreeSet里的每一个变量产生一个释放命令追加到AllocPlani末尾,这里产生命令的顺序可以任意选择。
步骤44,为NSet里的每一个变量产生一个分配命令追加到AllocPlani末尾,这里产生命令的顺序可以任意选择,NSet由下式给出:
NSet←NeedAllocSet-fm(ExcludeSet),也就是根据NSet←NeedAllocSet-fm(ExcludeSet)和NSet←NeedAllocSet-fm(ExcludeSet)之间的差集来更新NSet←NeedAllocSet-fm(ExcludeSet)。
步骤45,按下式更新Allocated:
Allocated←Allocated∪NeedAllocSet,也就是说:根据Allocated和Allocated←Allocated∪NeedAllocSet之间的并集来更新Allocated。
步骤46,若ThisPath不为空,则执行步骤461-463。
步骤461.计算当前不能释放的变量的集合Sdeps如下
按下式更新CanFreeSet:
CanFreeSet←Allocated-Sdeps。
步骤462,记ThisPath里的第一个元素为F0,按下式更新NeedAllocSet:
NeedAllocSet←fdeps(F0)-Allocated
步骤463,去掉ThisPath里的第一个元素并转步骤43。
步骤5,对每一路径得出了“共存变量集”的集合。具体为:分析PathSet里的每一Pathi所对应的存储分配方案AllocPlani,得到集合VarGroupi。VarGroupi里的每一个元素都是包含若干变量的非空集合,称这些集合为“共存变量集”。得到VarGroupi的具体步骤如步骤51-53所示。
步骤51,将VarGroupi初始化为空集;创建表示共存变量集的临时变量CurSet,并初始化为空集;创建标示上次分配命令类型的AllocFlag为“分配”。
步骤52,顺序遍历AllocPlani,对AllocPlani里的每一个命令Cmd,执行步骤521。
步骤521,由于Cmd有“分配”、“释放”两种,AllocFlag亦有“分配”、“释放”两种,分4种组合方式如下:
(1)如果AllocFlag为“分配”且Cmd为分配变量Var,则将Var加入CurSet;
(2)如果AllocFlag为“分配”且Cmd为释放变量Var,则将CurSet放入VarGroupi,然后将CurSet清空,并将AllocFlag置为“释放”;
(3)如果AllocFlag为“释放”且Cmd为分配变量Var,则将Var加入CurSet,并将AllocFlag置为“分配”;
(4)如果AllocFlag为“释放”且Cmd为释放变量Var,则将Var从集合CurSet中剔除。
步骤53.若CurSet不为空集,则将CurSet放入VarGroupi。
后续步骤中,将利用遗传算法完成存储分配的优化,其中个体包含所有需要分配的变量(即每一个AllocPlani中出现的所有变量)的变量名及其起始地址,种群是若干个体的集合。明了起见,以下将个体描述为一系列二元组的集合,二元组包含变量名及其起始地址,并记作“<变量名,起始地址>”。
步骤6,为PathSet里的每一Pathi得到所需存储空间大小的下确界Infi,以及初始种群FirstGeni,其中,i表示每个函数调度顺序的序号。具体步骤如步骤61-64所示。
步骤61,求出VarGroupi中各元素的并集,记作AllVar:
步骤62,计算下确界Infi如下:
步骤63,将AllVar里的所有元素的个数记作N,得到AllVar里的所有元素的至多INIT_POPU_SIZE种排列,记作Perms,方法如下:
(1)如果N!>INIT_POPU_SIZE(这里N!表示N的阶乘),则任意选出INIT_POPU_SIZE种排列;
(2)如果N!≤INIT_POPU_SIZE,则得到所有的N!种排列。
步骤64,针对Perms里的每一种排列,得到对应的各个个体,将这些个体组成集合即得FirstGen。得到Perms里的某一排列P对应的个体的步骤为641。
步骤641,将P中的各变量按先后顺序依次分配相邻的存储空间,即得到对应的个体。具体地,将P中的各变量按先后顺序记作v1,v2,…vN,则变量vl的起始地址Addri为:
P对应的个体为:
{<vl,Addrl>l=1…N}
步骤7,按Infi将PathSet里的每一Pathi从小到大排列,选出最小的至多INIT_CANDI_SIZE项,构成CandiPathSet,并将各Infi最小值称为模块所需存储大小的下确界,记作Inf。
步骤8,将CandiPathSet里的各Pathi布置到一个或多个处理器或处理器内核上,利用遗传算法对各Pathi对应的种群进行演化以趋近或到达各自的Infi,从而趋近或到达Inf。当针对某一Pathi的演化到达Infi且Infi=Inf时,模块存储优化过程即告完成,其它尚在运行之中的演化过程可即行终止。
步骤9,待针对各Pathi的演化过程皆终止后,最后选出所有Pathi里所占存储最小的个体,给出关于各变量的起始地址、与之对应的Pathi、从别名变量集里的变量到替代名间的对应关系等信息,根据上述信息修改原模块,达到在节省存储的目的。
这里遗传算法针对CandiPathSet里每一Pathi所对应的FirstGeni.VarGroupi进行演化,具体步骤如如图5所示,包括:
步骤A,置种群Population为FirstGeni,置上一代种群各个体所需存储的最小值LastSize为无穷大,置演化时存储大小未变化的次数SizeCounter为0,置总演化次数TotalCounter为0。
步骤B,设置适用于当前一次繁殖的变异概率Pmut、种群规模Spopu。这里Pmut、Spopu叫随着演化过程的进行而减少。
步骤C,对Population里的每一个体Candi,使其以概率Pmut发生变异(也称“突变”),以概率(1-Pmut)发生交叉(也称交配),产生各新个体NewCandi构成新一代种群NewGen。
这里的变异操作如步骤C1所示,交叉操作如步骤C2所示。
步骤C1,从Candi中以等概率选出一组<vl,Addrt>,产生一个随机分布于区间的整数Offset,要求其值越大则出现的概率越小。这里的表示向上取整,Size为个体Candi所需存储的大小,由下式给出:
Size=maxl=1…N(Addrl+fs(vl));
然后以50%的概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi。这里的“mod”表示取余运算。
这里,Offset的产生方法可以任意构造,例如如步骤C11所示的方法。
其中,round表示四舍五入。
步骤C2,从Candi中以等概率选出一组<vl,Addrl>,从Population中等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l。
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
步骤D,利用“共存变量集”的集合对个体进行筛选,直接淘汰不符合条件的个体。具体为:从NewGen中选出满足VarGroupi要求的个体,即满足下式的个体:
对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Ф
这里的[Addrx,Addrx+fs(vk)-1]表示变量vx所用存储起止位置所对应的区间。
用满足上述要求的所有个体组成种群SelectedNewGen。
步骤E,对SelectedNewGen的各个体,通过去除未使用的存储空间来减小所需存储的大小。具体地,对于某个体Candi,如果发现有不被任何一个[Addrl,Addrl+fs(vl)-1]l=1…N所覆盖的存储单元,则将起始地址大于该存储单元地址的所有变量前移,然后重复上述过程,直至所有的存储空间都得以利用。
步骤F,将Population和SelectedNewGen两个种群合并得到集合NewAllPopu,将NewAllPopu里的各个体按所需存储的大小(计算公式参见步骤C1)排序(所需存储的最小值记作NewSize),大小相同的排列次序可任意选择,然后从中选出至多Spopu个个体构成集合NewPopulation。(说明:这里以所需存储的大小表征个体的适应度,所需存储越小,适应度越大,反之则越小。)
步骤G,更新遗传算法的相关状态和计数器:
Population←NewPopulation
TotalCounter←TotalCounter+1
步骤H,若NewSize=Infi,演化过程结束,Population中所需存储最小的个体即为优化所得的结果。
步骤I,若(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),则转步骤B,否则Population中所需存储最小的个体即为优化所得的结果,演化过程结束。
上述步骤中涉及常数INIT_CANDI_SIZE、MAX_NO_IMPROVEMENT、MAX_TOTAL、INIT_POPU_SIZE可根据模块的复杂度灵活设置。
步骤8中,如果最终所需存储大小大于Inf,可增大MAX_NO_IMPROVEMENT与MAX_TOTAL,酌情增大INIT_POPU_SIZE,并微调变异概率Pmut、种群规模Spopu的调整策略,然后重新执行步骤8,直至最终所需存储大小等于Inf或者经考虑认为从遗传算法中得到的优化结果已可接受。
步骤9,根据优化结果进行程序编译。
以下结合图3说明本发明所述的静态存储的分配方法的应用场景。所述方法包括:
步骤1,确定要处理的模块。本发明中所述的模块由一系列紧密耦合在一起的函数构成,具备明确的输入、输出。
步骤2,生成模块模型。
在图3所示的例子中,模块的输入为“变量1”,输出为“变量4”,其中“变量1”由外部控制,不在优化范围内;“变量1”、“变量2”、“变量3”、“变量4”、“变量5”的大小分别为S--1、S--2、S--3、S--4、S--5;函数2执行后,变量2内的内容被更新,函数3用变量3和更新过的变量2为输入,据此可得到模块的模型如下:
(1)函数1:输入变量集{变量1},输出变量集{变量2(大小为S--2),变量5(大小为S--5)}
(2)函数2:输入变量集{变量2,变量5},输出变量集{变量2’(大小为S--2),变量3(大小为S--3)}
(3)函数3:输入变量集{变量2’,变量3},输出变量集{变量4(大小为S--4)}
(4)模块:输入变量集{变量1(大小为S--1)},输出变量集{变量4},例外变量集{变量1},别名变量集{变量2,变量2’}。
简明起见,将函数1、2、3分别写作f1、f2、f3;“变量1”、“变量2”、“变量3”、“变量4”、“变量5”分别写作v1、v2、v3、v4、v5。由于后续步骤需要实际数据,所以给S--1、S--2、S--3、S--4、S--5分别赋值为100、10、20、100、100.(单位可以是“字节”、“比特”等)
这样上述模型变为:
(1)f1:输入变量集{v1},输出变量集{v2(大小为10),v5(大小为100)}
(2)f2:输入变量集{v2,v5},输出变量集{v2’(大小为10),v3(大小为20)}
(3)f3:输入变量集{v2’,v3},输出变量集{v4(大小为100)}
(4)模块:输入变量集{v1(大小为100)},输出变量集{v4},例外变量集{v1},别名变量集{v2,v2’}。
为别名变量集{v2,v2’}构造一个“替代名”“alias_v2”。
步骤3,得到所有的调度方法。图3中只有一种:f1-->f2-->f3。
步骤4,存储分配方案:
分配alias_v2;
分配v5;
分配v3;
释放v5;
分配v4。
步骤5,得到共存变量集的集合:{{alias_v2,v5,v3},{alias_v2,v4,v3}}
步骤6,共存变量集{alias_v2,v5,v3}需要的存储大小为10+100+20=130;
共存变量集{alias_v2,v4,v3}需要的存储大小为10+100+20=130。
调度路径f1-->f2-->f3对应的存储下确界为130,初始种群为:{<v3,0>,<v4,20>,<v5,120>,<alias_v2,220>},{<v5,0>,<v4,100>,<v3,200>,<alias_v2,220>},……等等
各调度方法的下确界的最小值Inf也是130。
步骤7,由于只有一种调度路径,所以这一步不需要特别处理。
步骤8,遗传算法能使存储分配达到Inf,算法结束。遗传算法进行过程中截取若干代如下:(列出了里面所需存储空间最小的一个个体及对应的存储空间大小)
初始:{<v3,0>,<v4,20>,<v5,120>,<alias_v2,220>},存储空间大小为230;
第10代:{<v3,0>,<v4,30>,<v5,101>,<alias_v2,20>},存储空间大小为201;
第31代:{<v3,0>,<v4,66>,<v5,30>,<alias_v2,20>},存储空间大小为166;
第46代:{<v3,10>,<v4,30>,<v5,30>,<alias_v2,0>},存储空间大小为130,到达Inf。
步骤9,选出第46代,根据所述第46代进行程序编译。
相应的,实现执行上述各步骤的装置包括如图6所示的四个单元。
模型生成单元,相当于上述的模块获取单元和模型生成单元,执行上述步骤1、2,分析待优化模块的源代码,生成所要优化的模块的模型;
模型处理单元,相当于上述的函数调度顺序获取单元、下确界获取单元,执行上述步骤3到7,对模块模型进行处理,为执行步骤8及步骤A到I完成各种准备工作;模型处理模块还将根据待优化模块的规模等信息确定遗传算法中用到的INIT_CANDI_SIZE、MAX_NO_IMPROVEMENT、MAX_TOTAL、INIT_POPU_SIZE等四个参数,具体可如下表所示进行计算:
遗传算法单元,相当于上述的优化单元,执行步骤A到I,对模块内函数一种特定调度方法所需的存储大小进行优化,该模块由算法控制模块启动,并将优化结果传递给算法控制模块;遗传算法模块在执行步骤B时,设置适用于当前一次繁殖的变异概率Pmut、种群规模Spopu,这里Pmut、Spopu随着演化过程的进行而减少,例如可根据(TotalCounter/MAX_TOTAL)的大小设置如下:
算法控制单元,执行步骤8,利用遗传算法模块对模块内函数各种调度方法所需的存储大小进行优化,最终得到模块所需存储最小的变量分配方法及对应的函数调度方法,完成静态存储分配的优化处理;
编译单元,根据上述优化处理结果进行编译。
由于对不同的调度方法的优化互不干扰,所以,如果有多个处理器或处理器内核,算法控制模块可在这些处理器或处理器内核上同时针对不同的调度方法运行算法控制模块,同时对不同的调度方法进行演化,充分利用计算资源,提高优化速度。具体地,可以依照处理器或处理器内核的个数创建多个线程,每个线程上运行一个针对某一调度方法的遗传算法模块,通常这些线程将由操作系统自动分配到不同的处理器或处理器内核上执行。
本发明公开了一种应用于静态存储分配的优化方法及其装置。该方法利用遗传算法使静态分配的存储尽可能地得到复用,从而减少对存储大小的需求,实现静态存储分配的优化。
本发明通过生成模块模型,分析模型得到不同的函数调用路径,针对每一路径利用遗传算法尽可能地通过存储复用来减少对存储大小的需求,最后采用需要存储最少的函数调用路径,从而实现对整个模块占用存储大小的优化,达到或趋近于函数调用路径所对应的存储大小的下确界。
本发明提高了存储空间的利用率,减少了对存储空间的需求,对于不需要同时存在的变量,令其复用相同的存储空间,从而缩减了存储空间、降低了功耗、降低了成本。
与人工实现的存储复用相对比,本发明中的方法具有如下优点:
(1)可以达到或尽可能接近整个模块所需存储的理论上的下确界,存储复用程度更高,能更好地减少对存储大小的需求;(2)可以保证存储分配结果的正确性;(3)代码修改后,用本发明中的方法可以方便地重新进行优化,使代码易于维护。
与编译器实现的存储复用相对比,本发明中的方法至少具有如下优点:
(1)全盘考虑模块内的所有函数,可以达到或尽可能接近整个模块所需存储的下确界,存储复用程度更高,能更好地减少对存储大小的需求;(2)不依赖于编译器,对不同的编译器都能实现相同的节省存储空间的效果。
本发明中所述的模块,是指在程序设计中,为完成某一功能所需的紧密相关或耦合在一起的若干函数、过程或者方法;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统的一部分。
所述方法实施例是与所述装置实施例相对应的,在方法实施例中未详细描述的部分参照装置实施例中相关部分的描述即可,在装置实施例中未详细描述的部分参照方法实施例中相关部分的描述即可。
本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括如上述方法实施例的步骤,所述的存储介质,如:磁盘、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
在本发明各方法实施例中,所述各步骤的序号并不能用于限定各步骤的先后顺序,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,对各步骤的先后变化也在本发明的保护范围之内。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种静态存储的分配方法,其特征在于,包括:
步骤1,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
步骤2,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
步骤3,根据所述模块模型,获取所述模块的所有的函数调度顺序;
步骤4,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
步骤5,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小到达所述下确界的最小值;
步骤6,选择优化后所有变量占用的存储空间最小的函数调度顺序;
步骤7,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址;其中,所述步骤5包括:
步骤A,设置当前种群Population为初始种群FirstGen,设置当前种群的上一代种群中的各个体所需存储空间的最小值LastSize的当前值为无穷大,设置演化时存储空间大小未变化的次数SizeCounter的当前值为0,设置总演化次数TotalCounter的当前值为0;
步骤B,设置当前变异概率值Pmut和当前种群规模值Spopu;
步骤C,对当前种群Population里的每一个体Candi,使其以所述概率值Pmut进行变异处理,以概率(1-Pmut)进行交叉处理,产生各新个体NewCandi;
步骤D,从新一代种群NewGen中选出满足以下公式的个体,并用选择出的个体组成选择出的种群SelectedNewGen;
所述公式为:对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Φ;
其中,[Addrx,Addrx+fs(vx)-1]表示变量vx所用存储空间的起止位置所对应的区间;
步骤E,对选择出的种群SelectedNewGen的各个体,去除未使用的存储空间;
步骤F,将当前种群Population和选择出的种群SelectedNewGen合并,得到集合NewAllPopu,将集合NewAllPopu里的各个体按所需存储空间的大小从小到大排序,从中选出前第二预定数量个个体以构成下一代种群NewPopulation,获取当前种群的各个体所需存储空间的最小值NewSize;所述第二预定数量小于或等于当前种群规模值Spopu;
步骤G,将TotalCounter加1,并使用所述下一代种群更新当前种群;当NewSize小于LastSize时,将SizeCounter的当前值设置为0,并使用NewSize的值更新LastSize;当NewSize大于或等于LastSize时,将SizeCounter的当前值加1;
步骤H,判断NewSize是否等于所述下确界中的最小值,如果判断结果为是,则结束演化过程;如果判断结果为否,则转向步骤I;
步骤工,判断是否满足(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),如果判断结果为否,则转向所述步骤B,否则,结束演化过程,其中,第三预定值MAX_N0_IMPROVEMENT、第四预定值MAX_TOTAL为预先设置的值。
2.根据权利要求1所述的静态存储的分配方法,其特征在于,所述步骤4之后,所述方法还包括:
将每个所述函数调度顺序按照其对应的所述下确界的大小从小到大排序,选择前第一预定数量个所述函数调度顺序;
所述步骤5具体为:对选择出的每一种函数调度顺序,通过遗传算法优化所有变量的地址分配,使所有变量占用的存储空间的大小到达所述下确界的最小值。
3.根据权利要求1所述的静态存储的分配方法,其特征在于,所述进行变异处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,产生一个随机分布于区间的整数Offset,其中表示向上取整运算,Size为个体Candi所需存储空间的大小,即Size=maxl=1…N(Addrl+fs(vl)),元素<vl,Addrl>中,vl表示变量,Addrl表示所述变量的起始地址;
先以预定概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi,其中,mod表示取余运算;
其中,Size=maxl=1…N(Addrl+fs(vl))表示:如果变量名是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储空间大小的最大值;否则返回变量名所占存储空间的大小;
所述Offset生成方法为:
4.根据权利要求1所述的静态存储的分配方法,其特征在于,所述进行交叉处理的步骤包括:
从个体Candi中以等概率选出一组元素<vl,Addrl>,从当前种群Population中以等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l;
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
5.根据权利要求1所述的静态存储的分配方法,其特征在于,
所述初始种群FirstGen通过以下步骤生成:
求出共存变量集的集合VarGroupi中各元素的并集,记作AllVar;
将AllVar里的所有元素的个数记作N,得到AllVar里的所有元素的第五预定数量种排列,记作Perms,所述第五预定数量小于或者等于INIT_POPU_SIZE,所述INIT_POPU_SIZE为预先设置值;
针对Perms里的每一种排列,得到对应的各个个体,将这些个体组成集合,生成所述初始种群FirstGen;
所述个体为以下步骤获取的:
将种群的各变量按照先后顺序依次分配相邻的存储空间,即得到对应的个体。
6.根据权利要求5所述的静态存储的分配方法,其特征在于,
所述共存变量集的集合是通过以下步骤获取的:
获取所述模块按照所述函数调度顺序进行处理时,根据所述模块执行过程中同时存在的变量的情况,生成与该调度顺序对应的共存变量集;
组合所述共存变量集,生成共存变量集的集合;
所述下确界是通过以下步骤获取的:
获取每个函数调度顺序的各个所述共存变量集占用的存储空间的最大值,作为所述函数调度顺序对应的所有变量所需存储空间的下确界。
7.根据权利要求1所述的静态存储的分配方法,其特征在于,所述步骤2中模块模型按照如下方式生成:
函数包括函数名称、输入变量、输出变量以及输出变量所占存储空间的大小;函数的输出变量包括函数执行过程中用到的临时变量;
同一函数被多次调用时,使用不同的函数名称;
模块模型包括输入变量、输入变量所占存储空间的大小、输出变量、例外变量以及至少一个别名变量集,所述输出变量包含所述模块内的函数的输出变量,所述例外变量不被优化处理,每个别名变量集包含多个互为别名关系的变量;当一个变量出现N次写入,则引入N个新变量,使得任何一个变量只被写入一次;新变量与原变量互称别名,其中,N为大于1的自然数。
8.一种静态存储的分配装置,其特征在于,包括:
模块获取单元,获取待优化的模块,所述模块包括至少两个相互耦合的函数;
模型生成单元,根据所述函数之间的耦合关系,生成一模块模型;所述模块模型包括:函数名称和变量,所述变量包括输入变量和输出变量;
函数调度顺序获取单元,根据所述模块模型,获取所述模块的所有的函数调度顺序;
下确界获取单元,获取所述模块在每个所述函数调度顺序下对应的所有变量所需存储空间的下确界;
优化单元,对每一种函数调度顺序,通过遗传算法优化所有变量的地址分配信息,使所有变量占用的存储空间的大小到达所述下确界的最小值;
选择单元,选择优化后所有变量占用的存储空间最小的函数调度顺序;
编译单元,根据选择的所述函数调度顺序和所述函数调度顺序对应的地址分配信息,对所述模块进行编译,所述地址分配信息包括:各变量的起始地址;其中,所述优化单元包括:
第一设置子单元,设置当前种群Population为初始种群FirstGen,设置当前种群的上一代种群中的各个体所需存储空间的最小值LastSize的当前值为无穷大,设置演化时存储空间大小未变化的次数SizeCounter的当前值为0,设置总演化次数TotalCounter的当前值为0;
第二设置子单元,设置当前变异概率值Pmut和当前种群规模值Spopu;
变异/交叉子单元,对当前种群Population里的每一个体Candi,使其以所述概率值Pmut进行变异处理,以概率(1-Pmut)进行交叉处理,产生各新个体NewCandi;
第一选择子单元,从新一代种群NewGen中选出满足以下公式的个体,并用选择出的个体组成选择出的种群SelectedNewGen;
所述公式为:对于每一个G∈VarGroupi里的任意两个不同的变量vl、vk,
[Addrl,Addrl+fs(vl)-1]∩[Addrk,Addrk+fs(vk)-1]=Φ;
其中,[Addrx,Addrx+fs(vx)-1]表示变量vx所用存储空间的起止位置所对应的区间;
存储空间去除子单元,对选择出的种群SelectedNewGen的各个体,去除未使用的存储空间;
第二选择子单元,将当前种群Population和选择出的种群SelectedNewGen合并,得到集合NewAllPopu,将集合NewAllPopu里的各个体按所需存储空间的大小从小到大排序,从中选出前第二预定数量个个体以构成下一代种群NewPopulation,获取当前种群的各个体所需存储空间的最小值NewAize;所述第二预定数量小于或等于当前种群规模值Spopu;
更新子单元,将TotalCounter加1,并使用所述下一代种群更新当前种群;当NewSize小于LastSize时,将SizeCounter的当前值设置为0,并使用NewSize的值更新LastSize;当NewSize大于或等于LastSize时,将SizeCounter的当前值加1;
第一判断子单元,判断NewSize是否等于所述下确界中的最小值,如果判断结果为是,则结束演化过程;如果判断结果为否,则启动第二判断子单元;
第二判断子单元,判断是否满足(SizeCounter<MAX_NO_IMPROVEMENT)且(TotalCounter<MAX_TOTAL),如果判断结果为否,则转向所述步骤B,否则,结束演化过程,其中,第三预定值MAX_N0_IMPROVEMENT、第四预定值MAX_TOTAL为预先设置的值。
9.根据权利要求8所述的静态存储的分配装置,其特征在于,所述变异/交叉子单元进行变异处理具体为:
从个体Candi中以等概率选出一组元素<vl,Addrl>,产生一个随机分布于区间的整数Offset,其中表示向上取整,Size为个体Candi所需存储空间的大小,即Size=maxl=1…N(Addrl+fs(vl)),元素<vl,Addrl>中,vl表示变量,Addrl表示所述变量的起始地址;
先以预定概率将Offset的当前值生成相反数,并使用所述相反数更新Offset,然后使用<vl,(Addrl+Offset)mod(Size-fs(vl))>代替<vl,Addrl>,得到新个体NewCandi,其中,mod表示取余运算;
其中,Size=maxl=1…N(Addrl+fs(vl))表示:如果变量名是为别名变量集定义的替代名,则返回该别名变量集中各变量所占存储空间大小的最大值;否则返回变量名所占存储空间的大小;
所述Offset生成方法为:
10.根据权利要求8所述的静态存储的分配装置,其特征在于,所述变异/交叉子单元进行交叉处理具体为:
从个体Candi中以等概率选出一组元素<vl,Addrl>,从当前种群Populalion中以等概率选出异于Candi的一个体Candi2,从Candi2找到vl的起始地址Addr′l;
用<vl,Addr′l>代替<vl,Addrl>,得到新个体NewCandi。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010567232 CN102096638B (zh) | 2010-11-25 | 2010-11-25 | 静态存储的分配方法和装置 |
PCT/CN2011/082949 WO2012069010A1 (zh) | 2010-11-25 | 2011-11-25 | 静态存储的分配方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010567232 CN102096638B (zh) | 2010-11-25 | 2010-11-25 | 静态存储的分配方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102096638A CN102096638A (zh) | 2011-06-15 |
CN102096638B true CN102096638B (zh) | 2013-05-29 |
Family
ID=44129740
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010567232 Expired - Fee Related CN102096638B (zh) | 2010-11-25 | 2010-11-25 | 静态存储的分配方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN102096638B (zh) |
WO (1) | WO2012069010A1 (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102096638B (zh) * | 2010-11-25 | 2013-05-29 | 意法·爱立信半导体(北京)有限公司 | 静态存储的分配方法和装置 |
CN106775893B (zh) * | 2016-12-30 | 2020-03-17 | 北京小米移动软件有限公司 | 对程序预编译的方法及装置 |
CN110119636B (zh) * | 2019-05-21 | 2020-12-08 | 浙江齐治科技股份有限公司 | 一种数字电路、数据存储方法及装置 |
CN112965663B (zh) * | 2021-03-05 | 2024-07-02 | 上海寒武纪信息科技有限公司 | 对数据块的存储空间进行复用的方法和相关产品 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1601487A (zh) * | 2003-09-25 | 2005-03-30 | 国际商业机器公司 | 分配存储器的方法和设备 |
CN101551749A (zh) * | 2009-05-11 | 2009-10-07 | 中国科学院计算技术研究所 | 随机测试程序生成方法和系统以及设计验证方法 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0370038A (ja) * | 1989-08-08 | 1991-03-26 | Nec Corp | 高級言語プログラムの変数割付け方式 |
JPH0381829A (ja) * | 1989-08-24 | 1991-04-08 | Nec Corp | 高級言語プログラムの初期値を有したスタティック変数参照方式 |
US6829761B1 (en) * | 1999-10-21 | 2004-12-07 | Oracle International Corporation | Method and apparatus for managing shared memory in a run-time environment |
US6826681B2 (en) * | 2001-06-18 | 2004-11-30 | Mips Technologies, Inc. | Instruction specified register value saving in allocated caller stack or not yet allocated callee stack |
CN100417077C (zh) * | 2002-10-11 | 2008-09-03 | 中兴通讯股份有限公司 | 一种静态动态结合的存储区管理的方法 |
US7793058B2 (en) * | 2005-04-19 | 2010-09-07 | International Business Machines Corporation | Method and apparatus for negotiating revised service level agreements |
CN101901192B (zh) * | 2010-07-27 | 2012-01-11 | 杭州电子科技大学 | 一种片上和片外数据对象静态分配方法 |
CN102096638B (zh) * | 2010-11-25 | 2013-05-29 | 意法·爱立信半导体(北京)有限公司 | 静态存储的分配方法和装置 |
-
2010
- 2010-11-25 CN CN 201010567232 patent/CN102096638B/zh not_active Expired - Fee Related
-
2011
- 2011-11-25 WO PCT/CN2011/082949 patent/WO2012069010A1/zh active Application Filing
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1601487A (zh) * | 2003-09-25 | 2005-03-30 | 国际商业机器公司 | 分配存储器的方法和设备 |
CN101551749A (zh) * | 2009-05-11 | 2009-10-07 | 中国科学院计算技术研究所 | 随机测试程序生成方法和系统以及设计验证方法 |
Also Published As
Publication number | Publication date |
---|---|
WO2012069010A1 (zh) | 2012-05-31 |
CN102096638A (zh) | 2011-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102132249A (zh) | 批量同步图形处理单元编程 | |
Cordova et al. | DBSCAN on resilient distributed datasets | |
US9727338B2 (en) | System and method for translating program functions for correct handling of local-scope variables and computing system incorporating the same | |
CN110728578A (zh) | 区块链交易的并行执行方法、系统及存储介质 | |
CN102096638B (zh) | 静态存储的分配方法和装置 | |
CN1965296A (zh) | 依赖关系图参数范围的划分 | |
EP1208485A1 (en) | Methods and apparatus for allocating resources in the presence of uncertainty | |
EP2754033A2 (en) | Parallel processing development environment extensions | |
JPH03172936A (ja) | 手順間レジスタ割付けを伴うコンピュータプログラムのコンパイル方法及び装置 | |
CN101799760A (zh) | 生成任意目标架构的并行单指令多数据代码的系统和方法 | |
CN114416045A (zh) | 自动生成算子的方法和装置 | |
CN111708641A (zh) | 一种内存管理方法、装置、设备及计算机可读存储介质 | |
Tan et al. | Serving DNN models with multi-instance gpus: A case of the reconfigurable machine scheduling problem | |
CN114035916A (zh) | 计算图的编译、调度方法及相关产品 | |
WO2006012305A2 (en) | Bank assignment for partitioned register banks | |
Runeson et al. | Retargetable graph-coloring register allocation for irregular architectures | |
CN111857723A (zh) | 一种参数编译方法、装置和计算机可读存储介质 | |
US20160217402A1 (en) | Parallel solution generation | |
CN109766081A (zh) | 遍历容器的方法及装置 | |
US20220019531A1 (en) | Allocating Variables to Computer Memory | |
Dennis | The Fresh Breeze model of thread execution | |
RU2691860C1 (ru) | Способ распараллеливания программ в среде логического программирования в вычислительной системе | |
Rho et al. | Compilation of a functional language for the multithreaded architecture: Davrid | |
Kale | A tutorial introduction to CHARM | |
Dekeyser et al. | Supporting irregular and dynamic computations in data parallel languages |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130529 Termination date: 20181125 |