CN113742263B - 带宽分布确定、程序优化方法及装置、设备 - Google Patents
带宽分布确定、程序优化方法及装置、设备 Download PDFInfo
- Publication number
- CN113742263B CN113742263B CN202010478159.XA CN202010478159A CN113742263B CN 113742263 B CN113742263 B CN 113742263B CN 202010478159 A CN202010478159 A CN 202010478159A CN 113742263 B CN113742263 B CN 113742263B
- Authority
- CN
- China
- Prior art keywords
- function
- node
- memory access
- target
- bandwidth
- 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
- 238000000034 method Methods 0.000 title claims abstract description 70
- 230000006870 function Effects 0.000 claims abstract description 787
- 238000005457 optimization Methods 0.000 claims description 142
- 230000008569 process Effects 0.000 description 13
- 230000002829 reductive effect Effects 0.000 description 13
- 238000012545 processing Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 5
- 125000004122 cyclic group Chemical group 0.000 description 4
- 239000011159 matrix material Substances 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000012217 deletion Methods 0.000 description 3
- 230000037430 deletion Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000000670 limiting effect Effects 0.000 description 3
- 238000004590 computer program Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000002411 adverse Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000010606 normalization Methods 0.000 description 1
- 230000036961 partial effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
Abstract
本发明提供一种带宽分布确定、程序优化方法及装置、设备,带宽分布确定方法包括:针对指定程序中每一待调用的目标函数,从函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定第三内存访问量,将第三内存访问量记录至目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;在各目标函数均被调用完成时,根据函数树中各节点记录的第三内存访问量确定带宽分布信息。本发明可更准确地确定调用指定程序中各目标函数所需的带宽分布信息。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及的是一种带宽分布确定、程序优化方法及装置、设备。
背景技术
在计算机***尤其是嵌入式计算机***中,***的总线带宽通常极为有限,一些程序往往会因为***的总线带宽不足而受到限制,比如实现深度学习、图像编解码等等带宽密集算法的程序。***的总线带宽与内存的访问密不可分,如果程序在运行时大量访问内存,就会导致占用过多总线带宽,若***总线带宽不足可能会导致程序运行缓慢等问题。因此,有必要对程序进行优化,而在此之前,需要先确定调用程序中各函数所需的带宽分布信息。
在通常的方式中,会根据程序逻辑层面上的内存访问次数,来确定带宽分布信息。但是,由于计算机***中,处理器(如中央处理器CPU)速度远远高于内存,如果处理器每次执行数据读取操作,都要通过访问内存来实现,那么,处理器的速度会因内存访问而变得很慢。因此,在目前的计算机***中会引入Cache(高速缓冲存储器),Cache会对内存中的部分数据进行缓存,减少程序在运行时处理器直接对内存进行读写的次数,可大大降低程序对***带宽的占用。
换言之,Cache的出现,会使得程序在运行时实际产生的内存访问次数比逻辑层面上的内存访问次数少。不同计算机中的Cache在结构、大小和/或缓存策略等方面往往不同,这些往往会直接影响Cache Miss(未命中)率,也就是说,不同计算机中Cache对程序的内存访问次数的影响不同,因此,根据程序逻辑层面上的内存访问次数来确定带宽分布信息,结果并不准确。
例如,处理器在调用程序的某一个函数时,在逻辑层面上需对内存中某个小范围空间进行连续多次读写,即在逻辑层面上内存访问量很大,但由于Cache的存在,实际上可能产生的内存访问量可能很少。
发明内容
有鉴于此,本发明提供一种带宽分布确定、程序优化方法及装置、设备,可更准确地确定调用指定程序中各目标函数所需的带宽分布信息。
本发明第一方面提供一种带宽分布确定方法,该方法包括:
针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
根据本发明的一个实施例,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,包括:
计算所述第二内存访问量与所述第一内存访问量的差值;
依据所述差值确定所述第三内存访问量。
根据本发明的一个实施例,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息,包括:
针对所述函数树中每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;
基于已确定的调用各目标函数所需的带宽占比信息确定所述带宽分布信息。
根据本发明的一个实施例,所述函数树通过以下方式生成:
确定所述函数树的根节点,根节点与所述指定程序中指定的一个目标函数对应;
依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。
根据本发明的一个实施例,依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点包括:
将所述根节点作为当前搜索节点,检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数,如果是,则针对每一子函数执行以下步骤:
若当前搜索节点不存在父节点,在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数;
若当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。
根据本发明的一个实施例,在生成函数树之后,该方法还包括:
按照设定编号原则为所述函数树中的节点分配节点编号;所述设定编号原则是指:处于同一层的节点编号连续,且每一层上指定节点的节点编号与其父节点的节点编号连续;每一层上的指定节点是指该层上具有最小节点编号的节点。
根据本发明的一个实施例,
所述函数树由数组构成,所述数组中的各元素与所述函数树中的各节点对应,每两个节点编号连续的节点是数组中的相邻数组元素。
本发明第二方面提供一种程序优化方法,该方法包括:
依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
采用所述目标优化方式对所述待优化函数进行优化。
根据本发明的一个实施例,该方法之前,还包括:建立语法结构与优化方式的对应关系;
所述依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,包括:
从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为所述目标优化方式。
根据本发明的一个实施例,所述建立语法结构与优化方式的对应关系,包括:
从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
根据本发明的一个实施例,所述带宽分布信息包括:调用指定程序中各目标函数所需的带宽信息,所述带宽信息是指单位时间内的内存访问量;
所述依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定出待优化函数包括:
获取用于运行所述指定程序的目标平台的当前可用带宽;
针对每一目标函数,比较所述带宽分布信息中该目标函数对应的带宽信息与所述当前可用带宽,当所述带宽分布信息中该目标函数对应的带宽信息大于所述当前可用带宽,确定该目标函数为待优化函数。
本发明第三方面提供一种带宽分布确定装置,该装置包括:
内存访问量确定模块,用于针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
带宽分布信息确定模块,用于在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
根据本发明的一个实施例,所述内存访问量确定模块依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量时,具体用于:
计算所述第二内存访问量与所述第一内存访问量的差值;
依据所述差值确定所述第三内存访问量。
根据本发明的一个实施例,所述带宽分布信息确定模块根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息时,具体用于:
针对所述函数树中每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;
基于已确定的调用各目标函数所需的带宽占比信息确定所述带宽分布信息。
根据本发明的一个实施例,所述函数树通过以下模块生成:
根节点确定模块,用于确定所述函数树的根节点,根节点与所述指定程序中指定的一个目标函数对应;
子节点生成模块,用于依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。
根据本发明的一个实施例,所述子节点生成模块依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点时,具体用于:
将所述根节点作为当前搜索节点,检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数,如果是,则针对每一子函数执行以下步骤:
若当前搜索节点不存在父节点,在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数;
若当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。
根据本发明的一个实施例,该装置还包括:
编号模块,用于按照设定编号原则为所述函数树中的节点分配节点编号;所述设定编号原则是指:处于同一层的节点编号连续,且每一层上指定节点的节点编号与其父节点的节点编号连续;每一层上的指定节点是指该层上具有最小节点编号的节点。
根据本发明的一个实施例,
所述函数树由数组构成,所述数组中的各元素与所述函数树中的各节点对应,每两个节点编号连续的节点是数组中的相邻数组元素。
本发明第四方面提供一种程序优化装置,该装置包括:
待优化函数确定模块,用于依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
优化方式确定模块,用于依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
函数优化模块,用于采用所述目标优化方式对所述待优化函数进行优化。
根据本发明的一个实施例,该装置还包括:对应关系建立模块,用于建立语法结构与优化方式的对应关系;
所述优化方式确定模块依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式时,具体用于:
从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为所述目标优化方式。
根据本发明的一个实施例,所述对应关系建立模块建立语法结构与优化方式的对应关系时,具体用于:
从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
根据本发明的一个实施例,所述带宽分布信息包括:调用指定程序中各目标函数所需的带宽信息,所述带宽信息是指单位时间内的内存访问量;
所述待优化函数确定模块依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定出待优化函数时,具体用于:
获取用于运行所述指定程序的目标平台的当前可用带宽;
针对每一目标函数,比较所述带宽分布信息中该目标函数对应的带宽信息与所述当前可用带宽,当所述带宽分布信息中该目标函数对应的带宽信息大于所述当前可用带宽,确定该目标函数为待优化函数。
本发明第五方面提供一种电子设备,包括处理器及存储器;所述存储器存储有可被处理器调用的程序;其中,所述处理器执行所述程序时,实现如前述实施例所述的带宽分布确定方法或程序优化方法。
本发明第六方面提供一种机器可读存储介质,其上存储有程序,该程序被处理器执行时,实现如前述实施例所述的带宽分布确定方法或程序优化方法。
本发明实施例具有以下有益效果:
本发明实施例中,可以确定出指定程序中每一目标函数对应的第一内存访问量和第二内存访问量,第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,因而根据目标函数对应的第一内存访问量和第二内存访问量可以确定目标函数对应的第三内存访问量,即调用该目标函数所需的内存访问量,将各目标函数对应的第三内存访问量都记录在函数树中,根据该函数树中各节点记录的第三内存访问量即可确定调用指定程序中各目标函数所需的带宽分布信息,由于确定出的第三内存访问量是根据目标函数调用前后的内存已访问量来确定的,这些内存已访问量是真实产生的,所以相比于逻辑层面的信息来说,第三内存访问量来源于真实的内存访问量,所以根据这些第三内存访问量确定出的带宽分布信息,相比于根据程序逻辑层面上的内存访问次数来确定带宽分布信息来说,结果更为准确。
附图说明
图1是本发明一实施例的带宽分布确定方法的流程示意图;
图2是本发明一实施例的函数树的示意图;
图3是本发明一实施例的程序优化方法的流程示意图;
图4是本发明一实施例的带宽分布确定装置的结构框图;
图5是本发明一实施例的程序优化装置的结构框图;
图6是本发明一实施例的电子设备的结构框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
在本发明使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本发明可能采用术语第一、第二、第三等来描述各种器件,但这些信息不应限于这些术语。这些术语仅用来将同一类型的器件彼此区分开。例如,在不脱离本发明范围的情况下,第一器件也可以被称为第二器件,类似地,第二器件也可以被称为第一器件。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
为了使得本发明的描述更清楚简洁,下面对本发明中的一些技术术语进行解释:
总线带宽:计算机总线***中,单位时间允许产生的数据传输总量。
带宽热点:程序运行过程中,占用带宽较多的部分,也就是内存访问较多的部分。
Cache:高速缓冲存储器,位于CPU和主存储器之间,用于缓存主存储器中读写的数据,由于现代CPU的速度远高于存储器,因此Cache可以显著减少CPU的等待时间,提高计算机的运行效率。
Cache Miss:Cache未命中率,处理器在运行程序时,会对CPU经常访问以及预计访问的内存缓存至Cache,以提高CPU的运行速度,当CPU需要读取的数据没有缓存在Cache时,需要从内存中读取数据,这种情况称为Cache Miss。
函数:在计算机术语中,函数指的是程序中一段具有特定功能的独立代码段。
子函数:函数中调用的函数。
抽象语法树:在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
本发明实施例中,可以确定程序在运行时的带宽分布情况,也就是调用程序中各目标函数所需的带宽分布信息。进而,可以根据调用程序中各目标函数所需的带宽分布信息,来优化该程序。
下面将需要分析带宽分布信息的程序称为指定程序,可以将指定程序中的所有函数都作为目标函数,或者可以从其中确定出多个函数作为目标函数,具体不做限定。目标函数是指定程序中需要确定被调用所需的带宽信息的函数。
下面对本发明实施例的带宽分布确定方法进行更具体的描述,但不应以此为限。
在一个实施例中,参看图1,带宽分布确定方法可以包括以下步骤:
S100:针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
S200:在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
本发明实施例中,带宽分布确定方法的执行主体可以为电子设备,该电子设备可以为计算机设备,当然,电子设备的具体类型不限,只要具备正常运行程序所需的能力即可。
上述的方法可以由电子设备通过运行指定程序来实现,在此之前,可以在指定程序中添加用于确定带宽分布信息的分析代码,比如,通过以下方式添加:
确定指定程序中各函数的位置信息;依据各函数的位置信息与所述函数树找出指定程序中的目标函数,并为每一目标函数添加对应的第一分析代码,并在初始程序的指定位置添加第二分析代码;其中,所述第一分析代码用于在被电子设备运行时实现上述步骤S100,所述第二分析代码用于在被电子设备运行时实现上述步骤S200。
可选的,在确定指定程序中各函数的位置信息时,可以根据函数特征来识别函数,识别出函数时可以确定函数在初始程序中的位置信息。函数特征比如可以包括:函数中表示返回值的字符比如“return”、以及函数的参数列表特征等。指定程序可以由1个或多个源代码文件组成,这种情况下,函数的位置信息可以包括函数所在的源代码文件的文件标识、及函数在该源代码文件中的偏移量(相对于源代码文件的首行或者指定行的偏移量),当然,此处只是举例,并不作为限制。
可选的,为了尽可能准确地确定出各函数的位置信息,可以在确定指定程序中各函数的位置信息之前,对指定程序进行过滤处理,以去除指定程序中的干扰信息。
干扰信息可以包括不符合语法规则、或可能影响函数识别的信息(比如具有函数特征等容易被误认为是函数的信息),举例来说,可包括注释、预处理代码段等,其中预处理代码段比如有宏定义等,在去除预处理代码段时,可以进行预编译展开,以避免影响程序运行。
可选的,在指定程序可以由1个或多个源代码文件组成的情况下,为每一目标函数添加对应的第一分析代码时,可以从每个源代码文件的最后一个函数开始往第一个函数的方向进行查找,并在函数树中存在查找到的函数对应的节点时,确定该函数为目标函数,并为该目标函数添加对应的第一分析代码。
其中,第一分析代码可以分为第一代码段和第二代码段。第一代码段可以位于对应目标函数之前、且该目标函数的上一个函数之后,用于获取第一内存访问量;第二代码段可以位于对应目标函数之后、且该目标函数的下一个函数之前,用于获取第二内存访问量,依据第二内存访问量与所述第一内存访问量确定第三内存访问量,并将第三内存访问量记录至所述目标节点。
第二分析代码可以添加在指定程序的结尾处,或者是所有目标函数被调用完成时的代码所在位置之处,用于在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
可选的,在添加第一分析代码时,还可以为该第一分析代码添加对应的分析代码标识,以便于后续删除对应的第一分析代码。在添加第二分析代码时,还可以为第二分析代码添加对应的分析代码标识,以便于后续删除该第二分析代码。相应的,在收到代码删除指示时,可以依据所述分析代码标识将指定程序中与分析代码标识对应的代码删除。
基于上述方式确定出指定程序之后,可以通过电子设备运行该指定程序,执行步骤S100-S200,以确定出调用指定程序中各目标函数所需的带宽分布信息。
步骤S100中,针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点。
函数树可以在执行步骤S100之前生成,函数树中每一节点具有对应的目标函数,用于记录对应目标函数的相关信息。可选的,函数树中各节点之间的关系可以表征指定程序中各目标函数的调用关系,比如,在函数树中,一个节点A1是另一个节点A2的子节点,则节点A1对应的目标函数是节点A2对应的目标函数的子函数。
可选的,在已生成的函数树中确定对应该目标函数的目标节点时,可以获取目标函数对应的目标节点的节点标识比如节点编号,根据节点编号从函数树中找出节点编号对应的目标节点。其中,节点编号可以记录在目标函数对应的第一分析代码中,从而在第一分析代码被运行时,获取已记录的对应节点编号。
当然,这里确定目标函数对应的目标节点的方式只是举例,实际还有其他方式,比如,在函数树中各节点之间的关系可以表征指定程序中各目标函数的调用关系的情况下,可以根据目标函数的调用顺序从函数树中找出对应的目标节点,具体不作限定。
在一些设备中,会在处理器中设置内存读写寄存器,可以对该内存读写寄存器设置一个封装接口,以便于该内存读写寄存器可被多个平台使用。该封装接口可以用于提供内存访问次数。
第一内存访问量和第二内存访问量均可以依据本设备的内存读写寄存器中记录的内存访问次数来确定。具体来说,在开始调用该目标函数时,可以从内存读写寄存器中获取第一内存访问次数,将第一内存访问次数与设定的位宽相乘,得到第一内存访问量。在目标函数被调用完成时,可以从内存读写寄存器中获取第二内存访问次数,将第二内存访问次数与设定的位宽相乘,得到第二内存访问量。
当然,第一内存访问量和第二内存访问量也可以通过其他方式来确定,具体方式不限,其他可获取到内存访问量的方式均适用。
第一内存访问量为在开始调用该目标函数时内存的已访问量,即,在该目标函数的上一个函数被调用完成后、且该目标函数被调用之前,内存的已访问量。第二内存访问量为在该目标函数被调用完成时内存的已访问量,即,在该目标函数被调用完成后、该目标函数的下一个函数被调用之前,内存的已访问量。
由于一个是目标函数正要被调用时的内存访问量、另一个是目标函数被调用完成时的内存访问量,所以,根据第一内存访问量和第二内存访问量,就可以确定出调用目标函数所需的内存访问量,也即第三内存访问量。
本发明实施例中,内存访问包含从内存读数据、以及在内存中写入数据。内存访问量指的是,对内存进行读和写所产生的数据量,调用目标函数所需的内存访问量即调用目标函数的整个过程中对内存进行读和写所产生的数据量。
在确定出第三内存访问量之后,将第三内存访问量记录至函数树中与该目标函数对应的目标节点中。
步骤S200中,在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
在所述指定程序的各目标函数均被调用完成时,通过上述步骤S100中的方式,会确定出指定程序的各目标函数对应的第三内存访问量,并在函数树的各节点中记录各目标函数所对应的第三内存访问量。
因而,可以根据函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
带宽分布信息比如可以包括:调用指定程序中各目标函数所需的带宽信息,这里的带宽信息是指单位时间内的内存访问量。和/或,带宽分布信息可以包括:调用各目标函数所需的带宽信息在调用指定程序所需的带宽信息中的带宽占比信息。当然,这里只是举例了两种信息,具体并不局限于此,只要能够确定调用指定程序中各目标函数所需的带宽分布情况即可。
在确定出带宽分布信息之后,便可确定出程序中带宽热点,进而可以确定出程序中待优化函数,对待优化函数进行优化,来实现程序的优化,以减少程序在运行时对内存的访问量。
比如,带宽分布信息包括各目标函数对应的带宽信息的情况下,可以从中找出N个最大带宽信息对应的目标函数作为待优化函数,N大于等于1;和/或,带宽分布信息包括各目标函数对应的带宽占比信息的情况下,可以从中找出N个最大带宽占比信息对应的目标函数作为待优化函数。当然,具体确定待优化函数的方式不作为限定。
在对指定程序进行优化之后,可以重新执行上述步骤S100-S200确定指定程序的带宽分布信息,以验证优化结果。可选的,当优化结果满足要求,可以依据删除指定程序中带分析代码标识的分析代码,即第一分析代码和第二分析代码,以得到优化后的程序。当然,如果优化结果不满足要求,则可以继续优化,并针对优化后的程序继续执行上述步骤S100-S200,直至优化结果满足要求。
在多次执行上述步骤S100-S200的情况下,函数树中可以记录对应的目标函数每次被调用所需的第三内存访问量;进一步的,在每次记录第三内存访问量时,还可以累加目标函数的被调用次数。
在确定出上述的带宽分布信息之外,第二分析代码在运行时还可以确定出其他运行信息,比如,指定运行程序的所有运行过程中,各目标函数的被调用次数,最大的第三内存访问量,第三内存访问量的平均值,指定程序中主函数耗时最大的一次运行过程所需的内存访问量、以及该运行过程中被调用的各目标函数所需的带宽信息分布情况、各目标函数的被调用次数、最大第三内存访问量、第三内存访问量的平均值等。
可选的,带宽分布信息、以及上述的这些运行信息,可以通过报表的形式输出。具体来说,为了使得带宽分布信息得到更直观的呈现,可以仍然以树结构的形式在报表中列出所有目标函数的名称,并对应地列出各目标函数所组成的带宽分布信息,当然,具体不做限定。
本发明实施例中,可以确定出指定程序中每一目标函数对应的第一内存访问量和第二内存访问量,第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,因而根据目标函数对应的第一内存访问量和第二内存访问量可以确定目标函数对应的第三内存访问量,即调用该目标函数所需的内存访问量,将各目标函数对应的第三内存访问量都记录在函数树中,根据该函数树中各节点记录的第三内存访问量即可确定调用指定程序中各目标函数所需的带宽分布信息,由于确定出的第三内存访问量是根据目标函数调用前后的内存已访问量来确定的,这些内存已访问量是真实产生的,所以相比于逻辑层面的信息来说,第三内存访问量来源于真实的内存访问量,所以根据这些第三内存访问量确定出的带宽分布信息,相比于根据程序逻辑层面上的内存访问次数来确定带宽分布信息来说,结果更为准确。
在一个实施例中,步骤S100中,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,可以包括以下步骤:
S101:计算所述第二内存访问量与所述第一内存访问量的差值;
S102:依据所述差值确定所述第三内存访问量。
第二内存访问量与所述第一内存访问量的差值,就是调用目标函数前后内存已访问量的变化情况,依据该差值可以确定出调用该目标函数所需的内存访问量,即第三内存访问量。
具体来说,可以将第二内存访问量与所述第一内存访问量的差值直接确定为第三内存访问量;或者,可以对该差值进行设定运算,将运算结果确定为第三内存访问量,这里的设定运算比如,计算该差值与设定数值之比(也就是进行归一化处理),当然具体不做限定。
在一个实施例中,步骤S200中,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息,可以包括:
S201:针对所述函数树中除根节点之外的每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;
S202:基于已确定的调用各目标函数所需的带宽占比信息确定所述带宽分布信息。
以根节点对应的目标函数为指定程序的主函数为例,调用该主函数所需的第三内存访问量,事实上就是调用整个指定程序总共所需的内存访问量,所以可以以这个第三内存访问量为参照,计算出各目标函数所需的内存访问量在总共所需的内存访问量中的占比情况。
在根节点对应的目标函数为指定程序中主函数之外的其他函数的情况下,也是同理,可以以根节点记录的第三内存访问量作为参照,计算出各目标函数所需的内存访问量在根节点对应的目标函数所需的内存访问量中的占比情况。
所以,本实施例中,计算每一节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息。该带宽占比信息指示了调用该节点对应的目标函数所需的带宽信息在调用根节点对应的目标函数所需的带宽信息中的占比,在根节点对应的目标函数为指定程序的主函数的情况下,所述带宽占比信息指示了调用目标函数所需的带宽信息在调用指定程序所需的带宽信息中的占比,所述带宽信息是指单位时间内的内存访问量。
可选的,比如可以直接将该比值确定为调用该节点对应的目标函数所需的带宽占比信息;或者也可以为该比值进行一定的运算后作为该带宽占比信息,比如乘以一个指定值例如100,如此,根节点对应的目标函数的带宽占比信息就是100,其他带宽占比信息都是小于100,且根节点对应的目标函数所调用的目标函数的带宽信息占比之和小于或等于100,当然,具体方式不做限定。
在确定出调用各目标函数所需的带宽占比信息之后,可以基于各带宽占比信息确定所述带宽分布信息,比如,可以将各目标函数所需的带宽占比信息作为带宽分布信息。带宽占比信息最大的目标函数,就是指定程序中的带宽热点。
在此情况下,在将带宽分布信息以报表形式输出时,可以以树的形式显示各目标函数的名称,然后,在目标函数名称对应的位置显示该目标函数对应的带宽占比信息,以使得带宽分布信息更清晰明了。当然,如果报表中还需要其他的信息,比如调用次数等,同样可以将这些信息显示在目标函数名称对应的位置处。
在本发明的上述实施例内容中,引入了函数树,这函数树不仅可以在节点中记录对应目标函数的相关信息比如第三内存访问量,还可以帮助实现带宽分布信息的确定与呈现,当然还可以有其他的用途。
函数树可以是在步骤S100之前就已经生成的,在一个实施例中,所述函数树可以通过以下方式生成:
S300:确定所述函数树的根节点,根节点与所述指定程序中指定的一个目标函数对应;
S400:依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。
可以理解,步骤S300和S400可以在步骤S100之前执行。
本实施例中,可以在指定程序中指定一个目标函数,将函数树的根节点设置为与该指定的目标函数对应。比如,可以在指定程序中指定的主函数,将主函数作为函数树的根节点对应的目标函数。当然,具体指定哪个函数作为根节点对应的目标函数具体不作限定,可以根据优化需求而定。
之后,可以依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。比如,在目标函数具有三个子函数时,在函数树中生成根节点的三个子节点。
在一个实施例中,步骤S400中,依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点包括:
S401:将所述根节点作为当前搜索节点,检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数,如果是,则针对每一子函数执行以下步骤:
S402:若当前搜索节点不存在父节点,在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数;
S403:若当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。
本实施例中,从根节点对应的目标函数开始搜索,将根节点作为当前搜索节点,在指定程序中存在当前搜索节点对应的目标函数的子函数时,有多少个子函数就有多少条搜索路径,针对每一子函数,如果当前搜索节点不存在父节点,即当前搜索节点为根节点时,可以在函数树中生成当前搜索节点的子节点,该子节点与该子函数对应;如果当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应。
其中,该子函数与指定路径上任一节点对应的目标函数均不同,也就是说,该子函数与当前搜索节点及其祖先节点(包含父节点)对应的目标函数均不同。如果该子函数与当前搜索节点及其祖先节点对应的任一个目标函数相同,说明在同一搜索路径上出现了两个相同的函数,意味着产生了递归调用或者循环调用,此时,不在函数树中生成该子函数对应的节点,如果还有其他子函数,则继续针对其他子函数进行执行,否则结束搜索,得到所需的函数树。
本实施例中,在在所述函数树中生成当前搜索节点的子节点之后,还会判断所述函数树的当前访问节点层数是否达到预设层数,在未达到时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。如此,得到的函数树的节点层数为预设层数。预设层数可以根据优化需要确定,具体数值不做限定。
举例来说,参看图2,通过上述方式可生成的函数树中各节点与函数之间的对应关系如下:F11为指定程序中指定的目标函数(比如为指定程序的主函数),对应于函数树的根节点;F11有三个子函数,分别为F12、F13、F14,分别对应于根节点的三个子节点;F12有两个子函数,分别为F13、F15,分别对应于F12对应的节点的两个子节点,其中,F15有两个子函数,分别为F13和F16,分别对应于F15对应的节点的两个子节点;F14有两个子函数,分别为F17和F13,分别对应于F14对应的节点的两个子节点。当然,图2示出的函数树只是为了便于理解而举得例子,实际程序中目标函数的调用关系可能是更复杂的。
上述方式中,通过对指定程序进行静态分析,根据指定程序中函数间的调用关系搜索指定程序中的函数,并建立搜索出的函数对应的节点,其中,如果搜索路径中出现了回环结构(在函数的递归调用或循环调用时,会出现回环的调用关系),打断该回环结构并结束该回环结构所在路径的搜索,最终可生成不包含回环结构的函数树,避免了递归调用和循环调用对带宽分布确定过程带来不利影响。
在一个实施例中,在生成函数树之后,该方法还包括以下步骤:
S500:按照设定编号原则为所述函数树中的节点分配节点编号;所述设定编号原则是指:处于同一层的节点编号连续,且每一层上指定节点的节点编号与其父节点的节点编号连续;每一层上的指定节点是指该层上具有最小节点编号的节点。
上述的设定编号原则中,先从树的较浅层开始编号,将同层的所有节点都编完号之后才进入下一层。如此,函数树中,根节点的节点编号是最小的,处于每一层的节点编号是连续的,且每一层中的最小节点编号与该节点的父节点的编号是连续的。
举例来说,继续参看图2,F11为指定的目标函数(比如为程序的主函数),对应于函数树的根节点,根节点的节点编号为1;F11有三个子函数,分别为F12、F13、F14,分别对应于根节点的三个子节点,三个子节点的节点编号分别为2、3、4;F12有两个子函数,分别为F13、F15,对应于F12对应的节点的两个子节点,两个子节点的节点编号分别为5、6;F14有两个子函数,分别为F17和F13,分别对应于F14对应的节点的两个子节点,两个子节点的节点编号分别为7、8;F15有两个子函数,分别为F13和F16,对应于F15对应的节点的两个子节点,两个子节点的节点编号为9、10。
通过上述编号方式,节点的所有子节点的节点编号是连续的,即子节点是顺序排列的,这样在一个子节点记录完成时,可以通过该子节点的节点编号与编号间隔值(比如1)相加来确定下一个子节点的节点编号,无需重新搜索整棵树来确定,避免在带宽分布确定过程中,因搜索函数树产生的较多内存访问量带来较大的影响。
比如,图2中,在节点编号为5的节点对应的目标函数F13被调用完成后,在需调用目标函数F15时,可以将节点编号5与1累加得到节点编号6,根据节点编号6找到对应的节点,从而可将目标函数F15的第三内存访问量记录到节点编号为6的节点中。
在一个实施例中,所述函数树由数组构成,所述数组中的各元素与所述函数树中的各节点对应,每两个节点编号连续的节点是数组中的相邻数组元素。
如此,节点编号为1的根节点对应于数组中的第1个数组元素,节点编号为2的节点对应于数组中的第2个数组元素,节点编号为3的节点对应于数组中的第3个数组元素,以此类推。
本实施例中,通过数组来实现函数树,再结合上述的编号方式,可以在节点的一个子节点记录完成时,通过数组下标加1,找到下一个数组元素,就是下一个子节点,搜索树产生的花销很小。
可选的,还可以在函数树中的各个末梢节点下分别增加一个子节点,该子节点对应的节点编号可以设置为用于表示禁止确定带宽信息的设定编号比如0,后续在带宽分布确定过程中,若针对某个函数查找到了节点编号为0的节点,则可以直接跳过对该函数的带宽信息的统计,即不会获取该函数对应的第一内存访问量和第二内存访问量,也不会去统计第三内存访问量或对其记录,可以避免递归调用造成的带宽信息重复统计的问题。
可选的,在指定程序不需要进行带宽分布确定时,可以将函数树中的节点编号都修改为0,这样的话,可以避免函数外调用时进行带宽信息统计的问题。
以上便是本发明实施例中关于带宽分布确定方法的内容,可以确定出调用指定程序中各目标函数所需的带宽分布信息。
如背景技术中所述的,目前在计算机***中,虽然已经在硬件上做了改进,引入Cache(高速缓冲存储器),通过Cache对内存中的部分数据进行缓存,减少程序在运行时处理器直接对内存进行读写的次数,可大大降低程序被调用时所需的带宽信息。
但是,上述硬件上增加Cache的方式,对于程序运行过程因大量访问内存、导致所需的带宽信息过多这种情况来说,改善是有限的,有些时候,仍然需要通过优化程序本身来减少所需占用的带宽信息。
为此,本发明还提供一种程序优化方法,可以基于前述实施例中确定出的调用指定程序中各目标函数所需的带宽分布信息来实现优化,当然,这并不作为限制,也可以基于通过方式确定出的带宽分布信息来实现优化、或者基于其他信息来实现优化。
虽然目前也有对程序进行优化的方式,比如,在编译器中内置优化功能,通过编译器在对代码进行编译的期间实现对程序的优化,以提升代码的运行效率(即使用最少的指令周期完成相同的功能)或减小代码体积(即使用最短的代码长度完成相同的功能)。但是,这种优化是针对CPU性能的,对于程序在内存访问这方面并未起到优化的作用。
而且,从理论上讲,由于编译器在编译期间无法获知程序运行期间的数据,包括:cache大小、CPU频率、DDR通道等影响内存带宽使用的数据,因此,在不改变现有编译器工作模式的前提下,使用编译器对程序在内存访问这方面进行优化是非常困难的。
为了解决调用程序所需的带宽信息过多的问题,目前只能通过人工手动的方式来对程序进行优化,而且程序对于不同平台而言所需优化的情况是不同的,对于***的总线带宽极为有限的平台而言,所需优化的方面会更多,而手动优化的方式速度慢、效率低,不能很好地解决上述问题。
本发明实施例中,可以根据调用指定程序中各目标函数所需的带宽分布信息,从指定程序中确定出待优化函数,可以根据待优化函数的语法结构自动地确定出用于优化所述待优化函数的目标优化方式,并采用目标优化方式对待优化函数进行优化,以实现对调用所述待优化函数时的内存访问情况的优化,减少调用待优化函数所需的带宽信息,从而在整体上优化指定程序所需的带宽信息,进而可以减少对***带宽的占用,整个过程不需要人为参与,自动化程度高,程序的优化效率高。
本发明实施例可以应用于需要对程序进行优化的场合,特别是部署在总线带宽极为有限嵌入式***上的图像处理、机器学习、视频编解码等带宽占用较高的程序,可以帮助算法开发人员迅速定位程序中的带宽热点,并对作为带宽热点部分进行优化,有效地降低程序在运行时对***带宽的占用,提高程序的运行效率。
下面对本发明实施例的程序优化方法进行更具体的描述,但不应以此为限。
在一个实施例中,参看图3,程序优化方法可以包括以下步骤:
T100:依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
T200:依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
T300:采用所述目标优化方式对所述待优化函数进行优化。
本发明实施例中,程序优化方法的执行主体可以为电子设备,该电子设备可以为计算机设备,当然,电子设备的具体类型不限,只要具备一定的处理能力即可。
上述步骤T100-T300可以在指定程序被编译之前执行,换言之,本发明优化的指定程序是未经编译的程序、或者可以称为源代码文件,可以包括C、C++在内的高级语言编写的程序,当然也可以是其他语言编写的程序,在此不再列举。
整个程序优化过程与编译器无关,不会受到编译器的功能限制,可以适用于任何处理平台,不依赖特定的硬件平台或编译器,泛用性强,尤其在总线带宽极为有限的嵌入式***开发领域具有非常高的应用价值,而且不需要使用者具有带宽优化知识,程序优化完全自动化,使用简单。
步骤T100中,依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数。
带宽分布信息比如可以包括指定程序中每一目标函数被调用所需的带宽信息、和/或带宽占比信息等。当然,带宽分布信息还可以包括其他信息,具体不作限制。
其中,带宽信息是指单位时间内的内存访问量,即,调用目标函数所需的内存访问量与该目标函数的调用时长之比。比如,在前述实施例中确定出各目标函数对应的第三内存访问量的基础上,可以根据目标函数对应的第三内存访问量与该目标函数的调用时长来确定该目标函数所需的带宽信息,具体是第三内存访问量与调用时长的比值作为带宽信息。
带宽占比信息可以是调用目标函数所需的带宽信息与调用指定程序中指定的目标函数(比如主函数)所需的带宽信息之比。比如,在前述实施例中,在函数树中记录了各目标函数对应的第三内存访问量的基础上,可以根据各节点记录的第三内存访问量与根节点记录的第三内存访问量来确定各目标函数所需的带宽占比信息,具体可以是节点记录的第三内存访问量与根节点记录的第三内存访问量的比值作为该节点对应的目标函数所需的带宽信息。
以带宽分布信息包括各目标函数所需的带宽占比信息为例,依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数时,可以找出带宽占比信息大于设定占比的目标函数作为待优化函数。当然,这里只是举例,并不应以此作为限制,还可以有其他方式。
步骤T200中,依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化。
优化方式可以包括:将函数中用于读写内存中一大段数据的代码(比如但不限于用于实现循环的代码),优化为将该一大段数据分成多个较小的数据块、以数据块为单位进行读写。
举例来说,在某个循环函数中,以像素为单位对图像矩阵数据进行处理时,但是由于一帧图像矩阵数据较大,放不进Cache中,所以,每次都需要从内存中去读取一帧图像矩阵数据的量,数据量非常大。经过优化后,一行数据可以作为一个数据块,每次只需读取一个数据块即可,而且这个数据块可以放入Cache中,在后续需要该数据块时可以从Cache中获取,不需要再访问内存,可以大大减少调用该函数所需的带宽信息。
不同的优化方式中,切分的数据块尺寸可以不同,比如,在一种优化方式中,切分的每个数据块的尺寸为24x24;在另一个优化方式中,切分的每个数据块的尺寸为32x32。
优化方式还可以包括:内层循环与外层循环互换,即,原内层循环变成外层循环、而原外层循环变成内层循环。
继续以图像矩阵数据为例,原来的循环代码是先读取一列数据、再按行从读取的列数据获取数据进行处理,这样的话,每次循环都要遍历整个图像矩形数据的所有行数据(即所有数据块),未能很好地利用Cache;优化后,可以先读取一行数据、再按列从读取的行数据获取数据进行处理,这样的话,可以在外层循环中每次读取作为一行数据的一个数据块,放在Cache中,在内存循环时只需从Cache中获取数据即可。
当然,上述只是优化方式举例,当然还可以有其他的优化方式,在此不再列举,具体不作限定。
本实施例中,可以根据待优化函数的语法结构,自动地匹配出用于优化所述待优化函数的目标优化方式,该目标优化方式是适用于采用该语法结构的函数的优化,可以对调用所述待优化函数时的内存访问情况进行优化。
步骤T300中,采用所述目标优化方式对所述待优化函数进行优化。
目标优化方式可以用于对调用所述待优化函数时的内存访问情况进行优化,比如可以减少对内存的访问次数、减少读写内存的数据量等。因而,可以采用目标优化方式对所述待优化函数进行优化,以减少待优化函数被调用所需的带宽信息。
在指定程序中存在多个待优化函数时,可以针对每个待优化函数执行步骤T200-T300,以对每个待优化函数实现优化,从而完成整个指定程序的优化。
在一个实施例中,在该方法步骤T100之前,还包括步骤T110:建立语法结构与优化方式的对应关系。
在这语法结构与优化方式的对应关系中,可以包含多个优化方式,每个优化方式可以对应于一个或多个语法结构。当然,对应关系中的语法结构当然是符合代码要求的语法结构。
一般来说,同样的功能可以由语法结构不同的函数来实现。因而,优选来说,上述对应关系中,每一优选方式可以与多种语法结构对应,其中,每一优化方式对应的多种语法结构来自多个实现同一功能的函数,而该优化方式可以是从用于优化这多个函数的优化方式中确定出的最佳优化方式。如此,采用这些语法结构的函数可以用相同的该最佳优化方式来优化,最大程序地优化内存访问情况。
具体的优化方式可以参看前述实施例中的描述,在此不再赘述。
可选的,如果指定程序后续需在目标平台上运行,则在确定上述的语法结构与优化方式的对应关系时,采用不同优化方式优化后的多个函数可以在目标平台上运行,以从这多个函数的不同优化方式中确定出的最佳优化方式。
在确定出语法结构与优化方式的对应关系之后,可以将该对应关系设置在目标平台中,作为目标平台对应的优化配置文件。
相应的,在步骤T200中,所述依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,可以包括以下步骤:
T201:从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为所述目标优化方式。
在确定出待优化的待优化函数之后,可以从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,将找出的优化方式确定为目标优化方式。
在进行查找时,可以将语法结构与优化方式的对应关系中的语法结构与待优化函数进行语法匹配,当匹配时,匹配出的语法结构对应的优化方式即为目标优化方式。
在一个实施例中,步骤T110中,所述建立语法结构与优化方式的对应关系,可以包括以下步骤:
T111:从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
T112:针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
可以获取多组样本函数组,每一样本函数组中包含一个可优化的样本函数(当然也可以是多个,具体数量不限),即未优化的第一样本函数,还可以包含多个第二样本函数,这些第二样本函数是采用不同优化方式对该第一样本函数进行优化得到的。可以理解,每个样本函数可以是可被执行的函数。
由于第二样本函数是对第一样本函数优化得到的,并且未进行功能的改写,所以,第二样本函数相对于第一样本函数来说,实现的功能是相同的,但是语法结构不同。
第一样本函数的确定方式,可以与待优化函数的确定方式相同,即可以从一些程序中找出可进行优化的函数作为第一样本函数。对第一样本函数的优化可以通过手动实现,或者其他方式实现,具体不限。
获取的每一样本函数组中,除了第一样本函数,每个第二样本函数都有对应的优化方式,这些优化方式可以被称为等效变换,即函数被优化之后功能不会发生改变。但是,不是每个第二样本函数对应的优化方式都是最佳的,因而,需要从中确定出最佳的优化方式。
首先,需要从已获取的各样本函数组中确定出目标样本函数。
可以针对每一样本函数组,将这组样本函数中的第二样本函数依次在目标平台上运行,并记录每个第二样本函数的运行耗时与被调用所需的内存访问量。在记录了每个第二样本函数的耗时与产生的内存访问量的基础上,可以根据内存访问量与耗时计算出每个第二样本函数的带宽信息,即单位时间内内存访问量,可以选择带宽信息最小的第二样本函数作为目标样本函数。
接着,可以基于每组被确定出的目标样本函数,建立所述对应关系。
在确定每一样本函数组中的目标样本函数之后,可以针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。具体来说,将每一样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式对应保存。
如此,该对应关系中,包含多个优化方式,每个优化方式对应了多个语法结构,且优化方式是采用对应的多个语法结构的函数的最佳优化方式。
可选的,在建立上述对应关系时,还可以将语法结构用其他形式表示,比如可以以抽象语法树的形式来表示一个函数的语法结构,这样,每个语法结构都有对应的一棵抽象语法树。每个样本函数的语法结构被抽象为一棵抽象语法树,将每组样本函数的抽象语法树与该组中的目标样本函数对应的优化方式建立对应关系。
相应的,在依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式时,可以从对应关系中找出与待优化函数的语法结构匹配的目标抽象语法树,将对应关系中与该目标抽象语法树对应的优化方式确定为目标优化方式。
可选的,在建立上述的抽象语法树之后,还可以将抽象语法树向量化,得到语法特征向量,则上述对应关系是语法特征向量与优化方式的对应关系。采用语法特征向量表示语法结构,可便于进行语法结构的匹配。
在一个实施例中,所述带宽分布信息包括:调用指定程序中各目标函数所需的带宽信息,所述带宽信息是指单位时间内的内存访问量。
如前所述,带宽信息也可以认为是调用目标函数所需的内存访问量与该目标函数的调用时长之比。
步骤T100中,所述依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定出待优化函数,可以包括以下步骤:
T101:获取用于运行所述指定程序的目标平台的当前可用带宽;
T102:针对每一目标函数,比较所述带宽分布信息中该目标函数对应的带宽信息与所述当前可用带宽,当所述带宽分布信息中该目标函数对应的带宽信息大于所述当前可用带宽,确定该目标函数为待优化函数。
在目标平台的当前可用带宽较大的情况下,可以允许指定程序占用较多的带宽,而在目标平台的当前可用带宽较为有限的情况下,只能允许指定程序占用有限的带宽。目标平台是用于运行所述指定程序的平台。
因而,需要根据调用指定程序中各目标函数所需的带宽分布信息、以及目标平台的当前可用带宽,从所述指定程序中确定出待优化函数。
确定当前可用带宽可以根据目标平台的总带宽确定,比如,可以计算内存总带宽与预设阈值的乘积,得到可用总带宽。这里的预设阈值,可以根据目标平台可为指定程序预留的带宽比例而定,具体不做限定。
当然,目标平台的总带宽不同,能够允许指定程序占用的带宽量不同。那么,实际中可能存在一些函数,对于总带宽较大的平台来说无需优化,而对于总带宽较小的平台来说就需要优化了,本发明实施例尤其适用于总带宽较小的平台。
目标平台的总带宽可以通过分析目标平台的性能瓶颈获得,可以用一组性能分析用例测试目标平台的最大带宽,比如,先用所需带宽信息较小的性能分析用例在目标平台上运行,如果能够正常运行,则继续用所需带宽信息更大的性能分析用例在目标平台上运行,如果仍然能够正常运行,则继续用所需带宽信息更大的性能分析用例在目标平台上运行,以此类推,直至某个性能分析用例无法正常在目标平台上运行时,则上一个性能分析用例运行所需的带宽信息即为目标平台的总带宽。当然,上述方式只是举例,实际并不限于此,其他可确定目标平台的总带宽的方式同样适用。
在确定目标平台的当前可用带宽之后,可以比较所述带宽分布信息中各目标函数对应的带宽信息与所述当前可用带宽,比较结果为大于,则说明对应的目标函数无法在目标平台上正常运行,将比较结果为大于的目标函数确定为待优化函数。
本发明还提供一种带宽分布确定装置,参看图4,该带宽分布确定装置100包括:
内存访问量确定模块101,用于针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
带宽分布信息确定模块102,用于在所述指定程序的各目标函数均被调用完成时,根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息。
在一个实施例中,所述内存访问量确定模块依据第一内存访问量和第二内存访问量确定该目标函数对应的第三内存访问量时,具体用于:
计算所述第二内存访问量与所述第一内存访问量的差值;
依据所述差值确定所述第三内存访问量。
在一个实施例中,所述带宽分布信息确定模块根据所述函数树中各节点记录的第三内存访问量确定调用指定程序中各目标函数所需的带宽分布信息时,具体用于:
针对所述函数树中每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;
基于已确定的调用各目标函数所需的带宽占比信息确定所述带宽分布信息。
在一个实施例中,所述函数树通过以下模块生成:
根节点确定模块,用于确定所述函数树的根节点,根节点与所述指定程序中指定的一个目标函数对应;
子节点生成模块,用于依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。
在一个实施例中,所述子节点生成模块依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点时,具体用于:
将所述根节点作为当前搜索节点,检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数,如果是,则针对每一子函数执行以下步骤:
若当前搜索节点不存在父节点,在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数;
若当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。
在一个实施例中,该装置还包括:
编号模块,用于按照设定编号原则为所述函数树中的节点分配节点编号;所述设定编号原则是指:处于同一层的节点编号连续,且每一层上指定节点的节点编号与其父节点的节点编号连续;每一层上的指定节点是指该层上具有最小节点编号的节点。
在一个实施例中,
所述函数树由数组构成,所述数组中的各元素与所述函数树中的各节点对应,每两个节点编号连续的节点是数组中的相邻数组元素。
本发明还提供一种程序优化装置,参看图5,该程序优化装置200包括:
待优化函数确定模块201,用于依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
优化方式确定模块202,用于依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
函数优化模块203,用于采用所述目标优化方式对所述待优化函数进行优化。
在一个实施例中,该装置还包括:对应关系建立模块,用于建立语法结构与优化方式的对应关系;
所述优化方式确定模块依据所述待优化函数的语法结构确定用于优化所述待优化函数的目标优化方式时,具体用于:
从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为所述目标优化方式。
在一个实施例中,所述对应关系建立模块建立语法结构与优化方式的对应关系时,具体用于:
从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
在一个实施例中,所述带宽分布信息包括:调用指定程序中各目标函数所需的带宽信息,所述带宽信息是指单位时间内的内存访问量;
所述待优化函数确定模块依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定出待优化函数时,具体用于:
获取用于运行所述指定程序的目标平台的当前可用带宽;
针对每一目标函数,比较所述带宽分布信息中该目标函数对应的带宽信息与所述当前可用带宽,当所述带宽分布信息中该目标函数对应的带宽信息大于所述当前可用带宽,确定该目标函数为待优化函数。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元。
本发明还提供一种电子设备,包括处理器及存储器;所述存储器存储有可被处理器调用的程序;其中,所述处理器执行所述程序时,实现如前述实施例中所述的带宽分布确定方法、或程序优化方法。
本发明带宽分布确定装置、及程序优化装置的实施例可以应用在电子设备上。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在电子设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图6所示,图6是本发明根据一示例性实施例示出的带宽分布确定装置100所在电子设备的一种硬件结构图(程序优化装置也是同理,因而不再示出),除了图6所示的处理器510、内存530、接口520、以及非易失性存储器540之外,实施例中装置100所在的电子设备通常根据该电子设备的实际功能,还可以包括其他硬件,对此不再赘述。
本发明还提供一种机器可读存储介质,其上存储有程序,该程序被处理器执行时,实现如前述实施例中所述的带宽分布确定方法、或程序优化方法。
本发明可采用在一个或多个其中包含有程序代码的存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。机器可读存储介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。机器可读存储介质的例子包括但不限于:相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
Claims (10)
1.一种带宽分布确定方法,其特征在于,该方法包括:
针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,计算所述第二内存访问量与所述第一内存访问量的差值,依据所述差值确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
在所述指定程序的各目标函数均被调用完成时,针对所述函数树中每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;基于已确定的调用各目标函数所需的带宽占比信息,确定调用指定程序中各目标函数所需的带宽分布信息。
2.如权利要求1所述的带宽分布确定方法,其特征在于,所述函数树通过以下方式生成:
确定所述函数树的根节点,根节点与所述指定程序中指定的一个目标函数对应;
依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点。
3.如权利要求2所述的带宽分布确定方法,其特征在于,依据所述指定程序中与所述根节点对应的目标函数的子函数生成所述函数树的子节点包括:
将所述根节点作为当前搜索节点,检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数,如果是,则针对每一子函数执行以下步骤:
若当前搜索节点不存在父节点,在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数;
若当前搜索节点存在父节点,当该子函数与指定路径上任一节点对应的目标函数均不同,所述指定路径为所述函数树上从当前搜索节点至根节点的路径,则在所述函数树中生成当前搜索节点的子节点,该子节点与该子函数对应,当所述函数树的当前访问节点层数未达到预设层数时,将该子节点确定为当前搜索节点,返回检查所述指定程序中是否存在与当前搜索节点对应的目标函数的子函数。
4.如权利要求1或3所述的带宽分布确定方法,其特征在于,在生成函数树之后,该方法还包括:
按照设定编号原则为所述函数树中的节点分配节点编号;所述设定编号原则是指:处于同一层的节点编号连续,且每一层上指定节点的节点编号与其父节点的节点编号连续;每一层上的指定节点是指该层上具有最小节点编号的节点。
5.如权利要求4所述的带宽分布确定方法,其特征在于,
所述函数树由数组构成,所述数组中的各元素与所述函数树中的各节点对应,每两个节点编号连续的节点是数组中的相邻数组元素。
6.一种程序优化方法,其特征在于,该方法包括:
依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
采用所述目标优化方式对所述待优化函数进行优化;
其中,所述语法结构与优化方式的对应关系通过以下步骤建立:
从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
7.如权利要求6所述的程序优化方法,其特征在于,所述带宽分布信息包括:调用指定程序中各目标函数所需的带宽信息,所述带宽信息是指单位时间内的内存访问量;
所述依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定出待优化函数包括:
获取用于运行所述指定程序的目标平台的当前可用带宽;
针对每一目标函数,比较所述带宽分布信息中该目标函数对应的带宽信息与所述当前可用带宽,当所述带宽分布信息中该目标函数对应的带宽信息大于所述当前可用带宽,确定该目标函数为待优化函数。
8.一种带宽分布确定装置,其特征在于,该装置包括:
内存访问量确定模块,用于针对指定程序中每一待调用的目标函数,从已生成的函数树中确定对应该目标函数的目标节点,并分别确定第一内存访问量和第二内存访问量,计算所述第二内存访问量与所述第一内存访问量的差值,依据所述差值确定该目标函数对应的第三内存访问量,将第三内存访问量记录至所述目标节点;第一内存访问量为在开始调用该目标函数时内存的已访问量,第二内存访问量为在该目标函数被调用完成时内存的已访问量,第三内存访问量为调用该目标函数所需的内存访问量;
带宽分布信息确定模块,用于在所述指定程序的各目标函数均被调用完成时,针对所述函数树中每一节点,计算该节点记录的第三内存访问量与根节点已记录的第三内存访问量之间的比值,依据该比值确定调用该节点对应的目标函数所需的带宽占比信息;基于已确定的调用各目标函数所需的带宽占比信息,确定调用指定程序中各目标函数所需的带宽分布信息。
9.一种程序优化装置,其特征在于,该装置包括:
待优化函数确定模块,用于依据调用指定程序中各目标函数所需的带宽分布信息,从所述指定程序中确定待优化函数;
优化方式确定模块,用于从已设置的语法结构与优化方式的对应关系中找出与所述待优化函数的语法结构对应的优化方式,并将找出的优化方式确定为用于优化所述待优化函数的目标优化方式,所述目标优化方式用于对调用所述待优化函数时的内存访问情况进行优化;
函数优化模块,用于采用所述目标优化方式对所述待优化函数进行优化;
其中,所述语法结构与优化方式的对应关系通过以下步骤建立:
从已获取的各样本函数组中确定出目标样本函数;所述样本函数组中至少包含第一样本函数及多个第二样本函数,所述多个第二样本函数是采用不同优化方式对第一样本函数进行优化得到的;所述目标样本函数为从样本函数组包括的第二样本函数中选择的满足设定要求的第二样本函数,所述设定要求是指被调用所需的带宽信息最小;所述带宽信息是指单位时间内的内存访问量;
针对各样本函数组,依据该样本函数组中各样本函数的语法结构与该样本函数组中的目标样本函数所采用的优化方式建立所述对应关系。
10.一种电子设备,其特征在于,包括处理器及存储器;所述存储器存储有可被处理器调用的程序;其中,所述处理器执行所述程序时,实现如权利要求1-5中任一项所述的带宽分布确定方法、或如权利要求6-7中任一项所述的程序优化方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010478159.XA CN113742263B (zh) | 2020-05-29 | 带宽分布确定、程序优化方法及装置、设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010478159.XA CN113742263B (zh) | 2020-05-29 | 带宽分布确定、程序优化方法及装置、设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113742263A CN113742263A (zh) | 2021-12-03 |
CN113742263B true CN113742263B (zh) | 2024-06-25 |
Family
ID=
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066335A (zh) * | 2017-03-23 | 2017-08-18 | 华南师范大学 | 一种云平台内存的优化方法和优化*** |
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066335A (zh) * | 2017-03-23 | 2017-08-18 | 华南师范大学 | 一种云平台内存的优化方法和优化*** |
Non-Patent Citations (1)
Title |
---|
Visual FoxPro程序优化;孙守梅;;高师理科学刊;20090530(03);全文 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100440163C (zh) | 对计算机程序进行运行时分析的方法和*** | |
US7971175B2 (en) | Method and system for implementing cached parameterized cells | |
US8402435B1 (en) | Systems and methods for organizing source code | |
US20180011693A1 (en) | Methods and apparatus to eliminate partial-redundant vector loads | |
CN110704336B (zh) | 一种数据缓存方法及装置 | |
US20080288529A1 (en) | System to organize data for visualizing performance characteristics in dynamic perspectives using relational database | |
US10365905B1 (en) | Systems and methods for evaluating application performance changes via comparative call graphs | |
US8359291B2 (en) | Architecture-aware field affinity estimation | |
WO2016161130A1 (en) | Field specialization systems and methods for improving program performance | |
CN113742263B (zh) | 带宽分布确定、程序优化方法及装置、设备 | |
CN113742263A (zh) | 带宽分布确定、程序优化方法及装置、设备 | |
CN113704519B (zh) | 一种数据集的确定方法、装置、计算机设备以及存储介质 | |
US7590792B2 (en) | Cache memory analyzing method | |
CN105487911A (zh) | 一种基于编译指导的众核数据分片方法 | |
CN111143006B (zh) | 命令帮助信息的获取方法及装置 | |
CN114090430A (zh) | 一种覆盖测试方法、***、存储介质及计算设备 | |
CN113220992A (zh) | 一种信息流内容推荐方法、***及介质 | |
US7380174B2 (en) | Variable writing through a fixed programming interface | |
CN114527963A (zh) | C++二进制文件中的类继承关系识别方法及电子装置 | |
Carey et al. | C++ Data Structures and Algorithm Design Principles: Leverage the power of modern C++ to build robust and scalable applications | |
CN112035161B (zh) | 一种小程序发布校验的方法及并行发布的方法 | |
US20210157558A1 (en) | Process for constructing a signature characteristic of the accesses, by a microprocessor, of a memory | |
CN116339744B (zh) | 一种自定义函数优化方法、装置、计算机设备及介质 | |
CN116954622B (zh) | 抽象语法树和源代码坐标的关联方法、电子设备和介质 | |
CN112370789B (zh) | 模型三角形网格合适度的检测方法及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |