代码编译方法及装置
技术领域
本公开通常涉及计算机技术领域,更具体地,涉及代码编译方法及装置。
背景技术
在计算机处理领域,使用数学算法来对数据进行计算处理是一种常规数据处理。在进行计算处理时,数学算法通常采用算法模型来进行表征(在下面的描述中,将数学算法统称为算法模型)。算法模型的运算能力决定了数据计算处理的效率。算法模型的运算能力也称为算力。算力的提高依赖于多方面的综合优化,比如算法计算逻辑优化,编程语言优化,处理器性能优化,存储优化,通讯优化,系统体系结构优化等。算力优化需要对算法模型与计算机软硬件系统(即,计算体系架构)进行协同优化,是算法模型与计算体系架构能力共同提高的结果。
另外,在算法模型和计算体系架构确定的情况下,也可以通过调整在计算体系架构上运行的机器语言代码的代码编排参数来生成高效的机器语言代码,由此提高代码运行效率。如何在给定算法模型和计算体系架构的情况下生成高效的机器语言代码成为亟待解决的问题。
发明内容
鉴于上述,本公开提供了一种代码编译方法及装置。利用该代码编译方法及装置,能够在给定算法模型和计算体系架构的情况下,生成高效的机器语言代码。
根据本公开的一个方面,提供了一种机器语言代码编译方法,包括:针对待编译的算法模型的领域特定语言程序执行下述循环处理过程,直到满足循环结束条件:使用领域特定语言编译器来基于当前代码编排参数对所述领域特定语言程序进行编译,以得到当前机器语言代码;在对应的计算架构中基于给定样本数据运行所述当前机器语言代码,以得到代码性能参数数据;在未满足循环结束条件时,基于所述代码性能参数数据以及所述计算架构的运算参数信息,在所述算法模型下对所述当前代码编排参数进行优化,其中,所述优化后的代码编排参数被作为下一循环的当前代码编排参数,在满足所述循环结束条件时,输出所述当前机器语言代码作为目标机器语言代码。
可选地,在上述方面的一个示例中,对所述当前代码编排参数进行优化是采用下述算法中的一种算法进行的:机器学习模型;随机搜索算法;网格搜索算法;遗传搜索算法;蒙特卡罗搜索算法;和退火算法。
可选地,在上述方面的一个示例中,所述领域特定语言程序是使用与所述算法模型的适用领域匹配的领域特定语言编写的。
可选地,在上述方面的一个示例中,所述领域特定语言包括下述领域特定语言中的至少一种:Halide;Graphlt;Spatial;以及定制的领域特定语言,其中,使用领域特定语言编译器来基于当前代码编排参数对所述领域特定语言程序进行编译包括:使用对应的领域特定语言编译器来基于当前代码编排参数对所述领域特定语言程序进行编译。
可选地,在上述方面的一个示例中,所述代码编排参数的初始值是基于历史代码性能参数数据、所述算法模型以及所述计算架构的运算参数信息获得的。
可选地,在上述方面的一个示例中,所述给定样本数据是在所述算法模型的目标应用场景下获取的样本数据。
可选地,在上述方面的一个示例中,所述计算架构包括下述计算架构中的至少一种:CPU类计算架构;GPU类计算架构;FPGA类计算架构;TPU类计算架构;AI类计算架构;和定制处理器计算架构。
可选地,在上述方面的一个示例中,在所述计算架构包括至少两种计算架构时,所述机器语言代码编译方法还包括:比较与所述至少两种计算架构对应的机器语言代码的代码性能参数,以及输出所述当前机器语言代码作为目标机器语言代码包括:输出代码性能参数最佳的机器语言代码作为目标机器语言代码。
可选地,在上述方面的一个示例中,所述循环结束条件包括下述结束条件中的一种:循环次数达到预定次数;和当前代码性能参数数据与前一代码性能参数数据之间的差值在预定范围内。
根据本公开的另一方面,提供一种机器语言代码编译装置,包括:代码编译单元,被配置为基于当前代码编排参数对待编译的算法模型的领域特定语言程序进行编译,以得到当前机器语言代码;代码运行单元,被配置为在对应的计算架构中基于给定样本数据运行所述当前机器语言代码,以得到代码性能参数数据;循环结束判断单元,被配置为判断是否满足循环结束条件;编排参数优化单元,被配置为在未满足循环结束条件时,基于所述代码性能参数数据以及所述计算架构的运算参数信息,在所述算法模型下对所述当前代码编排参数进行优化;代码输出单元,被配置为在满足所述循环结束条件时,输出所述当前机器语言代码作为目标机器语言代码,其中,所述代码编译单元、所述代码运行单元、所述循环结束判断单元和所述编排参数优化单元被配置为针对所述领域特定语言程序执行循环处理,直到所述循环结束判断单元判断为满足所述循环结束条件,其中,在所述循环结束判断单元判断为未满足循环结束条件时,所述编排参数优化单元所输出的代码编排参数被作为下一循环的当前代码编排参数。
可选地,在上述方面的一个示例中,所述领域特定语言程序是使用与所述算法模型的适用领域匹配的领域特定语言编写的,所述领域特定语言包括下述领域特定语言中的至少一种:Halide;Graphlt;Spatial;以及定制的领域特定语言,所述代码编译单元包括下述领域特定语言编译器中的至少一种:Halide编译器;Graphlt编译器;Spatial编译器;以及定制的领域特定语言编译器,其中,所述代码编译单元被配置为:使用对应的领域特定语言编译器来基于当前代码编排参数对所述领域特定语言程序进行编译。
可选地,在上述方面的一个示例中,所述机器语言代码编译装置还可以包括:代码性能参数数据库,被配置为将历史代码性能参数数据与对应的算法模型和对应的计算架构的运算参数信息相关联地存储,其中,所述代码编排参数的初始值是基于历史代码性能参数数据、所述算法模型以及所述计算架构的运算参数信息获得的。
可选地,在上述方面的一个示例中,所述计算架构包括下述计算架构中的至少一种:CPU类计算架构;GPU类计算架构;FPGA类计算架构;TPU类计算架构;和AI类计算架构;和定制处理器计算架构。
可选地,在上述方面的一个示例中,在所述计算架构包括至少两种计算架构时,所述机器语言代码编译装置还可以包括:性能比较单元,被配置为比较与所述至少两种计算架构对应的机器语言代码的代码性能参数,其中,所述代码输出单元被配置为输出代码性能参数最佳的机器语言代码作为目标机器语言代码。
可选地,在上述方面的一个示例中,所述循环结束条件包括下述结束条件中的一种:循环次数达到预定次数;和当前代码性能参数数据与前一代码性能参数数据之间的差值在预定范围内。
根据本公开的另一方面,提供一种计算设备,包括:至少一个处理器,以及与所述至少一个处理器耦合的存储器,所述存储器存储指令,当所述指令被所述至少一个处理器执行时,使得所述至少一个处理器执行如上所述的机器语言代码编译方法。
根据本公开的另一方面,提供一种机器可读存储介质,其存储有可执行指令,所述指令当被执行时使得所述机器执行如上所述的机器语言代码编译方法。
附图说明
通过参照下面的附图,可以实现对于本公开内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
图1示出了根据本公开的实施例的代码编译系统的一个示例的方框图;
图2示出了根据本公开的实施例的代码编译方法的一个示例的流程图;
图3示出了根据本公开的实施例的代码编译系统的另一示例的方框图;
图4示出了根据本公开的实施例的代码编译方法的另一示例的流程图;
图5示出了根据本公开的实施例的代码编译过程的一个示例的示意图;
图6示出了根据本公开的实施例的用于实现机器语言代码编译的计算设备的方框图。
具体实施方式
现在将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本公开内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。例如,所描述的方法可以按照与所描述的顺序不同的顺序来执行,以及各个步骤可以被添加、省略或者组合。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
本公开的实施例提出一种基于自动机器学习和编译技术的代码编译框架。在该代码编译框架中,针对每个领域开发出领域特定编程语言(DSL,domain-specificlanguage)。这样,只需使用该DSL语言来描述算法模型的各个基本算法单元,由此得到该算法模型的DSL程序,然后利用该DSL语言对应的编译器生成针对不同计算架构(即,底层硬件)的机器语言代码,并且使用自动机器学习技术来基于机器语言代码的代码性能参数优化机器语言代码的编排逻辑(即,代码编排参数),从而获得高效的机器语言代码,由此使得算法模型能够在不同计算架构上高效执行,进而提高算法模型的运算能力。
下面将结合附图来详细描述根据本公开的实施例的机器语言代码编译方法、装置及系统。
图1示出了根据本公开的实施例的代码编译系统1的一个示例的方框图。如图1所示,代码编译系统1包括代码编译装置10和计算架构20。代码编译装置10包括代码编译单元110、代码运行单元120、循环结束判断130、编排参数优化单元140和代码输出单元150。
在本公开中,代码编译单元110、代码运行单元120、循环结束判断单元130和编排参数优化单元140被配置为针对待编译的算法模型的DSL程序执行循环处理,直到循环结束判断单元130判断为满足循环结束条件。在一个示例中,所述循环结束条件包括下述结束条件中的一种:循环次数达到预定次数;以及当前代码性能参数数据与前一代码性能参数数据之间的差值在预定范围内。预定次数的取值可以预先设定,例如,所述预定次数可以为20次。或者,预定次数的取值可以基于算法模型的具体应用场景来确定。所述预定范围例如可以设置为0%~1%,或者,所述预定范围被设置为其它合适范围值。
具体地,代码编译单元110被配置为基于当前代码编排参数对DSL程序30进行编译,以得到当前机器语言代码。所述机器语言代码例如可以是二进制机器语言代码等。例如,代码编译单元110可以基于当前代码编排参数,结合所具有的计算架构的运算参数信息来对DSL程序30进行编译。这里,DSL程序30是使用与算法模型的适用领域匹配的DSL语言编写的。所述代码编排参数例如可以包括编排指令parallel,split,unroll,tile或者vectorize等参数。编排指令parallel用于指定函数沿着某个维度x进行并行计算。编排指令split用于指示将某一个维度x分解成内外两个维度:x_in和x_out,其中x_in*x_out=x。编排指令unroll用于指示在某个维度x上按照指定的因子k进行展开。编排指令tile用于指示在x和y两个维度上分别按照指定的因子xk和yk进行分解,并以xk和yk组成的tile作为计算单元进行运算。编排指令vectorize用于指示在某个维度x上使用SIMD指令按照指定的并行因子k进行向量化计算。在第一次循环时,代码编译单元110可以使用对应的DSL编译器中的初始代码编排参数作为当前代码编排参数。针对不同的计算架构,可以包括不同的运算信息。这在本领域中是公知的。例如,针对CPU,所述计算架构的运算参数可以包括该计算机构可以支持的线程数,该计算架构的处理器核数和SIMD指令宽度等。针对GPU,所述计算架构的运算参数可以包括每个线程块(thread block)中的线程数,线程在多维度上的分配,总线程数约束等,还可以包括是否使用共享内存(shared memory),以及共享内存大小等。针对其它类型的计算架构,所述计算架构的运算参数可以包括其它适合的参数信息。
在本公开中,所述DSL语言可以包括下述DSL语言中的至少一种:Halide;Graphlt;Spatial;以及定制的领域特定语言。Halide适用于向量和张量运算,GraphIt适用于图计算领域,Spatial适用于可编程硬件领域,以及定制的领域特定语言适用于对应的定制领域。相应地,代码编译单元110具有对应的DSL编译器,即,代码编译单元110包括下述DSL编译器中的至少一种:Halide编译器;Graphlt编译器;Spatial编译器;以及定制的DSL编译器。在这种情况下,代码编译单元110被配置为:使用对应的DSL编译器来基于当前代码编排参数对DSL程序进行编译。
例如,数学算法可以包括深度学习算法、线性代数算法、图像处理算法、图计算算法、运筹优化算法和数据分析算法。深度学习算法,线性代数算法和运筹优化算法依赖于向量和张量计算,可以使用Halide来编写。图计算算法依赖于图相关的操作,可以使用GraphIt来编写。如果这些算法使用FPGA等可编程硬件来加速,硬件加速逻辑可以使用Spatial来编写。
在如上得到当前机器语言代码后,代码运行单元120在对应的计算架构20中基于给定样本数据40运行当前机器语言代码,以得到代码性能参数数据。所述代码性能参数数据用于反映机器语言代码的运算效率。例如,所述代码性能参数可以包括计算时间,内存消耗量等。在一个示例中,给定样本数据40可以是通用样本数据。在另一示例中,给定样本数据40可以是在所述算法模型的目标应用场景下获取的样本数据。例如,在人脸识别领域,给定样本数据是在真实世界的不同场景中拍摄的人脸照片,以期望通过编译优化生成的机器语言代码是在人脸识别的应用场景下最优的机器语言代码。
接着,循环结束判断单元130判断是否满足循环结束条件。例如,循环结束判断单元130判断循环次数是否达到预定次数,或者判断当前代码性能参数与前一循环过程获得的前一代码性能参数的差值是否在预定范围。
如果循环结束判断单元130判断为未满足循环结束条件,则编排参数优化单元140基于当前代码性能参数数据以及所使用的计算架构20的运算参数信息,在所述算法模型下对当前代码编排参数进行优化。具体地,使用计算架构20的运算参数信息和算法模型作为约束条件,基于当前代码性能参数数据来得到优化的代码编排参数。
在本公开中,可以使用自动机器学习来对当前代码编排参数进行优化。例如,可以使用机器学习模型(比如强化学习等)来对当前代码编排参数进行优化。具体地,采用机器学习方法,利用针对所有计算架构在不同应用场景下获得的代码性能参数数据,训练生成针对具体算法模型和计算架构的运算参数的代码编排参数优化模型。然后,利用该代码编排参数优化模型来得到与当前代码性能参数数据对应的优化后的代码编排参数。在本公开中,除了机器学习模型之外,还可以使用传统搜索方法来进行代码编排参数优化。所述传统搜索方法例如可以包括随机搜索算法,网格搜索算法,遗传搜索算法,蒙特卡洛算法和退火算法等。
如果循环结束判断单元130判断为满足循环结束条件,则循环处理结束,并且代码输出单元150输出代码编译单元110所编译出的当前机器语言代码作为目标机器语言代码,由此完成机器语言代码生成过程。
在本公开中,计算架构20可以包括下述计算架构中的至少一种:CPU类计算架构、GPU类计算架构、FPGA类计算架构、TPU类计算架构、AI类计算架构和定制处理器计算架构。CPU类计算架构适合通用计算,但是不适合处理高维大向量的数据类型。GPU类计算架构可以适合于高并行和高吞吐的数据处理,但是不适合处理图拓扑结构和流式数据等。FPGA类计算架构适合于具有低延迟需求的数据处理,但是对高密度计算很难提供高吞吐,同时如果使用传统硬件逻辑开发流程,开发周期比较长,很难跟上算法快速迭代。AI类计算架构(基于ASIC芯片的计算架构)具有低功耗和低延迟等优点,但是开发成本高,迭代周期长。定制处理器计算架构在特定应用场景下能够获得更高的性能,但是灵活性比较差,适合于比较稳定且长期使用的场景。
图2示出了根据本公开的实施例的代码编译方法的一个示例的流程图。该方法由图1中示出的代码编译装置10执行。
如图2所示,首先,在块210,对代码编译单元110中的DSL编译器进行初始化,以得到初始代码编排参数。接着,针对待编译的算法模型的DSL程序30循环执行块220到250的操作,直到满足循环结束条件。
具体地,在块220,使用对应的DSL编译器来基于当前代码编排参数对DSL程序30进行编译,以得到当前机器语言代码。
接着,在块230,在对应的计算架20中基于给定样本数据40运行当前机器语言代码,以得到当前代码性能参数数据。然后,在块240,判断是否满足循环结束条件。
在判断为未满足循环结束条件时,在块250,基于当前代码性能参数数据以及计算架构20的运算参数信息,在所述算法模型下对当前代码编排参数进行优化,并且将优化后的代码编排参数作为下一循环的当前代码编排参数。然后返回到块220,以执行下一循环过程。
在判断为满足循环结束条件时,在块260,输出当前机器语言代码作为目标机器语言代码,由此完成机器语言代码生成过程。
利用图1和图2中示出的机器语言代码编译装置和方法,针对每个算法模型,利用匹配的DSL语言来描述算法模型的各个基本算法单元以得到该算法模型的DSL程序,然后利用该DSL语言对应的编译器生成针对不同计算架构(即,底层硬件)的机器语言代码,并且使用自动机器学习技术来基于机器语言代码的代码性能参数进行机器语言代码的代码编排参数优化,从而获得高效的机器语言代码,由此使得算法模型能够在不同计算架构上高效执行,进而提高算法模型的运算能力。
此外,利用图1和图2中示出的机器语言代码编译装置和方法,通过使用机器学习模型来进行机器语言代码的代码编排参数优化,可以使得在进行针对新的计算架构或者应用场景下的DSL程序编译时,仅仅需要对DSL编译单元的当前代码编译参数进行微调就可完成代码编译参数优化,从而大大降低机器语言代码编译时间,由此提高代码编译效率。
图3示出了根据本公开的实施例的代码编译系统1’的另一示例的方框图。图3中示出的代码编译系统1’是图1中示出的代码编译系统1的修改实施例。与图1中示出的代码编译系统1相比,代码编译系统1’还包括代码性能参数数据库135和性能比较单元145。图3中示出的代码编译单元110、代码运行单元120、循环结束判断单独130和编排参数优化单元140的结构和操作与图1中示出的对应单元的结构和操作完全相同,在此不再赘述。
代码性能参数数据库135被配置为存储在不同算法模型和计算架构下的机器语言代码的历史代码性能参数数据,其中,历史代码性能参数数据被与对应的算法模型和对应的计算架构的运算参数信息相关联地存储在代码性能参数数据库。在这种情况下,编排参数优化单元140可以基于历史代码性能参数数据以及当前计算架构的运算参数信息和当前算法模型获得一个代码编排参数,然后将所得到的代码编排参数提供给代码编译单元110作为代码编排参数的初始值。
性能比较单元145被配置为在所述计算架构包括至少两种计算架构时,在如上针对各个计算架构完成机器语言代码编译后,比较各个计算架构所对应的机器语言代码的代码性能参数。然后,代码输出单元150输出代码性能参数最佳的机器语言代码作为目标机器语言代码,由此完成机器语言代码编译。
图4示出了根据本公开的实施例的代码编译方法的另一示例的流程图。该方法是由图3中示出的代码编译装置在具有多种可用计算架构的情形下执行的代码编译过程。
如图4所示,首先,在块410,从多种可用计算架构中选择一个计算架构作为当前计算架构。接着,针对待编译的算法模型的DSL程序30循环执行块415到450的操作,直到获取各个可用计算架构下的机器语言代码。
具体地,在块415,在当前计算架构下,对代码编译单元110中的DSL编译器进行初始化,以得到初始代码编排参数。例如,可以基于从历史代码性能参数数据库135中获取的历史代码性能参数、当前计算架构的运算参数和当前算法模型,获取DSL编译器的初始代码编排参数。
接着,在块420,使用对应的DSL编译器来基于当前代码编排参数对DSL程序30进行编译,以得到当前机器语言代码。然后,在块425,在对应的计算架20中基于给定样本数据40运行当前机器语言代码,以得到当前代码性能参数数据。然后,在块430,判断是否满足循环结束条件。
在判断为未满足循环结束条件时,在块435,基于当前代码性能参数数据以及计算架构20的运算参数信息,在所述算法模型下对当前代码编排参数进行优化,并且将优化后的代码编排参数作为下一循环的当前代码编排参数。然后返回到块420,以执行下一循环过程。
在判断为满足循环结束条件时,在块440,得到当前计算架构下的机器语言代码。然后,在块445,判断是否针对所有可用计算架构都得到对应的机器语言代码。
如果判断为未针对所有可用计算架构都得到对应的机器语言代码,则在块450,选择另一计算架构作为下一当前计算架构,然后返回到块415,进行针对下一当前计算架构的机器语言代码编译过程。
如果判断为针对所有可用计算架构都得到对应的机器语言代码,则在块455,比较各个计算架构下得到的机器语言代码的代码性能参数,并且在块460,输出代码性能最佳的机器语言代码作为目标机器语言代码,由此完成机器语言代码生成过程。
利用图4中示出的机器语言代码编译方法,通过基于历史代码性能参数来获取各个计算架构下的DSL编译器的初始代码编排参数,可以使得DSL编译器的初始代码编排参数更加接近最优代码编排参数,从而可以减少代码编排参数优化所需的循环次数,由此降低机器语言代码编译时间,提高代码编译效率。
利用图4中示出的机器语言代码编译方法,通过基于不同计算架构获取对应的机器语言代码,并且从所得到的多个机器语言代码中选择代码性能最佳的机器语言代码作为目标机器语言代码,从而能够在具有多种可用计算架构的情况下,得到性能最佳的机器语言代码以及对应的计算架构。
此外,要说明的是,可以对图4中示出的实施例进行修改。例如,可以将图4中示出的实施例修改为仅仅用于单个可用计算架构,即,不包括块410、445-460的操作,同时,利用图2中的块260的操作来替换块440的操作。
此外,还可以利用图2中的块210的操作来替换块415的操作。
图5示出了根据本公开的实施例的代码编译过程的一个示例的示意图。
如图5所示,针对多种数学算法中的一种数学算法,利用适合的DSL语言来编写出对应的DSL程序,即,算法模型的DSL程序。所得到的DSL程序被提供给DSL编译单元,以及算法模型被提供给编排优化单元。
多种可用计算架构中的各个计算架构的运算参数信息(即,图中的计算架构模型)被提供给DSL编译单元和编排优化单元。
DSL编译单元使用对应的DSL编译器,来基于所得到的计算架构的运算参数信息对DSL程序进行代码编译,以得到当前机器语言代码。然后,代码编译单元在对应的计算架构中,基于给定样本数据运行当前机器语言代码,以得到当前代码性能参数。所得到的当前代码性能参数被提供给编排优化单元。此外,所得到的当前代码性能参数还可以作为历史代码性能参数数据存储在代码性能参数数据库135中。
编排参数优化单元基于所得到的当前代码性能参数,在当前计算架构的运算参数和当前算法模型的约束条件下进行代码编排参数优化,以得到优化后的代码编排参数。然后,将优化后的代码编排参数提供给代码编译单元来再次进行代码编译,由此进行下一代码优化循环过程,直到满足循环结束条件。
如上参照图1到图5,对根据本公开的机器语言代码编译方法及机器语言代码编译装置的实施例进行了描述。上面的机器语言代码编译装置可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。
图6示出了根据本公开的实施例的用于实现机器语言代码编译的计算设备600的硬件结构图。如图6所示,计算设备600可以包括至少一个处理器610、存储器620、内存630和通信接口640,并且至少一个处理器610、存储器620、内存630和通信接口640经由总线660连接在一起。至少一个处理器610执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器610:针对待编译的算法模型的领域特定语言程序执行下述循环处理过程,直到满足循环结束条件:使用领域特定语言编译器来基于当前代码编排参数对所述领域特定语言程序进行编译,以得到当前机器语言代码;在对应的计算架构中基于给定样本数据运行所述当前机器语言代码,以得到代码性能参数数据;在未满足循环结束条件时,在所述算法模型下,基于所述代码性能参数数据以及所述计算架构的运算参数信息,对所述当前代码编排参数进行优化,其中,所述优化后的代码编排参数被作为下一循环的当前代码编排参数,在满足所述循环结束条件时,输出所述当前机器语言代码作为目标机器语言代码。
应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器610进行本公开的各个实施例中以上结合图1-5描述的各种操作和功能。
在本公开中,计算设备600可以包括但不限于:个人计算机、服务器计算机、工作站、桌面型计算机、膝上型计算机、笔记本计算机、移动计算设备、智能电话、平板计算机、蜂窝电话、个人数字助理(PDA)、手持装置、消息收发设备、可佩戴计算设备、消费电子设备等等。
根据一个实施例,提供了一种比如机器可读介质的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本公开的各个实施例中以上结合图1-5描述的各种操作和功能。具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD-RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
本领域技术人员应当理解,上面公开的各个实施例可以在不偏离发明实质的情况下做出各种变形和修改。因此,本发明的保护范围应当由所附的权利要求书来限定。
需要说明的是,上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
以上各实施例中,硬件单元或模块可以通过机械方式或电气方式实现。例如,一个硬件单元、模块或处理器可以包括永久性专用的电路或逻辑(如专门的处理器,FPGA或ASIC)来完成相应操作。硬件单元或处理器还可以包括可编程逻辑或电路(如通用处理器或其它可编程处理器),可以由软件进行临时的设置以完成相应操作。具体的实现方式(机械方式、或专用的永久性电路、或者临时设置的电路)可以基于成本和时间上的考虑来确定。
上面结合附图阐述的具体实施方式描述了示例性实施例,但并不表示可以实现的或者落入权利要求书的保护范围的所有实施例。在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。