线性求解器的加速方法、存储数据库及GPU系统与流程

文档序号:13343474阅读:386来源:国知局
线性求解器的加速方法、存储数据库及GPU系统与流程

本发明涉及线性计算领域,尤其涉及一种线性求解器的加速方法、存储数据库及图形处理器(graphicsprocessingunit,gpu)系统。



背景技术:

在工业仿真领域,一个常见的问题就是对稀疏线性方程组的求解,例如对方程进行求解,其中:a表示离散矩阵,j表示待求解的向量,b表示离散方程组的源项。

在实际计算的时候,可以将离散矩阵a的对角、上三角和下三角元素分别存储在三个向量中,其中上三角元素与下三角元素共用两个索引向量,用于获取元素在矩阵中的位置。这种存储方式被广泛地应用于工业仿真领域,并且这种存储方式还可以与预处理共轭梯度法(preconditionedconjugategradient,pcg)、预处理双共轭梯度法(preconditionedbi-conjugategradient,pbicg)、几何代数多重网格法(geometric-algebraicaulti-gridsolvers,gamg)等线性求解算法结合,实现相应的线性求解器。

在现有技术中,线性求解的过程中会有大量的线性代数运算,如内积、矩阵向量乘法等,运算量比较大,因此如果将线性求解的全部工作交给cpu去完成,受cpu自身架构的限制,其运算效率会很低,无法满足目前工业仿真的要求。



技术实现要素:

本发明提供了一种线性求解器的加速方法、存储数据库及图形处理器系统,克服了现有技术中线性求解器运算效率低的问题。

本发明实施例提供了一种存储数据库,所述存储数据库包括:

第一存储单元,用于存储网格单元标识;

第二存储单元,用于存储内部面的标识以及与所述内部面标识相对应的内部面数据,所述内部面是连接两个网格单元的平面,映射为同一个网格单元标识的内部面标识所对应的内部面数据存储在所述第二存储单元的相邻存储区域;

索引单元,用于构建并存储所述网格单元标识的索引范围,所述索引范围包含所述网格单元标识与所述内部面标识的映射关系。

优选地,所述网格单元标识用整数表示,所述内部面标识也使用整数表示;两个网格单元通过内部面相连接时,标识小的网格单元是内部面的所有者网格单元,标识大的网格单元是内部面的邻居网格单元。

优选地,所述索引单元,还用于统计内部面标识所对应的网格单元标识,构建网格单元标识与所述内部面标识的对应关系。

优选地,所述索引单元构建的网格单元标识与所述内部面标识的对应关系中还包括所述网格单元标识的索引范围,所述索引范围表示每个网格单元标识所对应的内部面标识个数。

优选地,根据第一存储单元中所存储的网格单元标识查找该网格单元标识所对应的索引范围;根据所述索引范围确定该网格单元标识所对应的内部面标识,将所述第二存储单元中相邻存储区域存储的所述内部面标识所对应的内部面数据全部读取出来。

本发明实施例还提供了一种线性求解器的加速方法,使用前述任一所述的存储数据库,所述方法包括:

gpu将待计算的任务块划分为网格单元,确定所述网格单元的网格单元标识;

根据所述网格单元标识以及所述网格单元的检索范围确定所述网格单元标识所对应的内部面标识,根据所述内部面标识读取与所述内部面标识所对应的内部面数据;

根据所述读取到的内部面数据进行计算。

优选地,所述根据所述网格单元标识以及所述网格单元的检索范围确定所述网格单元标识所对应的内部面标识,根据所述内部面标识读取与所述内部面标识所对应的内部面数据,包括:

gpu根据所述网格单元的标识,从存储数据库中获取所述网格单元标识的索引范围;

根据所述网格单元的索引范围确定所述内部面标识,并根据所述内部面标识确定与所述内部面标识相对应的内部面数据的存储区域,读取所述存储区域内的内部面数据。

优选地,所述加速方法还包括构建存储数据库,具体的:

