一种基于多节点多GPU计算的流线模拟加速方法与流程

文档序号:17858330发布日期:2019-06-11 22:42阅读:287来源:国知局

本发明涉及流线数值模拟领域,特别是指一种基于多节点多gpu并行计算质点追踪算法以实现流线模拟的加速方法



背景技术:

流线模拟技术不仅为地下水研究提供形象、直观的地下水运动态信息,以研究周围水文特征,而且为油藏工程井间示踪测试提供油层特性和开采动态信息,方便更好的开采油气。pollock在地下水流动的研究中提出一种半解析的流线模拟方法,即质点追踪算法,该算法因其灵活性和普适性而被广泛应用。在实际应用工程中,当研究区域很大时,流线规模为数百万条,普通机器运行时间漫长,不能满足工程应用对数据结果实时性的需求。

传统的cpu并行加速框架受限于cpu的计算核心数,且cpu的计算能力低于gpu的计算能力。并且单个计算机上的gpu数量受机器卡槽数量的限制,因而所获得的加速效果受到限制。



技术实现要素:

本发明实施例的目的在于提供一种基于多节点多gpu并行计算质点追踪算法实现流线模拟的加速方法。用以解决传统cpu模拟计算大规模流线速度缓慢的问题。本发明实施例具有占地面积小、造价低并且加速效果明显的优点。

为解决上述技术问题,本发明提供技术方案如下:

本发明提供一种基于多节点多gpu并行计算质点追踪算法实现流线模拟的加速方法,其特征在于,所述方法同时运行在多个计算机或服务器上,且每个计算机或服务器带有若干个gpu,所述方法,包括:

步骤1:主进程(0号进程)负责将区域模型离散化为若干个网格,初始化模型的基本信息、含水层参数和速度矢量公式中的各个系数,完成网格划分,实现进程间的负载均衡;

步骤2:广播模型的基本信息、含水层参数、速度矢量公式中的各个系数和子模型大小到其他进程;

步骤3:分布在多个服务器上的每个进程调用具有唯一标志的gpu卡号,在该gpu上创建流、开辟gpu内存,将gpu计算所需参数从cpu拷贝到gpu全局内存中。

步骤4:每个gpu调用多个gpu线程并行计算若干网格g(ix,iy,iz)的物理坐标p(x,y,z),开始进行质点追踪过程;

步骤5:根据速度矢量的计算公式,计算质点的流速vp(vx,vy,vz);

步骤6:如果遇到边界条件,如驻点,则向前或向后追踪过程结束,且执行步骤7,否则,根据流速计算质点移动时间,并得到质点的下一个位置。此时,完成一次向前或向后追踪。将新的位置作为当前质点坐标,继续执行步骤5。

步骤7:依次连接单个gpu线程计算得到的坐标点,即可组成了一条完整的流线。单个gpu的所有线程计算完毕,将gpu计算结果从gpu传输到该进程的cpu内存中。

步骤8:gpu传输成功后,利用mpi集合通信机制实现进程间的数据传输,将各个进程的计算结果汇总到主进程上。最后对无效结果数据进行处理后输出到结果文件中。

进一步的,所述步骤1中,给定计算区域投影到x-y平面上的长度lx和宽度ly,含水层重要参数εx、εy、α、β,以及计算速度矢量的公式中的系数矩阵bmn,将区域模型离散化为网格模型,然后完成模型划分,实现进程间的负载均衡。

进一步的,所述步骤2中,广播模型的基本信息、含水层参数、速度矢量公式中的各个系数和子网格大小到其他进程;

进一步的,所述步骤3中,分布在多个服务器上的每个进程调用具有唯一标志的gpu卡号,在该gpu上创建流、开辟gpu内存,将gpu计算所需参数从cpu拷贝到gpu全局内存中。

进一步的,所述步骤4中,每个gpu调用多个gpu线程同时计算若干网格g(ix,iy,iz)的物理坐标p(x,y,z),然后开始进行质点追踪过程;

进一步的,所述步骤5包括:

速度矢量的计算公式:

公式(1)、(2)、(3)中,εx、εy、α、β是含水层重要参数,bmn是系数矩阵,lx、ly是计算区域投影到x-y平面后的长度和宽度,xp、yp和zp的计算公式如下:

公式(4)中,x、y、z是质点的物理坐标。公式(5)中,zmn表示水头分布的特征函数,其计算公式如下:

