电力矩阵LU分解加速方法、装置、设备及存储介质与流程

未命名 10-18 阅读:285 评论:0

电力矩阵lu分解加速方法、装置、设备及存储介质
技术领域
1.本发明涉及电力系统高性能计算技术领域,具体涉及电力矩阵lu分解加速方法、装置、设备及存储介质。


背景技术:

2.随着电力系统的发展,电网变得越来越复杂。为了实时确保电力系统的安全稳定,电力系统模型必须能够处理这种增加的复杂性。因此,为了确保电力系统的高效日常运行,需要更有效的建模和减少计算时间。然而,如何降低电力系统仿真的时间成本是一个难题。稀疏线性代数方程组的求解是电力系统仿真工具中不可或缺的模块之一。lu分解主要用于稀疏线性代数方程组的求解,其中,lu分解是矩阵分解的一种,是指将稀疏矩阵a分解为下三角稀疏矩阵l和上三角稀疏矩阵u的乘积,即a=lu。l和u矩阵与前向和后向替换一起使用,以获得最终解。lu分解是稀疏直接求解器的关键模块之一,通常在电力稀疏线性代数方程组的求解时间中占主导地位。因此,lu分解成为电力系统仿真的关键部分。
3.作为高性能计算领域的一项新兴技术,gpu(graphics processing unit,图形处理器)因其在单个芯片上拥有数百到数万个内核的高级经济高效配置而显示出极其优越的加速性能,远大于多核cpu。目前高性能计算正在被广泛应用于仿真领域,如电力系统仿真、神经网络仿真和集成电路仿真,包括最优潮流、潮流、瞬态稳定性模拟、和应急分析等应用中。尽管gpu具有上述优点,但由于涉及固有的数据依赖性和不规则的存储器访问模式,在gpu中并行化稀疏矩阵lu因子分解并不是一个简单的过程。在利用gpu进行lu分解时的模式选择只能通过固定阈值进行划分,而不能根据矩阵特性,对gpu资源进行灵活调整。
4.因此,亟需一种电力矩阵lu分解加速方法,能够充分利用gpu上的各种资源,从而提高稀疏矩阵lu分解在gpu上的计算速度。


技术实现要素:

5.有鉴于此,本发明提供了一种电力矩阵lu分解加速方法、装置、设备及存储介质,以解决在利用gpu对电力矩阵进行lu分解时由于无法根据矩阵特性,对gpu资源进行合理调整,造成电力矩阵lu分解速度慢,效率低的问题。
6.第一方面,本发明提供了一种电力矩阵lu分解加速方法,包括:
7.根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列;
8.根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流;
9.通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。
10.本发明提供的电力矩阵lu分解加速方法,通过对电力矩阵进行分层,以及根据分
层后每个层级的列数量,确定对应层级中每一列的处理单元以及其处理单元的数量,从而对对应层级中的每一列采取预设数量的处理单元并行执行lu分解,能够根据电力矩阵特性,对gpu资源进行灵活调整,从而达到提高电力矩阵lu分解在gpu上的计算速度的目的。
11.在一种可选的实施方式中,所述根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量,包括:
12.如果对应层级的列数量大于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda线程或者cuda线程束,根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量;所述cuda线程或者cuda线程束用于对对应列的子矩阵进行lu分解;
13.如果对应层级的列数量小于或者等于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda流,根据对应层级的列数量以及对应层级的下一层级的列数量,确定对应层级中每一列的cuda流的数量;所述cuda流用于对对应列的子矩阵进行lu分解。
14.本发明提供的电力矩阵lu分解加速方法,根据矩阵特性选择对应的处理单元,以及其处理单元数量,能够充分利用gpu的计算资源,以达到提高lu分解的计算速度。
15.在一种可选的实施方式中,所述根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量,包括:
16.如果对应层级的列数量大于第一数值,则根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置;所述第一数值由可用线程数量确定;
17.如果对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值,则将对应层级中每列的cuda线程束的数量设置为预设值;所述第二数值小于所述第一数值;
18.如果对应层级的列数量小于或者等于第二数值,并且列数量大于或者等于第三数值,则根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置;所述第三数值小于所述第二数值,所述第三数值为流多处理器数量。
19.本发明提供的电力矩阵lu分解加速方法,在对应层级的列数量大于第一数值时,根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置;在对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值,则将对应层级中每列的cuda线程束的数量设置为预设值;以及对应层级的列数量小于或者等于第二数值,并且列数量大于或者等于第三数值,则根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置,充分考虑到矩阵的特性,并根据矩阵特性对gpu资源进行灵活调整,实现了提高电力矩阵lu分解在gpu上的计算速度。
20.在一种可选的实施方式中,所述根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置,包括:
21.如果对应层级的平均子矩阵大小小于所述预设线程数,则对该层级中每列的cuda线程的数量设置为所述平均子矩阵大小。
22.在一种可选的实施方式中,所述根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置,包括:
23.24.其中,wrap
num
表示对应层级中每列的cuda线程束的数量,total_th表示可用线程数量,wrap
thread
表示每个cuda线程束中线程的数量,level_sizei表示对应层级的列数量,θ表示调节参数,avgsubmatdimi表示对应层级的平均子矩阵大小,maxwrap表示cuda线程束的最大数量,所述cuda线程束中包含预设线程数的cuda线程。
25.在一种可选的实施方式中,所述根据对应层级的列数量以及对应层级的下一层级的列数量,确定对应层级中每一列的cuda流的数量,包括:
26.如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量不为阈值时,则确定对应层级中每一列的cuda流的数量为阈值。
27.在一种可选的实施方式中,所述方法还包括:
28.如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量为阈值时,则为对应层级中每一列设置第一cuda流和第三cuda流,为对应层级的下一层级中每一列设置第二cuda流;
29.当利用第一cuda流对对应层级的每一列进行l矩阵更新处理、子矩阵的第一列更新处理后,使用第二cuda流对对应层级的下一层级中每一列进行l矩阵更新处理、子矩阵的第一列更新处理;并再次使用第一cuda流对对应层级的每一列进行剩余子矩阵的更新处理;之后使用第三cuda流对对应层级的每一列进行临时向量重置处理。
30.本发明提供的电力矩阵lu分解加速方法,通过将由一个cuda流负责l矩阵更新处理、子矩阵的第一列更新处理,以及通过第一cuda流、第二cuda流和第三cuda流计算列数量为1的多个连续层级,能够大大节省每个步骤所使用的时间,从而达到提高lu分解的计算速度。
31.第二方面,本发明提供了一种电力矩阵lu分解加速装置,包括:
32.矩阵分层模块,用于根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列;
33.处理单元确定模块,用于根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流;
34.lu分解模块,用于通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。
35.第三方面,本发明提供了一种计算机设备,包括:存储器和处理器,存储器和处理器之间互相通信连接,存储器中存储有计算机指令,处理器通过执行计算机指令,从而执行上述第一方面或其对应的任一实施方式的电力矩阵lu分解加速方法。
36.第四方面,本发明提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机指令,计算机指令用于使计算机执行上述第一方面或其对应的任一实施方式的电力矩阵lu分解加速方法。
附图说明
37.为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前
提下,还可以根据这些附图获得其他的附图。
38.图1是根据本发明实施例中关于数据依赖性的示意图;
39.图2是根据本发明实施例中关于电力稀疏矩阵数据存储的示意图;
40.图3是根据本发明实施例的一电力矩阵lu分解加速方法的流程示意图;
41.图4是根据本发明实施例中电力矩阵层级划分的示意图;
42.图5是根据本发明实施例的另一电力矩阵lu分解加速方法的流程示意图;
43.图6是根据本发明实施例中关于列数量为阈值的连续层级进行计算的一种具体应用场景的示意图;
44.图7是根据本发明实施例中关于列数量为阈值的连续层级进行计算的另一种具体应用场景的示意图;
45.图8是根据本发明实施例的电力矩阵lu分解加速装置的结构框图;
46.图9是本发明实施例的计算机设备的硬件结构示意图。
具体实施方式
47.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
48.gpu因其在单个芯片上拥有数百到数万个内核的高级经济高效配置而显示出极其优越的加速性能,远大于多核cpu。目前高性能计算正在被广泛应用于仿真领域,如电力系统仿真、神经网络仿真和集成电路仿真,包括最优潮流、潮流、瞬态稳定性模拟、和应急分析等应用中。尽管gpu具有上述优点,但由于涉及固有的数据依赖性和不规则的存储器访问模式,在gpu中并行化稀疏矩阵lu因子分解并不是一个简单的过程。
49.其中,通过图1对上述“固有的数据依赖性”进行说明:在利用gpu进行lu分解时,数据0会和第k列的数据1、数据2、数据3相乘,从而更新第j列的数据4、数据5以及数据6;所以只有当第k列计算完成后,才能用第k列的值更新第j列,这是存在先后顺序的,称这种关系为数据依赖。
50.其中,通过图2对上述“不规则的存储器访问模式”进行说明:电力稀疏矩阵是非常稀疏的,因此在存储时为了节省空间通常采用稀疏压缩存储,稀疏压缩存储又分为行稀疏压缩存储和列压缩稀疏存储,图2给出了列压缩稀疏存储,即:可以将第0列到第6列中的值按照列的顺序排列为1-2-1-3-5-6-7-9-1-3-4-4-8-5,每个值所在位置的行索引是指其值对应的行数,例如6所在位置的行索引为2,即6在原矩阵中的第2列第2行。
51.利用gpu对电力矩阵进行lu分解中的模式选择通过固定的阈值来划分,过于僵硬,并不能根据矩阵特性,灵活调整对gpu资源的利用。其中,“模式选择”是指对矩阵进行分层,根据每层的大小选择使用小块模式、大块模式、流模式三种模式中的一种进行计算,例如层级大小》固定阈值1,使用小块模式;固定阈值2《层级大小《=固定阈值1,使用大块模式;层级大小《=固定阈值2,使用流模式;对所有矩阵都使用固定阈值1、固定阈值2这两个阈值,而且每个模式下资源的设置是固定的。
52.为了充分利用gpu上的各种资源,提高稀疏矩阵lu分解在gpu上的计算速度,本专
利设计了一种基于gpu的电力矩阵稀疏lu分解加速方法。
53.根据本发明实施例,提供了一种电力矩阵lu分解加速方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
54.在本实施例中提供了一种电力矩阵lu分解加速方法,可用于gpu的控制单元中,图3是根据本发明实施例的电力矩阵lu分解加速方法的流程图,如图3所示,该流程包括如下步骤:
55.步骤s101,根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列。
56.具体地,在利用gpu对电力矩阵进行分解之前,会根据依赖关系对矩阵进行分层,如图4所示:图4上面的矩阵是根据图2中的矩阵根据依赖关系填充后的,灰色标注的是填充的部分,层级处理得到矩阵中每列所在的层级lev_idx,例如第0层级中包含1列,分别是电力矩阵的第0列;第1层中包含1列,是电力矩阵的第1列;第2层中包含1列,是电力矩阵的第2列;第3层中包含2列,是电力矩阵的第3、5列;第4层中包含1列,是电力矩阵的第4列;第5层中包含1列,是电力矩阵的第6列;每个层级的起始地址数组lev_ptr,例如lev_ptr[0]=0为第0层级的起始列,lev_ptr[1]=1为第1层级的起始列,lev_ptr[2]=2为第2层级的起始列,...,lev_ptr[5]=6为第5层级的起始列,lev_ptr[6]=7为最后一个层级的结束列。
[0057]
步骤s102,根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量。
[0058]
具体地,列数量表示对应层级中列的数量,如图4所示,第0层级的列数量为1,第1层级的列数量为1,第2层级的列数量为1,第3层级的列数量为2,第4层级的列数量为1,第5层级的列数量为1。
[0059]
具体地,所述多个处理单元包括cuda线程、cuda线程束或者cuda流。其中,cuda流指的是由主机发出的在一个设备中执行的cuda操作序列。cuda流各个操作的次序是由主机控制的,按照主机发布的次序执行。
[0060]
具体地,可以根据每个层级的列数量,确定该层级中每一列的目标处理单元是cuda线程或者cuda线程束,还是cuda流;以及确定出每一列对应的cuda线程、cuda线程束,或者cuda流的数量。在同一层级中,使用相同数目的cuda线程、cuda线程束或者cuda流对每一列的子矩阵进行lu分解,即l矩阵更新处理、子矩阵更新处理以及临时向量重置处理。
[0061]
步骤s103,通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。
[0062]
具体地,通过上述步骤s102可以确定每个层级中每一列的目标处理单元,以及其目标处理单元的预设数量;然后利用与每一列对应的预设数量的目标处理单元,对该列的子矩阵进行lu分解,例如:电力矩阵a分层后得到层级1、层级2和层级3,每个层级包含3个列;其中,通过上述步骤s102确定出层级1中的列1的目标处理单元为cuda线程束,预设数量为3,则可以利用3个cuda线程束对层级1的列1的子矩阵进行lu分解;同理,按照上述流程对每个层级的每个列的子举证进行lu分解。
[0063]
具体地,所述电力矩阵的lu分解是按照层级进行的,并且每个层级中的所有列并
行进行lu分解。
[0064]
在本实施例中提供了一种电力矩阵lu分解加速方法,可用于gpu的控制单元中,包括步骤s201至步骤s204:
[0065]
步骤s201,根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列。详细请参见图1所示实施例的步骤s101,在此不再赘述。
[0066]
步骤s202,根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流。
[0067]
具体地,上述步骤s202包括步骤s2021至步骤s2024,如图5所示:
[0068]
步骤s2021,如果对应层级的列数量大于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda线程或者cuda线程束。
[0069]
具体地,流多处理器数量可以用dynstream表示,可以通过以下公式确定流多处理器数量:
[0070]
dynstream=min(max(β
×
avgsubmatdim,μ),maxstream)
[0071]
其中,dynstream表示流多处理器数量,avgsubmatdim表示对应层级的列数量在(1,maxstream]范围的所有列子矩阵维度的平均值,β=0.3,μ=4,maxstream表示流多处理器的最大数量。
[0072]
步骤s2022,根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量;所述cuda线程或者cuda线程束用于对对应列的子矩阵进行lu分解。
[0073]
具体地,通过gpu的可用线程的总数,以及对应层级中列的数量对对应层级中每一列的cuda线程或cuda线程束的数量进行设置。
[0074]
在一些可选的实施方式中,上述步骤s2022包括步骤a1、步骤a2和步骤a3,具体如下:
[0075]
步骤a1,如果对应层级的列数量大于第一数值,则根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置;所述第一数值由可用线程数量确定。
[0076]
具体地,第一数值可以为其中a是指调节参数,可以为2;total_thread是指gpu中可用线程的总数;wrap
thread
是指cuda线程的数量为32的线程束。
[0077]
当对应层级的列数量lev_sizei大于第一数值,即时,可以根据对应层级的平均子矩阵大小和预设线程数,对对应层级中每列的cuda线程的数量进行设置。
[0078]
在一些可选的实施方式中,上述步骤a1包括步骤b1,具体如下:
[0079]
步骤b1,如果对应层级的平均子矩阵大小小于所述预设线程数,则对该层级中每列的cuda线程的数量设置为所述平均子矩阵大小。
[0080]
具体地,通过以下公式对步骤b1进行说明:
[0081]
thread
num
=min(avgsubmatdimi,wrap
thread
)
[0082]
其中,thread
num
表示层级中每列的cuda线程的数量;avgsubmatdimi表示平均子矩阵大小,可以理解为:层级中每一列具有一个子矩阵,同一层级中的所有子矩阵的平均维度大小表示平均子矩阵大小;wrap
thread
表示一个线程束中cuda线程的数量,默认为32。
[0083]
通过以下实例对上述步骤b1进行说明:第i层级的平均子矩阵维度为18,则可以将第i层级中每列的cuda线程的数量设置为min(18,32)=18,在这一层级计算完成后,假设第i+1个层级的平均子矩阵维度为14,则可以将第i+1层级中每列的cuda线程的数量调整为min(14,32)=14。
[0084]
步骤a2,如果对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值,则将对应层级中每列的cuda线程束的数量设置为预设值;所述第二数值小于所述第一数值。
[0085]
具体地,通过以下公式对上述步骤a2进行说明:
[0086][0087]
其中,表示第一数值,表示第二数值,lev_sizei表示对应层级的列数量;
[0088]
当对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值时,可以将对应层级中每列的cuda线程束的数量设置为4,即4*32=128个cuda线程。
[0089]
步骤a3,如果对应层级的列数量小于或者等于第二数值,并且列数量大于或者等于第三数值,则根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置;所述第三数值小于所述第二数值,所述第三数值为流多处理器数量。
[0090]
具体地,可以通过以下公式对步骤a3进行说明:
[0091][0092]
其中,wrap
num
表示对应层级中每列的cuda线程束的数量,total_thread表示gpu中可用线程的数量,wrap
thread
表示一个cuda线程束中cuda线程的数量(默认为32),level_sizei表示对应层级的列数量,θ表示调节参数,可以为1,avgsubmatdimi表示对应层级的平均子矩阵大小,maxwrap表示cuda线程束的最大数量,所述cuda线程束中包含预设线程数的cuda线程。
[0093]
步骤s2023,如果对应层级的列数量小于或者等于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda流。
[0094]
步骤s2024,根据对应层级的列数量以及对应层级的下一层级的列数量,确定对应层级中每一列的cuda流的数量;所述cuda流用于对对应列的子矩阵进行lu分解。
[0095]
在一些可选的实施方式中,上述步骤s2024包括步骤c1和步骤c2,具体如下:
[0096]
步骤c1,当对应层级的列数量为阈值,并且对应层级的下一层级的列数量不为阈值时,则确定对应层级中每一列的cuda流的数量为阈值。其中,该阈值可以为1。
[0097]
具体地,当层级中仅有一个列时,可以使用一个cuda流作为处理单元,来负责这个列的lu分解,即l矩阵更新处理、子矩阵更新处理和临时向量重置处理。其中,一列计算的三个步骤l矩阵更新处理、子矩阵更新处理和临时向量重置处理按顺序提交给同一个cuda流,每个cuda流按顺序执行上述3个步骤。同一层级的多个列通过使用不同的流进行并行处理。其中,l矩阵更新处理是指把当前正在计算的列对角线之下的值除以对角线的值,并且把这些值存储到一个临时向量里;子矩阵更新处理是指根据u的第k行和l的第k列的非零值更新第k列的子矩阵;临时向量重置处理是指将l更新处理时存储到临时向量的值设置为0。
[0098]
步骤c2,如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量为阈值时,则为对应层级中每一列设置第一cuda流和第三cuda流,为对应层级的下一层级中每一列设置第二cuda流;其中,上述阈值可以为1。
[0099]
当利用第一cuda流对对应层级的每一列进行l矩阵更新处理、子矩阵的第一列更新处理后,使用第二cuda流对对应层级的下一层级中每一列进行l矩阵更新处理、子矩阵的第一列更新处理;并再次使用第一cuda流对对应层级的每一列进行剩余子矩阵的更新处理,之后使用第三cuda流对对应层级的每一列进行临时向量重置处理。
[0100]
具体地,在列数量为1的多个连续级别中,下一级别的列是上一级别的子矩阵的第一列。在上一级完成子矩阵中第一列的更新后,可以启动下一级的计算,如图6,s1表示l矩阵的列更新、s2表示子矩阵更新中第一列更新、s3表示子矩阵剩余列更新、s4表示层级占用的临时向量进行重置。测试了每个步骤的时间,发现主要时间基本上集中在s3(子矩阵剩余列更新)这一步,这一步的时间基本上都大于s1(即l矩阵的列更新)和s2(子矩阵更新中第一列更新)两步的时间之和,为了减少核函数调用的数目,我们将s1(l矩阵的列更新)和s2(子矩阵更新第一列更新)合并在一起执行,如图7所示。
[0101]
通过以下具体实施例,对步骤c2进行说明:
[0102]
使用第一cuda流、第二cuda流和第三cuda流实现流水线模式,利用将核函数放到默认流中时,默认流所有之后的操作都会被阻塞,默认流计算完成之后继续执行后续操作的特性完成流水线模式的设计,具体过程如下:
[0103]
step1:对遇到的第一个列数量为1的层级i,使用默认流对该层级中的列进行l矩阵的更新,并对子矩阵的第一列进行更新。
[0104]
step2:判断下一个层级是否是大小为1的层级,如果是大小为1的层级则进如step3;否则,跳到step7。
[0105]
step3:使用stream0对第i+1个层级中的列进行l矩阵的更新并对子矩阵的第一列进行更新。
[0106]
step4:使用默认流对第i个层级中的列进行剩余子矩阵的更新。
[0107]
step5:使用stream1对第i个层级占用的临时向量进行重置。
[0108]
step6:i=i+1,回到步骤2。
[0109]
step7:使用默认流对第i个层级中的列进行剩余子矩阵的更新。
[0110]
step8:使用默认流对第i个层级占用的临时向量进行重置。
[0111]
其中,默认流可以为第一cuda流,stream0可以为第二cuda流,stream1可以为第三cuda流。
[0112]
步骤s203,分别对对应层级中的每一列采取预设数量的处理单元并行执行lu分
解。详细请参见图1所示实施例的步骤s103,在此不再赘述。
[0113]
在一些优选的实施例中,所述方法还包括:
[0114]
考虑到当使用cudamemcpy函数执行数据从主机到设备和设备到主机的拷贝,由于该函数是同步执行函数,在未完成数据的转移操作之前会锁死并一直占有cpu进程的控制权。在主机和设备进行数据传输的过程中,后面的操作要等待前面的数据传输完成才开始,这会阻塞主机上后续操作。本发明对多个主机和设备之间的数据传输采用异步的方式,使计算和数据传输异步进行,而不是等数据传输完再做计算,由此隐藏数据传输带来的时间延迟,加快lu分解速度。
[0115]
技术效果:
[0116]
1、本发明根据每个层级的列数量,确定对应层级中每一列的处理单元,以及其处理单元的数量,能够根据矩阵的特征选择要使用的模式,充分利用gpu计算资源,提高lu分解的计算速度。
[0117]
2、本发明中根据对应层级的列数量以及下一层级的列数量,确定对应层级中每一列的cuda流的数量,能够根据子矩阵维度动态确定要使用的cuda流的数量,提高lu分解的计算速度。
[0118]
3、本发明通过使用流水线(第一cuda流、第二cuda流和第三cuda流)加速列数量为1的连续层级的计算,提高lu分解的计算速度。
[0119]
4、本发明通过异步并行优化数据传输,减少数据传输带来的计算延迟,提高lu分解的计算速度。
[0120]
在本实施例中还提供了一种电力矩阵lu分解加速装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
[0121]
本实施例提供一种电力矩阵lu分解加速装置,如图8所示,包括:
[0122]
矩阵分层模块501,用于根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列。
[0123]
处理单元确定模块502,用于根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流。
[0124]
lu分解模块503,用于通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。
[0125]
在一些可选的实施方式中,处理单元确定模块502包括:
[0126]
线程确定单元,用于的那元如果对应层级的列数量大于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda线程或者cuda线程束。
[0127]
线程数量确定单元,用于根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量;所述cuda线程或者cuda线程束用于对对应列的子矩阵进行lu分解。
[0128]
流确定单元,用于如果对应层级的列数量小于或者等于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda流。
[0129]
流数量确定单元,用于根据对应层级的列数量以及对应层级的下一层级的列数量,确定对应层级中每一列的cuda流的数量;所述cuda流用于对对应列的子矩阵进行lu分解。
[0130]
在一些可选的实施方式中,线程数量确定单元包括:
[0131]
第一线程数量确定子单元,用于如果对应层级的列数量大于第一数值,则根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置;所述第一数值由可用线程数量确定。
[0132]
第二线程数量确定子单元,用于如果对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值,则将对应层级中每列的cuda线程的数量设置为预设阈值;所述第二数值小于所述第一数值。
[0133]
第三线程数量确定子单元,用于如果对应层级的列数量小于或者等于第二数值,并且列数量大于或者等于第三数值,则根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程的数量进行设置;所述第三数值小于所述第二数值,所述第三数值为流多处理器数量。
[0134]
在一些可选的实施方式中,第一线程数量确定子单元还用于:如果对应层级的平均子矩阵大小小于所述预设线程数,则对该层级中每列的cuda线程的数量设置为所述平均子矩阵大小。
[0135]
在一些可选的实施方式中,第三线程数量确定子单元还用于通过以下公式对该层级中每列的cuda线程束的数量进行设置:
[0136][0137]
其中,wrap
num
表示对应层级中每列的cuda线程束的数量,total_thread表示可用线程数量,wrap
thread
表示每个cuda线程束中线程的数量,level_sizei表示对应层级的列数量,θ表示调节参数,avgsubmatdimi表示对应层级的平均子矩阵大小,maxwrap表示cuda线程束的最大数量,所述cuda线程束中包含预设线程数的cuda线程。
[0138]
在一些可选的实施方式中,流数量确定单元包括:
[0139]
第一流数量确定子单元,用于如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量不为阈值时,则确定对应层级中每一列的cuda流的数量为阈值。
[0140]
在一些可选的实施方式中,装置还包括:
[0141]
第二流数量确定子单元,用于如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量为阈值时,则为对应层级中每一列设置第一cuda流和第三cuda流,为对应层级的下一层级中每一列设置第二cuda流;
[0142]
当利用第一cuda流对对应层级的每一列进行l矩阵更新处理、子矩阵的第一列更新处理后,使用第二cuda流对对应层级的下一层级中每一列进行l矩阵更新处理、子矩阵的第一列更新处理;并再次使用第一cuda流对对应层级的每一列进行剩余子矩阵的更新处理,之后使用第三cuda流对对应层级的每一列进行临时向量重置处理。
[0143]
上述各个模块和单元的更进一步的功能描述与上述对应实施例相同,在此不再赘述。
[0144]
本发明实施例还提供一种计算机设备,具有上述图8所示的电力矩阵lu分解加速
装置。
[0145]
请参阅图9,图9是本发明可选实施例提供的一种计算机设备的结构示意图,如图9所示,该计算机设备包括:一个或多个处理器10、存储器20,以及用于连接各部件的接口,包括高速接口和低速接口。各个部件利用不同的总线互相通信连接,并且可以被安装在公共主板上或者根据需要以其它方式安装。处理器可以对在计算机设备内执行的指令进行处理,包括存储在存储器中或者存储器上以在外部输入/输出装置(诸如,耦合至接口的显示设备)上显示gui的图形信息的指令。在一些可选的实施方式中,若需要,可以将多个处理器和/或多条总线与多个存储器和多个存储器一起使用。同样,可以连接多个计算机设备,各个设备提供部分必要的操作(例如,作为服务器阵列、一组刀片式服务器、或者多处理器系统)。图9中以一个处理器10为例。
[0146]
处理器10可以是中央处理器,网络处理器或其组合。其中,处理器10还可以进一步包括硬件芯片。上述硬件芯片可以是专用集成电路,可编程逻辑器件或其组合。上述可编程逻辑器件可以是复杂可编程逻辑器件,现场可编程逻辑门阵列,通用阵列逻辑或其任意组合。
[0147]
其中,所述存储器20存储有可由至少一个处理器10执行的指令,以使所述至少一个处理器10执行实现上述实施例示出的方法。
[0148]
存储器20可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储根据计算机设备的使用所创建的数据等。此外,存储器20可以包括高速随机存取存储器,还可以包括非瞬时存储器,例如至少一个磁盘存储器件、闪存器件、或其他非瞬时固态存储器件。在一些可选的实施方式中,存储器20可选包括相对于处理器10远程设置的存储器,这些远程存储器可以通过网络连接至该计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0149]
存储器20可以包括易失性存储器,例如,随机存取存储器;存储器也可以包括非易失性存储器,例如,快闪存储器,硬盘或固态硬盘;存储器20还可以包括上述种类的存储器的组合。
[0150]
该计算机设备还包括通信接口30,用于该计算机设备与其他设备或通信网络通信。
[0151]
本发明实施例还提供了一种计算机可读存储介质,上述根据本发明实施例的方法可在硬件、固件中实现,或者被实现为可记录在存储介质,或者被实现通过网络下载的原始存储在远程存储介质或非暂时机器可读存储介质中并将被存储在本地存储介质中的计算机代码,从而在此描述的方法可被存储在使用通用计算机、专用处理器或者可编程或专用硬件的存储介质上的这样的软件处理。其中,存储介质可为磁碟、光盘、只读存储记忆体、随机存储记忆体、快闪存储器、硬盘或固态硬盘等;进一步地,存储介质还可以包括上述种类的存储器的组合。可以理解,计算机、处理器、微处理器控制器或可编程硬件包括可存储或接收软件或计算机代码的存储组件,当软件或计算机代码被计算机、处理器或硬件访问且执行时,实现上述实施例示出的方法。
[0152]
虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所
限定的范围之内。