统计所述待计算任务块的内部面标识所对应的网格单元标识,构建所述网格单元标识与所述内部面标识的对应关系;

将映射为相同网格单元标识的内部面标识所对应的内部面数据保存在所述存储数据库中相邻的存储区域内。

优选地,所述构建的网格单元标识与所述内部面标识的对应关系中还包括所述网格单元标识的索引范围,所述索引范围表示每个网格单元标识所对应的内部面标识个数。

本发明实施例还提供了一种gpu系统,包括前述任一所述的存储数据库。

本发明实施例还提供了一种gpu系统,所述系统包括存储器和处理器,其中:

所述存储器,用于存储代码;

所述处理器,用于执行所述存储器中的代码,执行所述存储器中的代码能实施前述任一所述的方法步骤。

本发明实施例所提供的一种线性求解器的加速方法、存储数据库及图形处理器系统,具有以下有益效果:

本发明实施例所提供的技术方案,利用gpu强大的并行计算能力,将密集的计算任务交给了gpu完成,大幅提升了计算速度;通过mpi接口实现了任务级并行,可以将多个任务分配到多个gpu中,可以更加充分地利用硬件资源;同时将映射为同一个网格单元标识的内部面标识所对应的内部面数据存储在连续的存储区域,便于gpu的读取和访问。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例或现有技术描述汇总所需要使用的附图作简单介绍,显而易见地,下面描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例中gpu并行计算示意图;

图2a是本发明实施例中阻塞式发送/接收流程示意图;

图2b是本发明实施例中非阻塞式发送/接收流程示意图;

图3是本发明实施例中数乘运算示意图;

图4是本发明实施例中优化前cellid和faceid的对应关系示意图;

图5是本发明实施例中网格单元与内部面的结构示意图;

图6是本发明实施例中网格单元与索引的示意图;

图7是本发明实施例中优化后的cellid和faceid的对应关系示意图;

图8是本发明实施例中存储数据库的存储空间优化前后对比示意图;

图9是本发明实施例所提供的存储数据库的结构示意图;

图10是本发明实施例所提供的线性求解器的加速方法的流程示意图;

图11是本发明实施例所提供的gpu系统的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一:

鉴于图形处理器(graphicsprocessingunit,gpu)本身强大的运算能力,在本发明实施例所提供的线性求解器中引入gpu,因此本发明实施例所提供的线性求解器的加速方法可以应用在具有多个图形处理器(graphicsprocessingunit,gpu)的计算环境中。

如图1所示,本发明实施例中可以将计算任务分配到多个gpu上,例如gpu1、gpu2、gpu3和gpu4,多个gpu之间可以通过消息传递接口(messagepassinginterface,mpi)进行通信。通过mpi接口,可以将计算任务进行任务级的并行,充分利用gpu的并行计算能力。在一个优选的方案中,在计算流体力学(computationalfluiddynamics,cfd)领域,当所创建的网格比较大时,往往会把网格划分为多个子域,分别对这些子域分别进行求解,此时使用多个gpu进行并行计算的优势将会呈现。

在本发明实施例中,mpi节点之间的通信采用了非阻塞式的通信方式,如图2b所示,与图2a所示的阻塞式通信不同,非阻塞式通信不用等待数据发送完毕即可开始数据的计算过程。当数据较大时,这种非阻塞式的通信方式可以节省很多没有必要的等待时间,便于提升计算效率。

在本发明实施例中,当待求解方程组的系数矩阵为对称矩阵时,可使用预处理共轭梯度法(preconditionedconjugategradient,pcg)算法进行求解。pcg算法是一种迭代求法,通过循环迭代,不断地更新待求向量j的值,直至残差满足要求。迭代的过程中,会涉及大量的线性代数算法,一些运算可以很自然地直接在数据级上并行化,如内积、数乘、加法。例如在数乘运算中,如图3所示,就通过直接在数据级上并行的方式,将初始向量(如图3上半部分所示)的每个元素乘上α,得到结果向量(如图3下半部分所示)。有些则可以通过改进算法来尽可能地实现并行化,如矩阵与向量的乘法。在这个过程中,使用pcg求解器将系数矩阵与向量相乘的操作则显得尤为耗时。因此,在这个计算过程中可以利用gpu在并行计算上的优势,将这些计算尽可能并行化,并全部交由gpu来完成,待完成迭代后,再将结果传回,从而实现大幅度的性能提升。进一步的,为了保证结果的正确,多个mpi节点还需要相互通信,这样才能求出每步迭代的结果。

