一种条件语句的处理方法、装置及存储介质转让专利

申请号 : CN202210811806.3

文献号 : CN114968364B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 赵天磊高军周行董金陇

申请人 : 飞腾信息技术有限公司

摘要 :

本申请公开了一种条件语句的处理方法、装置及存储介质。该方法根据条件指令的结果来确定根据哪一前驱指令的结果确定条件语句的结果,并移除对其它前驱指令的依赖。如此,条件语句的结果不会同时依赖于多个前驱指令,即只需等待特定前驱指令的结果,而无需等待全部前驱指令的结果,从而可大幅减少指令的相关链,缩短条件指令的执行时间,增大并行性,提升计算性能。

权利要求 :

1.一种条件语句的处理方法,其特征在于,所述方法包括:获取条件指令的结果,所述条件指令用于计算条件语句中的条件;

若所述条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定所述条件语句的结果;

其中,所述条件语句在执行时转化为第一断言指令和第二断言指令,所述第一断言指令用于执行所述条件为真时对应的操作,所述第二断言指令用于执行所述条件为假时对应的操作,所述第一前驱指令为所述第一断言指令的前驱指令,所述第二前驱指令为所述第二断言指令的前驱指令。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:若所述条件指令的结果为真,则移除对所述第二前驱指令的依赖,根据所述第一前驱指令的结果确定所述条件语句的结果。

3.根据权利要求1所述的方法,其特征在于,所述移除对所述第一前驱指令的依赖,是通过移除所述第二断言指令对所述第一断言指令的依赖来实现的。

4.根据权利要求1所述的方法,其特征在于,所述方法还包括:将所述条件指令的结果发送至所述第一断言指令和所述第二断言指令。

5.根据权利要求4所述的方法,其特征在于,所述将所述条件指令的结果发送至所述第一断言指令和所述第二断言指令,包括:通过广播总线,将所述条件指令的结果发送至所述第一断言指令和所述第二断言指令。

6.一种条件语句的处理装置,其特征在于,所述装置包括:条件结果获取模块,获取条件指令的结果,所述条件指令用于计算条件语句中的条件;

条件语句结果确定模块,用于若所述条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定所述条件语句的结果;

其中,所述条件语句在执行时转化为第一断言指令和第二断言指令,所述第一断言指令用于执行所述条件为真时对应的操作,所述第二断言指令用于执行所述条件为假时对应的操作,所述第一前驱指令为所述第一断言指令的前驱指令,所述第二前驱指令为所述第二断言指令的前驱指令。

7.根据权利要求6所述的装置,其特征在于,所述条件语句结果确定模块还用于:若所述条件指令的结果为真,则移除对所述第二前驱指令的依赖,根据所述第一前驱指令的结果确定所述条件语句的结果。

8.根据权利要求6所述的装置,其特征在于,所述条件语句结果确定模块具体用于:通过移除所述第二断言指令对所述第一断言指令的依赖来实现移除对所述第一前驱指令的依赖。

9.根据权利要求6所述的装置,其特征在于,所述装置还包括:条件结果发送模块,用于将所述条件指令的结果发送至所述第一断言指令和所述第二断言指令。

10.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使计算机执行根据权利要求1‑5中任一项所述的方法。

说明书 :

一种条件语句的处理方法、装置及存储介质

技术领域

[0001] 本申请涉及计算机数据处理领域,尤其涉及一种条件语句的处理方法、装置及存储介质。

背景技术

[0002] 条件语句是用来判断是否满足给定的条件来决定下一步要执行的语句。例如,if‑else、switch、case、while、until等中的选择结构就是用条件语句来实现的。
[0003] 为了提高计算性能,在乱序执行(Out‑of‑order Execution,OOE)的架构中,由输入数据可用性所决定的顺序中执行指令,而不是由程序的原始数据所决定的顺序中执行指令。
[0004] 因此,条件语句在执行时通常会被转化为两条断言(assert)指令,其中,一条断言指令用于执行满足给定条件时需要执行的操作;第二条断言指令用于执行不满足给定条件时需要执行的操作。
[0005] 其中,每个断言指令都会有一条前驱指令。在执行条件语句时,每个断言指令和对应的前驱指令,都会作为独立的指令,以流水线的方式并发执行;之后,根据条件指令的结果,确定目的寄存器是放置哪个断言指令的结果。

发明内容