wmn表示垂直流速的的特征函数,如公式(6)所示。

公式(5)和公式(6)中,λmn由公式(7)计算而来。

进一步的,所述步骤6包括:

边界条件为:z>0或者

若不满足边界条件,则根据下列公式(8)向前或向后跟踪一步得到质点的新位置:

公式(8)中,dir的取值为1或-1,1表示向前追踪一步,-1表示向后追踪一步,δt表示一个时间步长。

进一步的,所述步骤7中,使用cuda的拷贝函数,将gpu计算结果从gpu传回到cpu上。

进一步的,所述步骤8中,使用mpi的集合通信mpi_gather函数实现进程间的数据传输,将各个进程的计算结果汇总到主进程上。最后对无效结果数据进行处理后输出到结果文件中。

进一步的,所述步骤1中,基于mpi并行技术,设置多个进程,分布在多个服务器上,实现进程级的并行。

进一步的,所述步骤3中,基于cuda平台的并行技术,调用cudasetdevice()、cudastreamcreate()、cudamalloc()、cudamemcpyasync()等函数实现指定负责计算的gpu卡号、创建流、开辟gpu内存和完成cpu与gpu之间数据传输等操作。

进一步的,所述步骤3中,将最常使用的参数载入读取速度最快的寄存器中;将数据量最大且读取不频繁的数据载入容量最大但读取速度慢的全局内存中;将固定不变的参数载入读取速度最快且运行期间只读的常量内存中;将读取位置在逻辑上比较靠近且读取频繁的数据载入纹理内存中。

进一步的,所述步骤4中,基于cuda并行架构,调用在gpu上执行的kernel函数,实现进程内线程级并行。每个进程均设定线程块block和块内线程thread的数量,即设定并行加速的gpu总线程数量,实现线程级并行;

本发明具有以下有益效果:

本发明针对质点追踪算法实现流线模拟的大规模应用程序进行并行化处理,实现了程序基于多节点多gpu的并行计算,并获得极大的加速效果。

附图说明

图1为本发明实施例1提供的程序流程图。

图2为本发明实施例1提供的流线模拟和区域网格化示意图;

图3为本发明实施例1提供的cuda线程模式与gpu存储模式示意图;

图4为本发明实施例1的实验结果图;

具体实施方式

为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。

本发明提供一种基于多节点多gpu并行计算质点追踪算法实现流线模拟的加速方法,如图1~4所示,基于多节点多gpu计算的流线模拟加速方法同时运行在多个计算机或服务器上,且每个计算机或服务器带有若干个gpu,该加速方法,包括:

步骤1:主进程(0号进程)负责将区域模型离散化为若干个网格,初始化模型的基本信息、含水层参数和速度矢量公式中的各个系数,完成网格划分,实现进程间的负载均衡;

步骤2:广播模型的基本信息、含水层参数、速度矢量公式中的各个系数和子网格大小到其他进程;

步骤3:分布在多个服务器上的每个进程调用具有唯一标志的gpu卡号,在该gpu上创建流、开辟gpu内存,将gpu计算所需参数从cpu拷贝到gpu全局内存中。

步骤4:每个gpu调用多个gpu线程同时计算若干网格g(ix,iy,iz)的物理坐标p(x,y,z),然后开始进行质点追踪过程;

步骤5:根据速度矢量的计算公式,计算质点的流速vp(vx,vy,vz);

步骤6:如果遇到边界条件,如驻点,则向前或向后追踪过程结束,且执行步骤7,否则,根据流速计算质点移动时间,并得到质点的下一个位置。此时,完成一次向前或向后追踪。将新的位置作为当前质点坐标,继续执行步骤5。

步骤7:依次连接单个gpu线程计算得到的坐标点,即可组成了一条完整的流线。单个gpu的所有线程计算完毕,将gpu计算结果从gpu传输到该进程的cpu内存中。

步骤8:gpu传输成功后,利用mpi集合通信机制实现进程间的数据传输,将各个进程的计算结果汇总到主进程上。最后对无效结果数据进行处理后输出到结果文件中。

本发明的有益效果在于:

本发明针对质点追踪算法实现流线模拟的大规模应用程序进行并行化处理,实现了程序基于多节点多gpu的并行计算,并获得极大的加速效果。