在本发明实施例中,针对比较耗时的矩阵与向量的乘法操作,在未优化前:乘法操作中有如下的代码逻辑:

forfaceinrange(0,nfaces)

ax[upperaddr[face]]+=lower[face]*x[loweraddr[face]]

其中变量face(内部面),可以使用faceid(内部面标识)来表示,而upperaddr与loweraddr这两个向量的作用,就是将faceid(内部面标识)映射为cellid(网格单元标识)。lower向量则是用于存储faceid对应的矩阵下三角元素。执行这段代码就可以通过遍历所有的faceid,然后按照需要映射为对应的cellid完成计算。

如图4所示,在这种未优化的方案中,gpu在读取网格单元数据时,会根据映射关系,通过faceid查找对应的cellid。然而实际上,gpu在读取其中一个cellid时,会将该cellid相邻存储区域的cellid数据一并读取出来,并保存在gpu的高速缓存中。如果下一次读取的cellid数据刚好在这个高速缓存中,那么gpu就不需要去执行昂贵的访存操作,而是直接在高速缓存中读取该值。而优化前的方案,每次读取的cellid所在的存储区域往往相隔甚远,gpu所获取到的cellid相邻存储区域的数据往往不具备连续性和关联性,因此下一次读取cellid数据时基本上无法从高速缓存中直接读取,无法有效地利用高速缓存,从而导致gpu读取数据和计算效率低下。

鉴于此,本发明实施例所提供的线性运算器的加速方法,对计算的方法进行了优化,具体的:

首先,对任务块所划分的网格单元进行优化。

一般来说,网格(mesh)可以看作是由点(point)、面(face)和网格单元(cell)所构成的三层结构,其中:点描述了三维空间中的一个位置信息,每个点使用一个数据标签(label)来作为标记;面是一系列点构成的序列,面也通过一个整数标签(label)作为标记,也可以称为faceid;两个网格单元可通过一个内部面(internalface)连接,内部面将在序列中编号小的网格单元视作所有者网格单元(owner),将编号大的网格单元视作邻居网格单元(neighbor),如图5所示。所有者单元与邻居单元的编号,分别可以用loweraddr和upperaddr获取。如图6所示,右上方是一个网格(mesh)的示意图,左图与下图是将网格表示为稀疏系列矩阵的示意图。

其次,对存储内部面数据的存储空间进行优化。

遍历任务块中所有的faceid,确定其与cellid的对应关系,即确认每个cellid所对应的全部faceid,例如cellid1对应n个faceid。

在一个优选的方案中,存储内部面数据的存储空间可以是存储数据库,设置在服务器中,具体的:

如图7所示,存储数据库中存储cellid与faceid的对应关系、faceid所对应的存储区域以及内部面数据,以及cellid的索引范围,其中:gpu可以根据cellid以及cellid的索引范围确定每个cellid所对应的faceid范围,并根据faceid的范围将faceid相邻存储区域内的内部面数据全部读取出来。需要说明的是,gpu在读取数据时,系统会根据设置自动确认faceid的相邻存储区域的区间,并将该区间内的存储区域所存储的内部面数据读取出来,并存储在gpu的高速缓存中。

在本发明实施例中,gpu可以根据cellid的索引范围确定存储数据库上相对应的faceid所对应的内部面数据的存储区域,并从将faceid相邻存储区域内的内部面数据读取出来,存储在gpu的高速缓存中。