[0006] 在上述乱序执行的架构中,需要等待每一前驱指令的结果和条件指令的结果,从而会导致整个条件语句的执行时间变长,进而影响性能。
[0007] 本申请创造性地提供一种条件语句的处理方法、装置及存储介质。
[0008] 根据本申请实施例第一方面,提供一种条件语句的处理方法,该方法包括:获取条件指令的结果,条件指令用于计算条件语句中的条件;若条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定条件语句的结果;其中,条件语句在执行时转化为第一断言指令和第二断言指令,第一断言指令用于执行条件为真时对应的操作,第二断言指令用于执行条件为假时对应的操作,第一前驱指令为第一断言指令的前驱指令,第二前驱指令为第二断言指令的前驱指令。
[0009] 根据本申请一实施例,方法还包括:若条件指令的结果为真,则移除对第二前驱指令的依赖,根据第一前驱指令的结果确定条件语句的结果。
[0010] 根据本申请一实施例,移除对第一前驱指令的依赖,包括:移除第二断言指令对第一断言指令的依赖。
[0011] 根据本申请一实施例,该方法还包括:将条件指令的结果发送至第一断言指令和第二断言指令。
[0012] 根据本申请一实施例,将条件指令的结果发送至第一断言指令和第二断言指令,包括:通过广播总线,将条件指令的结果发送至第一断言指令和第二断言指令。
[0013] 根据本申请实施例第二方面,提供一种条件语句的处理装置,该装置包括:条件结果获取模块,获取条件指令的结果,条件指令用于计算条件语句中的条件;条件语句结果确定模块,用于若条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定条件语句的结果;其中,条件语句在执行时转化为第一断言指令和第二断言指令,第一断言指令用于执行条件为真时对应的操作,第二断言指令用于执行条件为假时对应的操作,第一前驱指令为第一断言指令的前驱指令,第二前驱指令为第二断言指令的前驱指令。
[0014] 根据本申请实施例第三方面,提供一种计算机存储介质,存储介质包括一组计算机可执行指令,当指令被执行时用于执行上述任一项条件语句的处理方法。
[0015] 本申请实施例提供一种条件语句的处理方法、装置及存储介质,该方法,根据条件指令的结果来确定根据哪一前驱指令的结果确定条件语句的结果,并移除对其它前驱指令的依赖。如此,条件语句的结果不会同时依赖于多个前驱指令,即只需等待特定前驱指令的结果,而无需等待全部前驱指令的结果,从而可大幅减少指令的相关链,缩短条件指令的执行时间,增大并行性,提升计算性能。
[0016] 需要理解的是,本申请的实施并不需要实现上面的全部有益效果,而是特定的技术方案可以实现特定的技术效果,并且本申请的其他实施方式还能够实现上面未提到的有益效果。

附图说明

[0017] 通过参考附图阅读下文的详细描述,本申请示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本申请的若干实施方式,其中:
[0018] 在附图中,相同或对应的标号表示相同或对应的部分。
[0019] 图1为通过控制依赖执行条件语句的处理流程示意图;
[0020] 图2为通过数据依赖执行条件语句的处理流程示意图;
[0021] 图3为本申请一实施执行条件语句的处理流程示意图之一;
[0022] 图4为本申请一实施例实现条件语句的处理方法的流程示意图之一;
[0023] 图5为本申请一实施执行条件语句的处理流程示意图之二;
[0024] 图6为本申请一实施例实现条件语句的处理方法的流程示意图之二;
[0025] 图7为本申请一实施例条件语句的处理装置的组成结构示意图。

具体实施方式