技术特征:
1.一种电力矩阵lu分解加速方法,其特征在于,包括:根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列;根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流;通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。2.根据权利要求1所述的方法,其特征在于,所述根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量,包括:如果对应层级的列数量大于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda线程或者cuda线程束,根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量;所述cuda线程或者cuda线程束用于对对应列的子矩阵进行lu分解;如果对应层级的列数量小于或者等于流多处理器数量,则确定对应层级中每一列的目标处理单元为cuda流,根据对应层级的列数量以及对应层级的下一层级的列数量,确定对应层级中每一列的cuda流的数量;所述cuda流用于对对应列的子矩阵进行lu分解。3.根据权利要求2所述的方法,其特征在于,所述根据可用线程数量和对应层级的列数量,确定对应层级中每一列的cuda线程或者cuda线程束的数量,包括:如果对应层级的列数量大于第一数值,则根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置;所述第一数值由可用线程数量确定;如果对应层级的列数量小于或者等于第一数值,并且所述列数量大于第二数值,则将对应层级中每列的cuda线程束的数量设置为预设阈值;所述第二数值小于所述第一数值;如果对应层级的列数量小于或者等于第二数值,并且列数量大于或者等于第三数值,则根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置;所述第三数值小于所述第二数值,所述第三数值为流多处理器数量。4.根据权利要求3所述的方法,其特征在于,所述根据对应层级的平均子矩阵大小和预设线程数,对该层级中每列的cuda线程的数量进行设置,包括:如果对应层级的平均子矩阵大小小于所述预设线程数,则对该层级中每列的cuda线程的数量设置为所述平均子矩阵大小。5.根据权利要求3或4所述的方法,其特征在于,所述根据可用线程数量、对应层级的列数量和平均子矩阵大小,对该层级中每列的cuda线程束的数量进行设置,包括:其中,wrap
num
表示对应层级中每列的cuda线程束的数量,total_thread表示可用线程数量,wrap
thread
表示每个cuda线程束中线程的数量,level_size
i
表示对应层级的列数量,θ表示调节参数,avgsubmatdim
i
表示对应层级的平均子矩阵大小,maxwrap表示cuda线程束的最大数量,所述cuda线程束中包含预设线程数的cuda线程。6.根据权利要求2所述的方法,其特征在于,所述根据对应层级的列数量以及对应层级
的下一层级的列数量,确定对应层级中每一列的cuda流的数量,包括:如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量不为阈值时,则确定对应层级中每一列的cuda流的数量为阈值。7.根据权利要求6所述的方法,其特征在于,所述方法还包括:如果对应层级的列数量为阈值,并且对应层级的下一层级的列数量为阈值时,则为对应层级中每一列设置第一cuda流和第三cuda流,为对应层级的下一层级中每一列设置第二cuda流;当利用第一cuda流对对应层级的每一列进行l矩阵更新处理、子矩阵的第一列更新处理后,使用第二cuda流对对应层级的下一层级中每一列进行l矩阵更新处理、子矩阵的第一列更新处理;并再次使用第一cuda流对对应层级的每一列进行剩余子矩阵的更新处理,之后使用第三cuda流对对应层级的每一列进行临时向量重置处理。8.一种电力矩阵lu分解加速装置,其特征在于,包括:矩阵分层模块,用于根据电力矩阵中列与列之间的依赖关系,对所述电力矩阵进行分层处理,得到多个层级;所述层级中包含一个或多个列;处理单元确定模块,用于根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;所述列数量表示对应层级中列的数量,所述多个处理单元包括cuda线程、cuda线程束或者cuda流;lu分解模块,用于通过各个层级中与每一列对应的预设数量的目标处理单元,对对应列进行lu分解。9.一种计算机设备,其特征在于,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行权利要求1至7中任一项所述的电力矩阵lu分解加速方法。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机指令,所述计算机指令用于使计算机执行权利要求1至7中任一项所述的电力矩阵lu分解加速方法。

技术总结
本发明涉及电力系统高性能计算技术领域,公开了电力矩阵LU分解加速方法、装置、设备及存储介质,方法包括:根据电力矩阵中列与列之间的依赖关系,对电力矩阵进行分层处理,得到多个层级;层级中包含一个或多个列;根据每个层级的列数量,从多个处理单元中确定对应层级中每一列的目标处理单元,以及每一列的目标处理单元的预设数量;列数量表示对应层级中列的数量,多个处理单元包括CUDA线程、CUDA线程束或者CUDA流;分别对对应层级中的每一列采取预设数量的目标处理单元


技术研发人员:史存存 林龙 杨訸 黄远平 申屠磊璇
受保护的技术使用者:国网浙江省电力有限公司电力科学研究院 国家电网有限公司
技术研发日:2023.07.06
技术公布日:2023/10/11
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