具体实施方式
下面将参照附图更详细地描述本公开的优选实施例。虽然附图中显示了本公开的优选实施例,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实施例”和“一个实施例”表示“至少一个示例实施例”。术语“另一实施例”表示“至少一个另外的实施例”。术语“第一”、“第二”等等可以指代不同的或相同的对象。
如前文所描述,传统的计算设备中,通常利用处理图形任务的图形处理器(Graphics Processing Unit, GPU)来计算原本由中央处理器(Central ProcessingUnit,CPU)处理的通用计算任务。容易导致消耗大量的时间(GPU周期,即GPU cycle)与内存带宽(Memory bandwidth),进而降低GPU执行的效率,不利于计算设备整体性能和资源利用率的提升。
以下结合图1说明导致计算设备整体性能和资源利用率的降低的原因。图1示意性示出了传统的计算设备的示意图。如图1所示,计算设备100包括:图形处理器110、中央处理器130和总线140。图形处理器110例如包括命令处理器(Command Processor,CP)112、多个计算单元(Compute Unit,CU)114、DMA/SDMA控制器116、二级缓存118和内存120。中央处理器130例如包括内存132。总线140例如用于连接图形处理器110和中央处理器130,用以传递数据、地址、控制信号等。总线140例如而不限于为快速外设组件互联(PeripheralComponent Interconnect Express,PCI-E)。
一般而言,中央处理器130和图形处理器110适合执行的任务不同。为了有效运用图形处理器110能力,中央处理器130可卸载一系列的装置代码给图形处理器110,该卸载过程例如称为一次卸载(First Offload)。自中央处理器130向图形处理器110卸载装置代码的过程例如包括:中央处理器130在内存132中准备装置代码(Device Code)所需的数据,然后向图形处理器110中的命令处理器112发送命令,以便请求将数据从中央处理器130的内存132复制到图形处理器110中的内存120。命令处理器112例如通过DMA/SDMA控制器116完成内存132至内存120之间的数据复制和存储。中央处理器130把待执行的装置代码发送给图形处理器110,然后发送命令给图形处理器110,以用于启动装置代码的执行。图形处理器110中的计算单元114执行装置代码所指示的任务,从图形处理器110中的内存120读取数据、进行计算、以及将计算结果写入至内存120。当计算单元114执行完装置代码所指示的任务,通过命令处理器112通知中央处理器130装置代码已被执行完毕。中央处理器130接着将图形处理器110中的内存120中的计算结果通过总线140迁移回内存132。上述卸载过程例如称为一次卸载(First Offload)。
图形处理器110被配置为由计算单元114执行所有的装置代码,从而导致计算单元114的工作量庞大,而图形处理器110中的其他组件(如命令处理器112、二级缓存118、DMA/SDMA控制器116等)处于等待闲置状态,进而造成***100的运行效率低下。此外,某些装置代码的任务并不适合交由计算单元114完成,而是适合交由其他组件完成。例如,对于一些装置代码:“图形处理器的内存中数据预取(Preload)到二级缓存(即,Preload Data A toL2)”或者“对***二级缓存的清理(即,Flush L2)”,或者是“对于多片存储于图形处理器的内存中的数据做All-Reduce操作 (即,All-Reduce Data A/B to C)”。以让计算单元114来执行“对***二级缓存的清理(即,Flush L2)”这一装置代码为例,计算单元114需要对每一个地址进行特定的写操作,这需要耗费很多时间,同时阻塞了后续代码的执行。再例如,以由计算单元114来执行“对于多片存储于图形处理器的内存中的数据做All-Reduce操作(即,All-Reduce Data A/B to C)” 这一装置代码为例,这需要把内存数据先读到计算单元114内部,然后做reduce操作,然后再将操作结果写回到内存中去,这需要消耗大量的时间(GPU cycle)与内存带宽(Memory bandwidth),进而影响***100的整体性能。
为了至少部分地解决上述问题以及其他潜在问题中的一个或者多个,本公开的示例实施例提出了一种用于卸载数据的方法、计算设备和计算机可读存储介质。在本公开方法中:通过获取用于定义自图形处理器处执行卸载操作的命令包,以及在同步指令被触发时,通知同步引擎,以便同步引擎通知命令引擎自命令队列获取与同步点相关联的卸载操作命令包;以及基于针对该卸载操作命令包的解析来确定合适的卸载引擎用以执行卸载操作命令包的对应卸载操作,本公开可以根据与同步点对应的卸载操作命令包的解析结果来选择合适的卸载操作执行卸载操作,从而实现将图形处理器处的目标数据卸载至图形处理器处内部组件或外部组件执行(这种卸载被称为 “二次卸载”,或者称为“反向卸载”),而不必仅由计算单元114执行所有的装置代码,因此,利于计算设备整体性能和资源利用率的提升。图2示出了用于实施根据本公开的实施例的用于卸载数据的方法的计算设备200的示意图。如图2所示,计算设备200包括:图形处理器210、中央处理器230、总线240、特殊应用集成电路(Application Specific Integrated Circuit,ASIC)250、现场可编程逻辑阵列260(Field Programmable Gate Array,FPGA).在一些实施例中,计算设备200还包括加速器(未示出)等其他组件。图形处理器210例如包括命令引擎212、多个计算单元214、DMA/SDMA控制器216、二级缓存218、内存220、同步引擎222。中央处理器230例如包括内存232。计算设备200配置有设备供货商标识和设备标识。计算设备200可以实现前文的反向卸载。例如,计算设备200根据设备供货商标识和设备标识来确定合适的卸载数据的方法以用于自图形处理器卸载数据至图形处理器210中的内部组件(例如,卸载至DMA/SDMA控制器216、二级缓存218中的一个组件)或者图形处理器210的外部组件(例如,卸载至中央处理器230、特殊应用集成电路250、现场可编程逻辑阵列260中的一个组件)。上述执行对应卸载操作的卸载引擎图形处理器210中的内部组件或者外部组件在后文中被统称为卸载引擎。
计算设备200为了实现反向卸载来提升整体性能和资源利用率,本公开在图形处理器210中配置了同步引擎222和命令引擎212,同时通过配置了命令队列中的命令包或者同步数据信息来定义自图形处理器处卸载数据的卸载操作,以便在多个卸载引擎中确定用于执行对应卸载操作(即反向卸载操作)的卸载引擎。
关于同步引擎,在一些实施例中,其用于实现反向卸载之前的同步,以及在反向卸载执行完毕之后使得同步等待结束,以便代码的继续执行。具体而言,例如,如果与同步点对应的同步指令被触发,通知同步引擎,以便同步引擎通知命令引擎同步点已经达到,进而使得命令引擎自命令队列获取与同步点相关联的卸载操作命令包。另外,当同步引擎被通知对应卸载操作已被完成,通知程序核与同步点相关联的等待结束,以便程序核继续执行代码。在另一些实施例中,同步引擎除了执行反向卸载前后的上述同步之外,还用于基于同步操作信息确认用于执行对应卸载操作的卸载引擎。例如,同步引擎基于同步点,获取同步操作信息中的、与同步点相关联的卸载操作类型和卸载操作的目标数据;以及同步引擎基于卸载操作类型,确定用于执行与同步点相关联的对应卸载操作的卸载引擎。
关于命令引擎,在一些实施例中,其用于确定用于执行与同步点相关联的对应卸载操作的卸载引擎。例如,命令引擎根据同步引擎的通知自命令队列获取与同步点相关联的卸载操作命令包;以及命令引擎解析与同步点相关联的卸载操作命令包,以便确定用于执行卸载操作命令包的对应卸载操作的卸载引擎。在另一些实施例中,命令引擎用于发送同步操作信息,不再参与卸载引擎的确定,而是由同步引擎基于同步操作信息中的卸载操作类型,确定用于执行与同步点相关联的对应卸载操作的卸载引擎。
以下结合图3和图4说明用于卸载数据的方法300。图3示出了根据本公开的一些实施例的用于卸载数据的方法300的流程图。图4示出了根据本公开的一些实施例的用于卸载数据的方法的示意图。应当理解,方法300例如可以在图2所描述的计算设备200处执行。应当理解,方法300还可以包括未示出的附加组成部分、动作和/或可以省略所示出的组成部分、动作,本公开的范围在此方面不受限制。
在步骤302处,向命令队列发送命令包,命令包用于定义自图形处理器处卸载数据的卸载操作,命令包至少指示同步点和与同步点相关联的卸载操作命令包。例如,软件程序生成命令包后向图4所示的命令队列440发送所生成的命令包。
关于命令包,其用于定义用于自图形处理器处卸载数据(即反向卸载)的卸载操作。命令包例如是驱动程序基于编译器所提供的信息而生成的。该命令包至少指示同步点、与同步点相关联的卸载操作命令。卸载操作命令包例如可以指示与同步点相关联卸载操作类型和卸载操作的目标数据。卸载操作类型包括:卸载引擎标识和卸载操作号标识。以下结合表一说明卸载命令包所指示的信息。
在上述表一中,“Sync Counter #1”、“Sync Counter #2”和“Sync Counter #3”代表不同的同步点。关于卸载操作类型,其例如包括:卸载引擎标识和卸载操作号标识。例如,如表一所示, 32BIT的卸载操作类型包括两部分,一部分是卸载引擎标识(8bit)例如“0x0200”,另一部分为卸载操作号标识(24bit),例如“0002”。卸载引擎标识用于定义与同步点相关联的对应卸载操作适于交由哪个卸载引擎执行。卸载操作的目标数据例如指示对应卸载操作所使用的数据。
上述表一所指示的命令包的信息例如定义了:对于同步点“Sync Counter #1”,对应卸载操作在第二卸载引擎执行其第2个操作,卸载操作的目标数据为数据A。对于同步点“Sync Counter #2”,对应卸载操作在第一卸载引擎执行其第2个操作,卸载操作的目标数据为数据B和数据C。对于同步点“Sync Counter #3”,对应卸载操作在第三卸载引擎执行其第4个操作,卸载操作的目标数据为数据B。
命令队列440中所包括的命令包中所指示的同步点的数量和顺序与程序核450中代码452所关联的同步点的数量和顺序是对应一致的。由此,在程序核450执行与同步点对应的同步指令时,在命令队列440中可以唯一地找到与该同步点对应的卸载操作命令包,以用于在后续步骤中命令引擎针对该卸载操作命令包进行解析,以便确定用于执行对应卸载操作的卸载引擎。
在步骤304处,响应于与同步点对应的同步指令被触发,通知同步引擎。
在一些实施例中在响应于与同步点对应的同步指令被触发通知同步引擎之前,程序核450执行代码452,以触发与同步点所对应的同步指令,代码所配置的同步点的数量和顺序与命令包所指示的同步点的数量和顺序对应一致。例如,图4中的程序核450执行代码,执行至同步点“Sync Counter #1”时,触发同步点“Sync Counter #1”所对应的同步指令。如果确定与同步点“Sync Counter #1”对应的同步指令被触发,通知同步引擎460。
在步骤306处,同步引擎通知命令引擎同步点已经达到,以便命令引擎自命令队列获取与同步点相关联的卸载操作命令包。例如,图4所示的命令引擎462获取与同步点“SyncCounter #1”相关联的卸载操作命令包“Operation<OP1>”。
在步骤308处,命令引擎解析与同步点相关联的卸载操作命令包,以便确定用于执行卸载操作命令包的对应卸载操作的卸载引擎。其中,确定用于执行卸载操作命令包的对应卸载操作的卸载引擎包括:命令引擎基于由卸载操作命令包所解析出的卸载引擎标识和卸载操作号标识,在多个卸载引擎中确定用于执行卸载操作命令包的对应卸载操作的卸载引擎。所确定的、用于执行对应卸载操作的卸载引擎为图形处理器的组件和中央处理器中的一个。
例如,图4所示的命令引擎462解析与同步点“Sync Counter #1”相关联的卸载操作命令包“Operation<OP1>”,进而解析出卸载引擎标识和卸载操作号标识,命令引擎462可以基于所解析出卸载引擎标识,在多个卸载引擎464中确定出与同步点“Sync Counter #1”相关联的命令包的对应卸载操作是在第二卸载引擎364-2处执行其第2个操作。
关于卸载引擎,其用于执行卸载操作命令包的对应卸载操作。每一个卸载引擎具有对应的卸载引擎标识。在一些实施例中,计算设备可以包括多个卸载引擎,卸载引擎可以是图形处理器处的各组件(例如)、也可以是图形处理器外的组件,例如CPU。不同的卸载操作交由不同的卸载引擎执行时,其执行效率可能存在差异,即不同的卸载引擎适于执行不同的卸载操作类型。在一些实施例中,卸载引擎执行对应卸载操作的方式可以是异步的。
在上述方案中,通过在同步指令被触发时,通知同步引擎以便同步引擎通知命令引擎自命令队列获取与同步点相关联的卸载操作命令包;以及基于针对卸载操作命令包的解析结果来确定合适的卸载引擎用以执行对应卸载操作,因此便于让GPU的内部或外部组件并发的参与到GPU代码任务的卸载与执行,因此能够显著降低执行时间。同时,作为GPU最重要的计算单元CU可以集中处理最擅长的纯计算任务中,有利于减少对于内存带宽的占用,以及做不适合任务所使用的计算时间,因此有利于提升执行效率,降低执行时间。因此,本公开能够利于计算设备整体性能和资源利用率的提升。
在上述方案中,同步引擎例如用于在反向卸载执行之前进行同步,以及在卸载引擎执行完对应的卸载操作之后,通知程序核(Kernel)继续执行后续代码操作。
通过采用上述手段,可以使得GPU内部的所有模块或者外部模块都并发的参与到GPU代码任务的执行逻辑中,因此提高了并发度,降低了执行时间。同时,作为GPU最重要的计算单元CU可以集中处理器最为擅长的纯计算任务,因此,本公开能够有显著减少对于内存带宽的占用,提升执行效率,以及降低执行时间。
另外,传统执行GPU任务卸载,由于有些任务必须要在CPU执行,需要把GPU任务切分得很小,例如,一个GPU任务做完后,CPU需要接着做后续任务,因此,在CPU和GPU之间需要反复交互,比如从CPU启动GPU的装置代码任务下发,以及等待GPU执行完毕,再往前进行。这种频繁的CPU启动GPU任务、等待GPU任务的交互会导致降低执行效率。通过采用上述手段,利于减少CPU与GPU之间的反复交互。以前需要多个装置代码分开执行的逻辑可以一次性提交,由同步引擎驱动。这样,省掉反复的CPU与GPU之间的任务提交与等待,可以显著地提高支援利用率。
在一些实施例中,方法300还包括:经由同步或者所确定的卸载引擎通知,所述命令引擎确定所述对应卸载操作被执行完毕;命令引擎通知同步引擎对应卸载操作已被完成;以及同步引擎通知程序核与同步点相关联的等待结束,以便程序核继续执行代码。
图4示出了根据本公开的实施例的用于卸载数据的方法400的示意图。应当理解,方法400还可以包括未示出的附加组成部分、动作和/或可以省略所示出的组成部分、动作,本公开的范围在此方面不受限制。
在步骤402,软件程序生成命令包后向命令队列440发送所生成的命令包,启动程序核450执行代码(例如执行代码“kernel A”)。命令包指示同步点和与同步点相关联的卸载操作命令包,卸载操作命令包例如定义了卸载操作类型和卸载操作的目标数据。
在步骤404,程序核450执行代码452 (例如执行代码“kernel A”),触发同步点(例如“Sync Counter #1”)所对应的同步指令。
在步骤406,如果确定与同步点(例如“Sync Counter #1”)对应的同步指令被触发,通知同步引擎460。同时在代码处等待。
在步骤408,同步引擎460通知命令引擎462同步点(例如“Sync Counter #1”)已经达到。
在步骤410,命令引擎462通知在命令队列440中的等待结束。
在步骤412,命令引擎462自命令队列440获取与同步点(例如“Sync Counter #1”)相关联的卸载操作命令包(例如“Operation <op1>”)。
在步骤414,命令引擎462解析与同步点相关联的卸载操作命令包444,以便确定用于执行卸载操作命令包的对应卸载操作的卸载引擎。例如,命令引擎462基于卸载操作命令包 “Operation <op1>”解析处卸载操作类型和卸载操作的目标数据,在多个卸载引擎464(例如第一卸载引擎 464-1至第N卸载引擎 464-N)中选择用于执行卸载操作命令包的对应卸载操作的卸载引擎(例如是第二卸载引擎 464-2)。
在步骤416,如果所确定的卸载引擎464完成对应卸载操作,通知命令引擎462。命令引擎462可以是以异步的方式被卸载引擎464通知已经完成对应卸载操作(例如图4中以虚线指示该416步骤可以为异步的)。在一些实施例中,命令引擎可以经由同步而获知对应卸载操作已被卸载引擎464执行完成,不需要步骤416的卸载引擎464通知完成对应卸载操作,可以直接执行步骤418。
在步骤418,命令引擎462通知同步引擎460对应卸载操作已被完成。
在步骤420,同步引擎460通知程序核450与同步点(例如“Sync Counter #1”)相关联的等待结束,以便程序核450继续执行代码452。
上述方法400主要包括三个阶段:在用于将任务向外卸载之前的进行同步、执行反向卸载操作、以及在卸载操作被执行完毕时通知程序核继续执行后续代码。在执行反向卸载操作阶段,需要确定将卸载操作交由合适的卸载引擎进行执行。在上述方法400。同步引擎仅仅负责同步,由命令引擎解析卸载操作命令包以确定将对应卸载操作交由合适的卸载引擎进行执行。
以下结合图5和图6说明另一些实施例的用于卸载数据的方法500。图5示出了根据本公开的另一些实施例的用于卸载数据的方法500的流程图。应当理解,方法500例如可以在图2所描述的计算设备200处执行。应当理解,方法500还可以包括未示出的附加组成部分、动作和/或可以省略所示出的组成部分、动作,本公开的范围在此方面不受限制。
在步骤502处,命令引擎发送同步操作信息,同步操作信息用于定义自图形处理器处卸载数据的卸载操作,同步操作信息至少指示同步点和与同步点相关联的卸载操作类型和卸载操作的目标数据。例如,如图6所示,命令引擎662发送程序核的代码644和同步操作信息642,代码644被配置有一个或者多个同步点。
关于同步操作信息,其例如是为由编译器所产生的同步操作表。同步操作表所指示的信息例如如前文表一所示。在此,不再赘述。
关于卸载操作类型,其例如用于指示由哪个卸载引擎执行对应的反向卸载操作。卸载操作类型例如包括卸载引擎标识和卸载操作号标识。卸载引擎标识例如用于定义与同步点相关联的对应卸载操作适于交由哪个卸载引擎执行。卸载操作的目标数据例如指示对应卸载操作所使用的数据。
在步骤504处,响应于确定与同步点对应的同步指令被触发,通知同步引擎。例如,如图6所示,程序核640执行代码644,以触发与同步点所对应的同步指令;确定与同步点对应的同步指令被触发,通知同步引擎660。
在步骤506处,同步引擎基于同步点,获取同步操作信息中的、与同步点相关联的卸载操作类型和卸载操作的目标数据。例如,图6中同步引擎660根据同步点(例如“SyncCounter #1”)查找同步操作表表中对应于该同步点(例如“Sync Counter #1”)的反向卸载操作的卸载操作类型和卸载操作的目标数据。
在步骤508处,同步引擎基于卸载操作类型,确定用于执行与同步点相关联的对应卸载操作的卸载引擎。例如,同步引擎660基于卸载引擎标识和卸载操作号标识,在多个卸载引擎664中确定一个卸载引擎,以用于执行与同步点相关联的对应卸载操作,多个卸载引擎例如包括图形处理器中的组件(例如,DMA/SDMA控制器、二级缓存等)和外部组件(例如,中央处理器、特殊应用集成电路、现场可编程逻辑阵列等)中的至少两个。
通过采用上述手段,本公开可以使得GPU内部的所有模块或者外部模块都并发的参与到GPU代码任务的执行逻辑中,以及使得作为GPU最重要的计算单元CU可以集中处理器最为擅长的纯计算任务,因此不仅提高了并发度、降低了执行时间,而且能够显著减少对于内存带宽的占用,提升执行效率,以及降低执行时间。
另外,在上述方案中,通过使得同步引擎执行同步和确定反向卸载操作交由哪个卸载引擎,而不需要命令引擎的参与卸载引擎的确定,本公开的执行效率更高,能够更加方便且灵活地处理更加复杂的卸载操作。
在一些实施例中,方法500还包括:经由同步或者所确定的卸载引擎通知,所述命令引擎确定所述对应卸载操作被执行完毕;以及同步引擎通知程序核与同步点相关联的等待结束,以便程序核继续执行代码。
图6示出了根据本公开的另一些实施例的用于卸载数据的方法500的示意图。应当理解,方法600还可以包括未示出的附加组成部分、动作和/或可以省略所示出的组成部分、动作,本公开的范围在此方面不受限制。
步骤602,命令引擎662从编译器(未示出)中读取并发送程序核的代码644和同步操作信息表642到硬件640,以便启动程序核执行代码644,同步操作信息表642指示同步点(例如“Sync Counter #1”)和与同步点相关联的卸载操作类型和卸载操作的目标数据。
在步骤604,程序核执行代码644,以便触发同步点所对应的同步指令,通知同步引擎660,同时在代码处等待。
在步骤606,同步引擎660根据同步点(例如“Sync Counter #1”),查找同步操作信息表中的与同步点相关联的卸载操作类型和卸载操作的目标数据。
在步骤608,同步引擎660根据同步操作信息表中与同步点相关联的卸载操作类型,在多个卸载引擎664(例如第一卸载引擎 664-1、第二卸载引擎664-2至第N卸载引擎664-N)中选择用于执行对应卸载操作的卸载引擎(例如是第一卸载引擎664-1)并向其发出卸载操作请求,以便所选择的卸载引擎完成对应卸载操作后通知同步引擎660(例如步骤610所指示)。
在步骤612,同步引擎通知程序核与同步点(例如“Sync Counter #1”)相关联的等待结束,以便程序核继续执行代码644。例如,程序核继续执行后续代码,直到触发下一个同步点(例如“Sync Counter #2”)所对应的同步指令。
在方法600中,同步引擎执行同步和确定执行反向卸载的卸载引擎,而不需要命令引擎的参与卸载引擎的确定,本公开的执行效率更高,能够更加方便且灵活地处理更加复杂的卸载操作。
图7示出了根据本公开的另一些实施例的用于卸载数据的方法700的示意图。应当理解,方法700还可以包括未示出的附加组成部分、动作和/或可以省略所示出的组成部分、动作,本公开的范围在此方面不受限制。
在步骤702,获取计算设备的设备供货商标识和设备标识,计算设备包括图形处理器和中央处理器。
在步骤704,如果确定设备供货商标识为预定标识并且设备标识属于第一预定集合,执行方法300卸载数据的方法以用于自图像处理器处卸载数据。
在步骤706,如果确定设备供货商标识为预定标识并且设备标识属于第二预定集合,执行方法500卸载数据的方法,以用于自图像处理器处卸载数据。
通过采用上述技术手段,本公开能够根据计算设备的硬件配置,确定与硬件配置相匹配的卸载数据的方法,以便计算设备更为显著地提升执行效率,以及降低功耗。
上文所描述的各个过程和处理,例如方法300至700,可由计算设备处执行。该计算设备例如包括:至少一个处理器(至少一个图形处理器和至少一个中央处理器);以及与至少一个处理器通信连接的存储器;其中存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行。在一些实施例中,300至700,可被实现为计算机软件程序,其被有形地包含于机器可读介质。在一些实施例中,计算机程序的部分或者全部可以经由ROM和/或通信单元而被载入和/或安装到计算设备上。当计算机程序被加载到RAM并由GPU和CPU执行时,可以执行上文描述的方法300至700,的一个或多个动作。
本公开可以是方法、装置、***和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。这里参照根据本公开实施例的方法、装置(***)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的中央处理单元,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的中央处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
附图中的流程图和框图显示了根据本公开的多个实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本申请中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本申请公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本申请保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本申请的精神和原则之内所作的修改。