进一步的,所述步骤1中,给定计算区域投影到x-y平面上的长度lx和宽度ly,含水层重要参数εx、εy、α、β,以及计算速度矢量的公式中的系数矩阵bmn,将区域模型离散化为网格模型,然后完成模型划分,实现进程间的负载均衡。

进一步的,所述步骤2中,广播模型的基本信息、含水层参数、速度矢量公式中的各个系数和子网格大小到其他进程;

优选的,所述步骤3中,分布在多个服务器上的每个进程调用具有唯一标志的gpu卡号,在该gpu上创建流、开辟gpu内存,将gpu计算所需参数从cpu拷贝到gpu全局内存中。

进一步的,所述步骤4中,每个gpu调用多个gpu线程同时计算若干网格g(ix,iy,iz)的物理坐标p(x,y,z),然后开始进行质点追踪过程;

优选的,所述步骤5包括:

速度矢量的计算公式:

公式(1)、(2)、(3)中,εx、εy、α、β是含水层重要参数,bmn是系数矩阵,lx、ly是计算区域投影到x-y平面后的长度和宽度,xp、yp和zp的计算公式如下:

公式(4)中,x、y、z是质点的物理坐标。公式(5)中,zmn表示水头分布的特征函数,其计算公式如下:

wmn表示垂直流速的的特征函数,如公式(6)所示。

公式(5)和公式(6)中,λmn由公式(7)计算而来。

进一步的,所述步骤6包括:

边界条件为:z>0或者

若不满足边界条件,则根据下列公式(8)向前或向后跟踪一步得到质点的新位置:

公式(8)中,dir的取值为1或-1,1表示向前追踪一步,-1表示向后追踪一步,δt表示一个时间步长。

进一步的,所述步骤7中,使用cuda的拷贝函数,将gpu计算结果从gpu传回到cpu上。

进一步的,所述步骤8中,使用mpi的集合通信mpi_gather函数实现进程间的数据传输,将各个进程的计算结果汇总到主进程上。最后对无效结果数据进行处理后输出到结果文件中。

所述步骤1中,基于mpi并行技术,设置多个进程,分布到多个服务器上,实现进程级的并行。

所述步骤3中,基于cuda平台的并行技术,调用cudasetdevice()、cudastreamcreate()、cudamalloc()、cudamemcpyasync()等函数实现指定负责计算的gpu卡号、创建流、开辟gpu内存和完成cpu与gpu之间数据传输等操作。

所述步骤3中,将最常使用的参数载入读取速度最快的寄存器中;将数据量最大且读取不频繁的数据载入容量最大但读取速度慢的全局内存中;将固定不变的参数载入读取速度最快且运行期间只读的常量内存中;将读取位置在逻辑上比较靠近且读取频繁的数据载入纹理内存中。

所述步骤4中,基于cuda并行架构,调用在gpu上执行的kernel函数,实现进程内线程级并行。每个进程均设定线程块block和块内线程thread的数量,即设定并行加速的gpu总线程数量,实现线程级并行;

基于mpi+cuda混合技术实现cpu-gpu异构编程,利用多台服务器上的多个gpu,从而实现了更多gpu实现并行加速,进一步加快了计算速度。

本发明中,充分利用gpu各种不同存储结构的特点优化数据读取方式,将最常使用的参数载入读取速度最快的寄存器中;将数据量最大且读取不频繁的数据载入容量最大但读取速度慢的全局内存中;将固定不变的参数载入读取速度最快且运行期间只读的常量内存中;将读取位置在逻辑上比较靠近且读取频繁的数据载入纹理内存中。

实施例1:

下面通过一个实施例对本发明进行进一步描述,在盆地地下水流线模拟过程中,盆地区域投影到x-y平面的长度为20000米,宽度为10000米,盆地最大深度为8000米,含水层参数分别为0、0、1、1,系数矩阵b={{40,0,10,0},{20,0,0,0},{10,0,0,0},{0,0,0,0}},理想步长为6米。对此区域的具体流线模拟的加速过程如图1所示。

步骤1:主进程(0号进程)将lx×ly×lz的三维地下水区域离散化为nx×ny×nz个网格,分别表示行数、列数和层数。其中,lx=20000,ly=10000,lz=8000,离散后nx=101、ny=201、nz=81。含水层参数分别为α=0、β=0、εx=1、εy=1。系数矩阵b取值为:b={{40,0,10,0},{20,0,0,0},{10,0,0,0},{0,0,0,0}};,在y方向按块换分方式对网格模型进行均匀划分为n份,n为总进程的数量。