在本发明实施例中,在存储数据库的设置上,映射为同一个cellid的faceid所对应的内部面数据存储在相邻的存储区域内,如图8所示,左边为优化后的存储空间,映射为同一个cellid的faceid的数据存储在相邻存储区域,右边为优化前的存储空间,映射为同一个cellid的faceid的数据存储在分散的区域。gpu在读取一个faceid的时候,会把该faceid相邻存储区域的内部面数据一起读入到高速缓存中,等到读取下一个faceid所对应的内部面数据时,会优先从gpu的高速缓存中读取。根据前述存储数据库的设置,gpu在读取cellid的内部面数据时,就已经将faceid相邻存储区域的数据都读取到gpu的高速缓存中,因此下一个faceid的内部面数据可以直接从gpu的高速缓存中读取,而不需要再去数据库中进行读取,提高了数据读取的速度和效率,提高计算效率。在另外一个方案中,如果下一个faceid所对应的内部面数据不在gpu的高速缓存中,则就按照前述方法从存储数据库中获取。

在本发明实施例一个优选的方案中,优化之后的该片段的代码逻辑如下所示:

其中,上述代码中的face,指的就是内部面的faceid,通过upperaddr和lowaddr可以将faceid转化成对应的网格单元的cellid。sumuptr用于存储一个cellid对应的faceid的索引范围,如代码中所示,sumuptr[cell_id]与sumuptr[cell_id+1]就是cellid对应faceid的索引边界,二者一起构成了一个索引范围。在一个优选的方案中,例如cellid1对应n个faceid,则在索引范围中表示为cellid1--[0,n)---(faceid0,faceid1,……faceidn-1),cellid2对应m个faceid,则在索引范围中表示为cellid1--[n,n+m)---(faceidn,faceidn+1,……faceidn+m-1),依次类推。

每个cellid都会对应一个索引范围,原本的faceid则经过排序处理,与索引范围内的每个元素对应。例如:cellid的索引范围是[1,5)(大于等于1,小于5的整数)时,则表示该cellid对应4个faceid存储区域。如此,就可以让cellid根据索引范围,按顺序对应到相应的faceid上。而mapupperptr_l和maplowerptr_u则是将索引范围中的索引值映射为对应的faceid内部面数据值(也即上/下三角的元素值)。在本发明实施例一个优选的方案中,索引范围由系统根据任务块的大小来确定。

在gpu异构并行编程中,对gpu全局存储器的访存操作是相当耗时的,当gpu访问全局存储器时,它总是会一次读写一块数据,而不是单个数据,因此若有多个gpu线程同时访问这块区域的存储器时,gpu就能避免重复的访存操作。这就说明,当gpu的线程读写连续的存储器区域的时候,效率最高,如图8所示,左侧几个线程访问的是连续的存储器区域,因此效率较高,而右侧几个线程则效率较低。

经过重新排序后的存储数据库,将映射为同一个cellid的faceid所对应的内部面数据放置在相邻的存储区域内,这样gpu在读取一个faceid的时候,会把它相邻存储区域的值一起读入到高速缓存中,等到读取下个faceid值的时候,如果这个值已经在高速缓存里了,就不需要访存去读取了,直接在高速缓存中读就好了,这就减少了对内存的访问,因此能够大幅度提升性能。

在本发明实施例中,未优化前,程序需要将faceid映射为cellid,然后对向量的目标位置进行间接的随机访问,但这个映射出的结果显然是非常零散的,因此对内存的存取效率都相当低,在优化之后,本发明实施例反过来使用cellid来映射faceid,且将同一cellid对应的faceid存储在相邻的位置,这就减少了对内存的访问,因此能够大幅度提升性能。进一步的,进行了该优化之后,还可以根据不同的cellid开出不同的线程,利用强大的并行计算能力进行并行计算,进一步地大幅提升性能。

本发明实施例所提供的线性运算器的加速方法正是利用了gpu强大的并行计算能力,将密集的计算任务交给了gpu完成,大幅提升了计算速度。此外,本发明还通过mpi接口实现了任务级并行,可以将多个任务分配到多个gpu中,可以更加充分地利用硬件资源。

