基于mpi的网格并行预处理方法_2

文档序号:8445388阅读:来源:国知局
网格的分区数;启动MPI多进程,设定进程数;判断进程数是否等于分区数,若等于则打开网格文件,主进程读取网格单元信息文件,将网格单元平均初始分配到各个进程,每个进程创建网格单元的邻接数组,否则重新启动MPI多进程;每个进程调用ParMETIS对网格单元进行网格划分;每个进程将网格单元信息分块读到数组,设定数组的索引位置;每个进程循环遍历网格单元信息文件,判断数组长度减去数组的索引位置号是否小于网格单元信息长度,若小于则读取网格单元信息文件的数据填充到数组中,否则将数组元素赋值给网格单元,并修改数组的索引位置;判断网格单元的分区号是否等于进程号,若等于则将网格单元信息存储到进程文件中,否则修改数组索引位置,继续循环判断。
[0024]本发明网格预处理方案中,计算域的网格的分区数小于或等于并行计算机的处理器数。邻接数组的存储格式为CSR(Compressed Sparse Row)。每个进程调用ParMETIS的子程序ParMETIS_V3_Mesh2Dual,将网格单元转化成图。每个进程调用ParMETIS的子程序ParMETIS_V3_AdaptiveRepart,对图进行重划分。每个进程调用ParMETIS的子程序ParMETIS_V3_RefineKway,进一步精化网格划分的质量。本发明通过多次调用ParMETIS的精化网格功能函数ParMETIS_V3_RefineKWay,不断优化网格划分的质量,进一步减少网格分区边界大小,减少并行计算的通信时间,提高网格划分的质量。
[0025]本发明采用ParMETIS实现高效快速的网格划分,ParMETIS的多层k_路图划分方法使各子图的顶点权值基本相同且划分产生的边截权数最小化,划分结果产生的通信时间短,从而使得整个并行程序的执行时间得到有效减少,并且随着数据规模的不断增大和处理器个数的增加,通信开销降低的效果更加明显。
[0026]本发明采用MPI多进程计算的方式,分布式进行网格的划分和预处理,能实现大规模网格的快速划分;同时采用ParMETIS并行区域分解工具划分大规模网格,将待划分的网格,初始平均分配到多个进程,各进程并行完成网格的划分,提升网格划分的速度。
[0027]本发明各进程根据网格划分的结果,循环遍历网格文件,采用定位文件指针和数组索引的方法对网格文件进行分块读,减少了大量的读网格信息的操作,同时有效避免了多进程同时读文件的竞争等待时间消耗,加速了各进程对网格数据的分割,能快速实现网格的分布式存储。
[0028]实施例一
[0029]本发明基于MPI的网格并行预处理方法的基本步骤为:首先MPI进程启动,读入网格文件数据,从网格文件中将结点信息和网格单元信息分别写进两个文件。创建新的通信域,调用ParMETIS的分区函数,对网格实现高质量的划分。根据网格划分的结果,启动多进程同时对网格文件进行循环遍历,通过定位文件指针分块读的方法,实现网格的分布式存储。
[0030]请参阅图1和图2,本实施例的具体步骤如下:
[0031]1.用户给定网格所需的分区数num_d0mains,分区数不能大于并行计算机的处理器数。
[0032]2.启动MPI多进程,设定进程数num_processors,进程数需等于分区数。
[0033]3.判断MPI进程数是否等于网格的分区数,若进程数等于分区数,则程序继续执行,否则退出,重新启动MPI多进程,设定进程数num_processors。
[0034]4.从网格文件中,读入网格全局几何结点数和网格单元数。打开指定目录下指定的原始网格文件channnel.msh,从channnel.msh文件中,读入网格全局几何结点数global_nde和全局网格单兀数global_nel。
[0035]5.将网格结点编号和结点坐标写进指定目录下的grid, bin文件。从channnel.msh网格文件中,用fscanf函数读取网格结点信息,并将网格结点编号和结点坐标写进指定目录下的grid, bin文件。
[0036]6.将网格单元的类型和构成单元的结点表等信息写进指定目录下的nenn.bin文件。用fscanf函数读取网格单元信息,并将网格单元的类型和构成单元的结点表等信息写进指定目录下的nenn.bin文件。
[0037]7.创建ParMETIS分区工具的通信域。指定ParMETIS的进程数num_run,根据指定的进程创建ParMETIS分区函数所需的通信域。
[0038]8.网格划分。包括以下步骤:
[0039]I)主进程读网格单元信息文件nenn.bin,将网格单元平均初始分配到各个进程,每个进程负责global_nel/num_processors个网格单元的划分。
[0040]2)主进程创建数组elmdist, elmdist=new idx_t [num_run+l],表示各进程处理的网格单元范围。其中第mpi_id个进程负责第elmdist [mpi_id]到第elmdist [mpi_id+l]个网格单元的划分。
[0041]3)主进程创建全局网格单元的邻接数组结构,采用CSR格式即用两个数组global_eptr、global_eind表示全局网格单元的邻接关系。
[0042]4)主进程根据全局邻接数组global_eptr、global_eind和elmdist数组,获得网格单元的并行CSR格式,即各进程第elmdist [mpi_id]到第elmdist [mpi_id+l]个网格单元的相邻结构,用数组eptr、eind表示。
[0043]5)主进程采用MPI通信方式根据进程数循环,将第elmdiSt[mpi_id]到第elmdist [mpi_id+l]个网格单元的相邻结构数组eptr、eind,发送到进程号为mpi_id的进程。
[0044]6)子进程采用MPI_Recv函数接收主进程发送的eptr、eind数组。
[0045]7)各进程准备ParMETIS函数其他的输入输出参数,如表示分区结果数组的输出参数part。
[0046]8)各进程调用ParMETIS函数ParMETIS_V3_Mesh2Dual,将网格转化成图,获得图的邻接结构,用数组xadj、adjncy表示。
[0047]9)各进程调用ParMETIS的重分区函数ParMETIS_V3_AdaptiveRepart,用图的邻接结构数组xadj、adjncy作为该函数的输入参数对图进行重划分,获得划分的结果数组part,表示网格单元与进程号的对应关系。
[0048]10)各进程调用ParMETIS的精化分区函数ParMETIS_V3_RefineKway,在上述划分的基础上,进一步精化网格划分的质量。
[0049]9.各进程将ParMETIS函数的输出结果数组part,用MPI的1函数MPI_File_write_at同时写进partit1n, bin文件,其中各进程写的起始偏移位置为elmdist [mpi_id],写的数组大小为 elmdist [mpi_id+l]-elmdist [mpi_id]。
[0050]10.网格的分布式存储。本发明采用分布式存储方式存储,每个分区会产生自己的数据文件,存储在相应进程的存储空间里,减少了 I/o瓶颈,提高了处理数据的规模和速度。
[0051 ] 请参阅图2,包括以下步骤:
[0052]I)各进程将partit1n, bin的分区结果读入数组ele_part,表示全局网格单元的分区号。
[0053]2)各进程创建大小为file_arr_size的分块读数组file_arr,用来存储每次分块读的网格单元内容。file_arr_siZe可以自己设定,设置太小算法的效果不明显,设置越大文件读写请求的次数越少,算法的性能越好,所以在内存够大的时候,file_arr_size可设置为大一点的值。
[0054]3)各进程从nenn.bin文件读file_arr_s
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1