步骤2:使用mpi_bcast通信函数广播模型的基本信息、含水层参数、速度矢量公式中的各个系数和子网格大小到其他进程;

步骤3:分布在多个服务器上的每个进程调用具有唯一标志的gpu卡号,在该gpu上创建流、开辟gpu内存,将gpu计算所需参数从cpu拷贝到gpu全局内存中。

步骤4:每个gpu调用多个gpu线程同时计算若干网格g(ix,iy,iz)的物理坐标p(x,y,z),然后开始进行质点追踪过程;

步骤5:计算当前质点所在位置p(x,y,z)的流速,根据以下计算公式求解速度在不同方向上的分量vx、vy、vz:

公式(1)、(2)、(3)中,εx、εy、α、β是含水层重要参数,bmn是系数矩阵,lx、ly是计算区域投影到x-y平面后的长度和宽度,xp、yp和zp的计算公式如下:

公式(4)中,x、y、z是质点的物理坐标。公式(5)中,zmn表示水头分布的特征函数,其计算公式如下:

wmn表示垂直流速的的特征函数,如公式(6)所示。

公式(5)和公式(6)中,λmn由公式(7)计算而来。

步骤6:如果遇到边界条:z>0或者则向前或向后追踪结束,且执行步骤6,否则,根据流速计算出时间(步长/速率),并根据时间计算得到质点的下一个位置:

公式(8)中,dir的取值为1或-1,1表示向前追踪一步,-1表示向后追踪一步,δt表示一个时间步长。

步骤7:使用cuda拷贝函数将gpu计算结果从gpu传输到该进程的cpu内存中。

步骤8:利用mpi集合通信机制实现进程间的数据传输,将各个进程的计算结果汇总到主进程上。最后对无效结果数据进行处理后输出到结果文件中。

基于多节点多gpu并行计算质点追踪算法实现流线模拟的加速方法运行在多个带有多块gpu卡的服务器。具体的,该发明计算核心部分由mpi技术结合cuda的核函数实现其在多台服务器(计算机)上多gpu的并行。

通过cuda实现函数的线程级并行时,需要设定线程块block和块内线程thread的数量,继而设定并行使用的gpu总线程数量,实现线程级并行。本实例1将线程块中的线程数设为32,线程块设为二维在指定gpu上执行的kernel函数中,通过threadidx.x+blockidx.x×blockdim.x+griddim.x×blockdim.x×blockidx.y获得绝对线程序号index,该线程负责网格g(ix,iy,iz)内流体质点的追踪过程。cuda的执行模型与gpu的存储模型如图3所示。

线程块或线程之间在一定的内存中读取数据,内存包括线程自己的本地内存和寄存,线程块内的共享内存,以及块间网格内的全局内存、常量内存和纹理内存。由于同一线程块中的线程可以对该线程块的共享内存中的数据进行读取,且读写共享内存的速度很快,所以我们将一些常用的常量通过__shared__定义的方式存储在每一个块的共享内存中,这样在多次调用这些常向量的时候,可以节省很多的时间。通过使用不同层次的gpu存储结构,优化数据读取效率。

进一步的,通过mpi+cuda混合并行技术,使得多台计算节点上的多gpu同步执行,扩充了gpu的数量,从而加速执行流线模拟计算过程,具有更好的加速效果。

由于mpi_gather函数的特点,每个进程发送的数据量的大小必须是一致的,而实验中,数据量大小可能不同,因此,采用扩充无效数据的方法,使得所有进程的数据量都同最大值保持一致。当主线程收集完后,对扩充的无效数据进行处理。最后进行保存或打印。

本实施例1在多节点多gpu的服务器上实现并行,获得的加速比如图4所示,采用多个进程,调用相同gpu数量并行计算,其加速效果显著,最后加速效果保持稳定的状态。

综上,本发明具有以下有益效果:

本发明针对质点追踪算法实现流线模拟的大规模应用程序进行并行化处理,实现了程序基于多节点多gpu的并行计算,并获得极大的加速效果。

虽然,上文中已经用一般性说明及具体实施例对本发明作了详尽的描述,但在本发明基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本发明精神的基础上所做的这些修改或改进,均属于本发明要求保护的范围。

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