实施例二:

为了实现对线性运算器的加速,本发明实施例提供了一种存储数据库,如图9所示,包括:第一存储单元901、第二存储单元903和索引单元902,其中:

第一存储单元901,用于存储网格单元标识(cellid);

第二存储单元903,用于存储内部面的标识(faceid)以及与所述faceid相对应的内部面数据,所述内部面是连接两个网格单元的平面,映射为同一个网格单元标识的内部面标识所对应的内部面数据存储在所述第二存储单元的相邻存储区域;

索引单元902,用于构建并存储所述网格单元标识的索引范围,所述索引范围包含所述网格单元标识与所述内部面标识的映射关系。

在本发明实施例中,将待计算的任务块划分为网格单元,根据系统设置,可以为每个网格单元分配唯一的网格单元标识。

在本发明实施例中,所述网格单元标识用整数表示,例如0、1、2、3……n(n为整数);所述内部面标识也使用整数表示,例如0、1、2、3……m(m为整数);两个网格单元通过内部面相连接时,标识小的网格单元是内部面的所有者网格单元,标识大的网格单元是内部面的邻居网格单元,例如网格单元a(标识为3)和网格单元b(标识是7)连接时,其内部面c的所有者网格单元就是网格单元a,邻居网格单元就是网格单元b。

在本发明实施例中,所述索引单元,还用于统计任务块中所有内部面标识(faceid)所对应的网格单元标识(cellid),构建网格单元标识与所述内部面标识的对应关系。进一步的,所述索引单元构建的网格单元标识与所述内部面标识的对应关系中还包括所述网格单元标识的索引范围,所述索引范围表示每个网格单元标识所对应的内部面标识个数,如图5所示。

在本发明实施例中,gpu在计算时,可以根据第一存储单元中所存储的网格单元标识cellid查找该网格单元标识所对应的索引范围;根据所述网格标识的索引范围确定对应的内部面标识faceid,根据确定的faceid将所述第二存储单元中相邻的存储区域中存储的数据全部读取出来。在一个优选的方案中:

gpu在计算时,根据cellid查找到的索引范围是[2,6)时,则可以在读取faceid时,将该faceid相邻存储区域的内部面数据一并读取出来,存储在gpu的高速缓存中。如果下一次访问的faceid的内部面数据刚好在前述高速缓存空间时,则gpu可以直接在高速缓存中读取,而不需要再次从存储数据库中获得。

在本发明实施例中,由于映射为同一个cellid的faceid所对应的内部面数据存储在存储数据库的相邻存储区域内,这样gpu读取时,会根据cellid的索引范围将映射为同一个cellid的faceid相邻存储区域内的内部面数据尽可能地全部读完,就保证了后续在读取该faceid的内部面数据时,可以直接从gpu的高速缓存中读取,使得计算具有连续性。

在本发明实施例中,为了提高gpu的读取效率,索引范围一般与每个cellid所对应的faceid个数相同,当然在此并不做太多限制,索引范围也可以与faceid的个数存在其他对应方式。

在本发明实施例中,存储数据库设置在服务器上,整个服务器可以看作是gpu系统的一部分,存储数据库也可以设置在gpu或者cpu上。

在本发明实施例中,由于映射为同一cellid的全部faceid所对应的内部面数据均存储在相邻存储区域,这样gpu在读取faceid的内部面数据时,可以尽可能一次读取该cellid所对应的faceid相邻存储区域内的全部数据,将其读入到高速缓存中,这样在读取下一个faceid的内部面数据时,可以直接从gpu的高速缓存中读取,而不需要再到存储数据库中读取,减少了gpu从存储数据库中访问数据的次数,提高计算效率和计算的连续性。

实施例三:

如图10所示,本发明实施例还提供了一种线性求解器的加速方法,使用如实施例一、实施例二所公开的存储数据库和gpu,该方法包括:

1001、gpu将待计算的任务块划分为网格单元,确定所述网格单元的网格单元标识;

例如在cfd计算过程中,将某个任务块的计算任务分配给gpu时,gpu先将任务块划分为网格单元,并根据统一的命名规则,确定该网格单元的标识(cellid);

1003、根据所述网格单元标识(cellid)确定所述网格单元标识所对应的内部面标识(faceid),根据所述内部面标识读取内部面标识所对应的内部面数据;

在计算过程中,根据前述实施例二中的描述,需要先构建存储数据库,该存储数据库中存储cellid、索引范围、faceid以及存储区域的对应的关系,根据前述对应关系,读取网格单元所对应的内部面标识相邻存储区域内的全部数据,例如:

gpu在计算时,根据cellid查找到的索引范围是[3,7]时,则可以将在读取faceid时,将该faceid相邻存储区域内的内部面数据一并读取出来,存储在gpu的高速缓存中。如果下一次访问的faceid的数据刚好在前述高速缓存空间时,则gpu可以直接在高速缓存中读取,而不需要再次从存储数据库中获得。

1005、根据所述读取到的内部面数据进行计算。

在本发明实施例中,所述根据所述网格单元标识确定所述网格单元标识所对应的内部面标识,根据所述内部面标识读取内部面标识所对应的内部面数据,包括:

gpu根据所述网格单元的标识,从存储数据库中获取所述网格单元标识的索引范围;

根据所述网格单元的索引范围确定内部面标识,并根据所述内部面标识确定所述内部面标识所对应的内部面数据的存储区域,读取所述内部面存储区域内的内部面数据。

在本发明实施例中,所述加速方法还包括构建存储数据库,具体的:

统计所述待计算任务块的内部面标识所对应的网格单元标识,构建网格单元标识与所述内部面标识的对应关系;

将映射为相同网格单元标识的内部面标识所对应的内部面数据保存在所述存储数据库中相邻的存储区域内。

在本发明实施例中,所述构建的网格单元标识与所述内部面标识的对应关系中还包括所述网格单元标识的索引范围,所述索引范围表示每个网格单元标识所对应的内部面标识个数。

实施例五:

本发明实施例所提供的gpu系统,可以布置在云端,也可以配置在本地端。

本发明实施例所提供的线性求解器的加速方法的整体或者部分可以通过软件代码的方式进行执行,因此本发明实施例所提供的gpu系统可以包括存储器1101和处理器1102,如图11所示,其中存储器1101可以存储代码,处理器1102用于执行存储器中的代码,执行存储器中的代码可以实施如实施例一、实施例二、实施例三和实施例四所记载的各个方法步骤流程。

应该理解,本发明的各种实施例中,上述各过程中序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

另外,本文中术语“系统”和“网络”在本文中常被可互换使用。本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟是以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所属领域的技术人员可以清楚了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其他的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅是一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或者组件可以结合或者可以继承到一个系统,或者一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或者直接耦合或者通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其他的形式连接。

所述作为分离部件说明的单元可以是或者可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在个单元中。上述集成的单元即可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可以用硬件实现,或者软件实现,或它们的组合方式来实现。当使用软件实现时,可以见上述功能存储在计算机可读介质中或作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是计算机能够存取的任何介质。以此为例但不限于:计算机可读介质可以包括ram、rom、eeprom、cd-rom或其他光盘存储、磁盘介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质。此外,任何连接可以适当的成为计算机可读介质,例如,如果软件是使用同轴电缆、光纤光缆、双绞线、数字用户线(sdl)或者诸如红外线、无线电和微波之类的无线技术包括在所属介质的定影中。如本发明所使用的盘(disk)和碟(disc)包括压缩光碟(cd)、激光碟、光碟、数字通用光碟(dvd)、软盘和蓝光光碟,其中盘通常磁性的复制数据,而碟则用激光来光学的复制数据。上面的组合也应当包括在计算机可读介质的保护范围之内。

总之,以上所述仅为本发明技术方案的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1