[0026] 为使本申请的目的、特征、优点能够更加的明显和易懂,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而非全部实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0027] 在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
[0028] 此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或隐含地包括至少一个该特征。在本申请的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
[0029] 对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
[0030] 乱序执行(Out‑of‑order Execution,OOE)是一种应用在高性能微处理器中,由输入数据可用性所决定的顺序中执行指令,而不是由程序的原始数据所决定的执行方式。
[0031] 重排序缓冲区(Re‑order Buffer, ROB),也称重排序缓冲器,指用于存储指令相关信息,以使得指令在乱序执行之后,仍可按照原有顺序提交的缓冲区(Buffer)。
[0032] 在乱序执行架构中,主要分三个阶段:发射(issue)、执行(execute)和结果写回(write result)。在结果写回阶段,指令的结果暂时被保存在重排序缓冲区中。随后,等整个条件语句执行完毕后,才将结果保存至目的寄存器中。
[0033] 条件语句(conditional statement)指通过判断表达式的值来决定执行还是跳过某些操作的程序语句。
[0034] 断言(assert)指令条件语句在执行时,所转化成的分支指令,其中,一条断言指令用于执行条件为真时对应的操作;另一条断言指令用于执行条件为假时对应的操作。
[0035] 例如,下面的if‑then‑else的条件语句:
[0036] b=2*3;
[0037] c=4*5;
[0038] If (cond)
[0039] Then
[0040]     v=b;
[0041] else
[0042]     v=c;
[0043] u=v;
[0044] 可转换成如下所示的两条断言指令:
[0045] 第一断言指令(if‑then分支): v=b If (cond);
[0046] 第二断言指令(else分支):v=c If ( cond);~
[0047] 第一前驱指令:b=2*3;
[0048] 第二前驱指令:c=4*5;
[0049] 断言指令的后继指令:u=v;
[0050] 图1示出了传统的通过控制依赖执行条件语句的处理流程。其中:
[0051] 节点101代表第一前驱指令;
[0052] 节点102代表第二前驱指令;
[0053] 节点103代表条件(cond)指令;
[0054] 节点104代表第一断言(cond)指令;
[0055] 节点105代表第二断言(cond)指令;~
[0056] 节点106代表条件语句的后继指令;
[0057] 虚线代表控制依赖;
[0058] 实线代表数据依赖。
[0059] 在图1所示的处理流程中,当条件指令103的结果为真时,会通过条件控制执行第一断言指令104,并将第一断言指令104的结果写回到目的寄存器;之后,根据第一断言指令104的结果执行后继指令106。其中,目的寄存器是用于存储整个条件语句(例如,上述if‑else‑then语句)的结果。
[0060] 当条件指令103的结果为假时,会通过条件控制执行第二断言指令105,并将第二断言指令105的结果写回到目的寄存器;之后,根据第二断言指令105的结果执行后继指令106。
[0061] 由此可见,在图1所示的处理流程中,当条件满的足时,程序沿着一条执行路径执行,而当条件不满足时,就走另一条路径。这种机制简单而通用,但是所有指令的执行都需要等待条件指令103的结果,使得条件指令103成为整个计算机程序的瓶颈,而通过控制来执行相应的指令,也会较为低效。
[0062] 为此,随着多核处理器、流水线处理架构等的不断发展,在现代处理器中,又衍生出图2所示的另一种通过数据依赖执行条件语句的处理流程。
[0063] 在图2所示的处理流程中,不再使用控制依赖,而全部通过数据依赖的方式推进条件语句的执行,即指令不只负责根据源操作数计算新值,还带上目的寄存器的旧值,计算完成后根据条件指令的结果在新值和旧值之间选择一个写到目的寄存器中。
[0064] 其中,第一前驱指令201、第二前驱指令202和条件指令203可以通过流水线(pipeline)并发执行,第一断言指令204的执行依赖于第一前驱指令201和条件指令203;第二断言指令205的执行依赖于第二前驱指令202、条件指令203和第一断言指令204。
[0065] 第一前驱指令201执行完毕后,即可得到第一断言指令204的第一结果(if‑then分支的结果),并将该第一结果保存至重排序缓冲区中,在条件指令203执行完毕得到结果后,再决定是将第一结果提交到目的寄存器中,还是保留目的寄存器中的旧值。具体地,如果条件指令203的结果为真,则将第一结果提交到目的寄存器中;为假,则保留目的寄存器中的旧值。
[0066] 第二前驱指令202执行完毕后,即可得到第二断言指令205的第二结果,并将该第二结果保存至重排序缓冲区中。但由于在第二断言指令205还对第一断言指令204有一个数据依赖,因此,即使在条件指令203执行完毕得到结果后,仍不能立即决定是将第二结果提交到目的寄存器中,还是保留目的寄存器中的旧值,而是要等第一断言指令204执行完毕才可以。待第一断言指令204执行完毕后,目的寄存器中要么保存的是旧值,要么保存的是第一结果。之后,则可以根据第二断言指令205的结果来决定是否将第二结果提交到目的寄存器中。具体地,如果第二断言指令205的结果为真,则将第二结果(else分支的结果)提交到目的寄存器中;为假,则保留目的寄存器中保存的第一结果(if‑then分支的结果)。
[0067] 由此可见,通过数据依赖执行条件语句的处理流程,会同时执行一个条件语句的两条路径:if‑then 分支和else分支,然后再根据条件是否满足从中选取一个结果提交到目的寄存器中。如此,可通过数据依赖替代控制依赖,能更充分地利用处理器的并发特性,使计算性能更高。
[0068] 然而,在图2所示的处理流程中,后继指令206同时依赖第一前驱指令201的执行、第二前驱指令202的执行和条件指令203的计算,导致整个条件语句的执行时间变长,进而影响性能。
[0069] 为此,本申请条件语句的处理方法,对图2所示的处理流程进行了进一步的改进,采用图3或图5所示的处理流程。
[0070] 图3示出了本申请一实施例在条件指令303的结果为假时的处理流程。
[0071] 其中,第一前驱指令301、第二前驱指令302和条件指令303可依旧通过流水线并发执行,当条件指令303得到结果后,如果结果为假,则移除对第一前驱指令301的依赖。
[0072] 如此,当第二前驱指令302执行完毕,即可得到第二断言指令305的第二结果,并将该第二结果保存至重排序缓冲区中;在第二断言指令305得到条件指令303的结果后,无需再等待第一前驱指令301或第一断言指令304执行完毕,而是直接根据条件指令303的结果来决定是否将第二结果提交到目的寄存器中。之后,根据第二断言指令305的结果执行后继指令306。
[0073] 具体地,如果条件指令303的结果为假,则可直接通过第二断言指令305将第二结果提交到目的寄存器中。此时,目的寄存器中保存的是第二断言指令305执行完毕之后,所提交的第二结果(else分支的结果)。
[0074] 图4示出本申请实施例用采图3所示的处理流程执行条件语句的过程,如图4所示,该方法主要包括如下步骤:
[0075] 操作S410,获取条件指令的结果,条件指令用于计算条件语句中的条件;
[0076] 其中,条件语句中的条件通常为一布尔型表达式,在程序未发生异常(Exception)的情况下,其结果非“真”即“假”。“真”代表条件成立,“假”代表条件不成立。
[0077] 操作S420,若条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定条件语句的结果;
[0078] 如前,条件语句在执行时转化为第一断言指令和第二断言指令,第一断言指令用于执行条件为真时对应的操作,第二断言指令用于执行条件为假时对应的操作。
[0079] 每一断言指令里面带了一个分支条件(cond or  cond),在执行时如果分支条件~为真,则执行指令功能,否则执行空操作,相当于不执行任何操作。
[0080] 第一前驱指令为第一断言指令的前驱指令,第二前驱指令为第二断言指令的前驱指令。
[0081] 在图3所示的本申请实施例中,移除对第一前驱指令的依赖主要通过移除第二断言指令305对第一断言指令304的依赖来实现的。
[0082] 移除第二断言指令305对第一断言指令304的依赖,主要指将第二断言指令对第一断言指令的依赖关系移除,该依赖关系可能存储在某个表或某个队列中,可将表或队列中与之对应的表项或记录删除或标记为失效即可。
[0083] 如此,当第二前驱指令302执行完毕,得到第二断言305的第二结果之后,即可将第二结果提交到目的寄存器,而无需等待第一断言指令304的结果。从而可大幅减少指令的相关链,缩短条件指令的执行时间,增大并行性,提升计算性能。
[0084] 图5示出了本申请一实施例在条件指令503的结果为真时的处理流程。
[0085] 其中,第一前驱指令501、第二前驱指令502和条件指令503可依旧通过流水线并发执行,当条件指令503得到结果后,如果结果为真,则移除对第二前驱指令502的依赖。
[0086] 如此,当第一前驱指令501和在第一断言指令504执行完毕之后,可直接根据第一断言指令504的结果来决定是否将第二断言指令505的第二结果提交到目的寄存器中,而无需等待第二前驱指令502的结果。之后,根据第二断言指令505的结果执行后继指令506。
[0087] 具体地,如果第二断言指令505的结果( cond)为假,则不提交任何结果到目的寄~存器中。此时,目的寄存器中保存的是第一断言指令504执行完毕之后,所提交的第一结果(if‑then分支的结果)。
[0088] 本申请实施例采用图5所示处理流程来执行条件语句的过程,如图6所示,主要包括如下步骤:
[0089] 操作S610,获取条件指令的结果,条件指令用于计算条件语句中的条件;
[0090] 操作S620,若条件指令的结果为真,则移除对第二前驱指令的依赖,根据第一前驱指令的结果确定条件语句的结果。
[0091] 在本申请实施例中,移除对第二前驱指令502的依赖是通过移除第二断言指令505对第二前驱指令502的依赖来实现的。移除第二断言指令505对第二前驱指令502的依赖,主要指将第二断言指令505对第二前驱指令502的依赖关系移除,该依赖关系可能存储在某个表或某个队列中,可将表或队列中与之对应的表项或记录删除或标记为失效即可。
[0092] 如此,当第一前驱指令执行完毕得到第一断言指令504的第一结果之后即可将第一结果提交到目的寄存器,而无需等待第二前驱指令。从而可大幅减少指令的相关链,缩短条件指令的执行时间,增大并行性,提升计算性能。
[0093] 此外,在本申请另一些实施例中,还可通过广播总线,将条件指令的结果发送至第一断言指令和第二断言指令。如此,可更为快捷地获取结果,而无需再次重复进行条件(cond)的计算,便可基于条件指令的结果通过复制或求反的方式获取相应的结果,进一步提高计算性能。
[0094] 需要说明的是,在本申请实施例中以if‑then‑else语句作为示例性说明,并非对本申请条件语句的处理方法的实施方式及应用场景的限定。实施者可根据实施需要应用于任何适用的场景,例如,实现switch、case、while、until等选择结构的条件语句等。
[0095] 此外,本申请条件语句的处理方法同样适用于处理器提供的选择性指令,例如csel指令等。
[0096] 进一步地,本申请实施例还提供一种条件语句的处理装置,如图7所示,该装置70包括:条件结果获取模块701,用于获取条件指令的结果,条件指令用于计算条件语句中的条件;条件语句结果确定模块702,用于若条件指令的结果为假,则移除对第一前驱指令的依赖,根据第二前驱指令的结果确定条件语句的结果;其中,条件语句在执行时转化为第一断言指令和第二断言指令,第一断言指令用于执行条件为真时对应的操作,第二断言指令用于执行条件为假时对应的操作,第一前驱指令为第一断言指令的前驱指令,第二前驱指令为第二断言指令的前驱指令。
[0097] 在本申请一实施例中,条件语句结果确定模块702还用于:条件语句结果确定模块还用于:若条件指令的结果为真,则移除对第二前驱指令的依赖,根据第一前驱指令的结果确定条件语句的结果。
[0098] 在本申请一实施例中,条件语句结果确定模块702具体用于:移除第二断言指令对第一断言指令的依赖。
[0099] 在本申请一实施例中,该装置70还包括:条件结果发送模块,用于将条件指令的结果发送至第一断言指令和第二断言指令。
[0100] 在本申请一实施例中,条件结果发送模块具体用于通过广播总线,将条件指令的结果发送至第一断言指令和第二断言指令。
[0101] 需要说明的是,自第一台通用电子计算机问世以来,计算机技术在几十年间取得了飞速的发展,计算机技术的飞速发展得益于计算机体系结构的改进以及计算机生产技术的发展。计算机生产技术对计算机技术的发展的贡献一直是稳定的;然而,由于计算机体系结构经历几十年的改进,使得计算机体系结构的改进空间愈发狭小,因此针对计算机体系结构的任意小的改进都将对处理器的性能和计算机技术的发展带来较明显的影响。
[0102] 根据本申请实施例第三方面,提供一种计算机存储介质,存储介质包括一组计算机可执行指令,当指令被执行时用于执行上述任一项的 方法。
[0103] 这里需要指出的是:以上针对条件语句的处理装置实施例的描述和以上针对计算机存储介质实施例的描述,与前述方法实施例的描述是类似的,具有同前述方法实施例相似的有益效果,因此不做赘述。对于本申请对条件语句处理装置实施例的描述和对计算机存储介质实施例的描述尚未披露的技术细节,请参照本申请前述方法实施例的描述而理解,为节约篇幅,因此不再赘述。
[0104] 需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的流程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种流程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的流程、方法、物品或者装置中还存在另外的相同要素。
[0105] 在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个装置,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
[0106] 上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本申请实施例方案的目的。
[0107] 另外,在本申请各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以利用硬件的形式实现,也可以利用硬件加软件功能单元的形式实现。
[0108] 本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通流程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储介质、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0109] 或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器、或者网络设备等)执行本申请各个实施例方法的全部或部分。而前述的存储介质包括:移动存储介质、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
[0110] 以上,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。