一种基于线程并行的结构化网格流线积分方法与流程

文档序号:25421747发布日期:2021-06-11 21:33阅读:149来源:国知局
一种基于线程并行的结构化网格流线积分方法与流程

本发明涉及科学计算可视化技术领域,具体而言,涉及一种基于线程并行的结构化网格流线积分方法。



背景技术:

在流体力学与空气动力学等领域,为了对流体的运动状况进行分析,需要运用可视化技术对流场进行处理,将不可见的流场运动转化为可见的流场图像信息。流场可视化技术发展到现在,已经提出了许多方法,如几何形状可视化、纹理可视化、体可视化和特征可视化等。

就流场而言,流线积分是常用的可视化方法之一,因为流线能较好揭示流场走向,是实现流带、流管、流面等方法及粒子动画的基础。传统的串行流线可视化流程如图1所示,其主要性能瓶颈在于网格遍历和步长积分。

随着计算机硬件与计算方法的发展,数值模拟产生的数据集规模日趋变大,串行的流线可视化算法逐渐不能满足需求。硬件的发展导致多核、众核cpu成为当前计算机的主流配置,串行的流线可视化算法会造成严重的资源浪费,也不能满足在流线绘制过程中实时交互的需求。因此,开展并行流线积分工作是必须的也是必要的。

针对以上问题,国内外学者提出了许多并行流线积分方法。其中比较典型的有:peteka等人采用多线程并行粒子追踪对定场流场和非定场流场进行可视化(参见peterkatandnouanesengsyb,astudyofparallelparticletracingforsteady-stateandtime-varyingflowfields.parallel&distributedprocessingsymposium.ieee,2011:580-591),nouanesengsy等人使用多线程并行执行流线积分,实现节点间负载均衡(参见nouanesengsybandleety.load-balancedparallelstreamlinegenerationonlargescalevectorfields,ieeeedccationalactivitiesdepartment,2011:1785-1794),张文耀等人提出了中适用于二维了流场的并行流线放置方法(张文耀,一种适用于二维流场的并行流线放置方法,中国专利,cn102521854a),郭雨蒙等人提出了并行流线种子点放置策略(郭雨蒙,基于特征的流线种子点分布并行算法研究与实现[d].2014.),吕天耀等人提出了任务均等划分与冗余任务再划分的并行任务划分方法(吕天耀,基于流线相似性的流场并行可视化方法研究[d].2018.)

上述这些方法,在技术上各有特色,都能较快较好的产生流线可视化结果。但是这行方法是针对特定的情况构建的并行模型,且并行代码覆盖率不高。为了提高流线可视化算法效率,需要提高并行代码覆盖率,充分利用多线程进行并行处理。同时,随着数据规模变大,搜索树的构建也在发生变化,为了达到想要的细分粒度,大规模的数据需要进行更多次的划分,导致生成的搜索树深度较大且体积庞大,在后续的深度信息和维度信息处理上也会变得困难。

综上所述,使用多线程并行技术,对流线可视化算法的数据传输,网格单元定位以及种子点任务划分进行优化,可以提高流线可视化算法效率,满足科研人员实时交互的需求。



技术实现要素:

本发明旨在提供一种基于线程并行的结构化网格流线积分方法,通过多线程并行的快速流线可视化算法实现并行流线积分,以达到提高多核处理器利用率、加速科学可视化中流线积分的目的。

本发明提供的一种基于线程并行的结构化网格流线积分方法,包括以下步骤:

步骤1、对给定的多块结构化网格进行数据块的重划分;

步骤2、对于重划分后的每一个数据块,计算其属性数据的类型和数目;

步骤3、反馈步骤2的计算结果,把数据块中的每一种类型的属性数据提取出来单独存储;

步骤4、在进行三维矢量场流线可视化过程中,将需要的属性数据使用多线程进行并行读取;

步骤5、使用读取的属性数据构建动态搜索树;

步骤6、读取动态搜索树中计算种子点数,根据计算种子点的任务规模进行动态分组,再将分组后的计算种子点数分配给多线程并行积分计算;

步骤7、将计算结果保存用于后续的可视化工作,完成所有流线可视化工作。

进一步的,步骤1中所述对给定的多块结构化网格进行数据块的重划分的方法为:以给定的多块结构化网格为数据集,对数据集的多块结构化网格中各个数据块进行序号标记,对不同数据块使用边界信息合并到一起从而完成重划分,使重划分后的数据块的规模均衡。

进一步的,步骤4中所述将需要的属性数据使用多线程进行并行读取的方法为:对各数据块进行标记,将标记好的数据块按照设置的偏移值分配给各个线程并行读取。

进一步的,步骤5中所述构建动态搜索树的过程包括两个阶段:

第一阶段为粗粒度划分操作:首先根据坐标系统计算出数据集中数据块的尺寸,然后通过数据集中网格单元的总数n确定粗划分的粒度density1;再根据网格单元的总数n和粗划分的粒度density1将数据集划分为以父节点为单元的数据集;最后对父节点进行粗定位操作,初步实现各父节点的定位;

第二阶段为细粒度划分操作:首先计算划分为以父节点为单元的数据集中父节点的个数n,然后设置细划分的粒度density2,细划分的粒度density2<粗划分的粒度density1;再根据父节点的个数n和细划分的粒度density2将父节点细化分为以叶节点为单元的父节点;最后再对叶节点进行细定位操作,实现父节点中每一个叶节点的定位。

进一步的,所述第一阶段中划分为以父节点为单元的数据集的维度d如下:

式中,中间参数r为:

式中,density1表示粗划分的粒度,size[0]、size[1]、size[2]分别表示划分为以父节点为单元的数据集在x、y、z维度上的尺寸;每一个父节点在x、y、z维度上所占的尺寸bs为:

式中,d[0]、d[1]、d[2]分别表示划分为以父节点为单元的数据集在x、y、z维度上所占维度。

进一步的,所述计算划分为以父节点为单元的数据集中父节点的个数n的公式为:n=d[0]×d[1]×d[2]。

进一步的,所述第一阶段中,最后再对父节点进行粗定位操作的方法为:采用多线程并行的方法对每一个父节点进行处理,通过扫描、单元格排序、按关键字约减的操作实现各父节点的定位;所述按关键字约减的操作是指将具有相同关键字的网格单元整合到同一个父节点下。

进一步的,所述第二阶段中,最后再对叶节点进行细定位操作的方法为:采用多线程并行的方法对每一个叶节点进行处理,通过扫描、单元格排序、按关键字约减的操作实现各叶节点的定位;所述按关键字约减的操作是指将具有相同关键字的网格单元整合到同一个叶节点下。

作为优选,所述动态搜索树的深度为3。

进一步的,步骤6中所述根据计算种子点的任务规模进行动态分组的方法为:设置不同的阈值,每个阈值对应不同的任务规模,根据读取的种子点数目对任务规模进行分类。

综上所述,由于采用了上述技术方案,本发明的有益效果是:

(1)数据属性提取与并行读取:对于多块结构化网格数据,数据块与数据块之间的规模不一,导致在数据i/o阶段容易负载失衡,随着数据规模变大,这种现象愈加明显。因此,本发明在数据读入内存之前对数据进行预处理,将数据块进行重划分,使每个数据块的规模均衡,再将每个数据块的属性数据进行拆分提取存储,用于后期对属性数据的并行读取。这样将整个数据集一次读取分解到算法运行的各个阶段,多线程并行对需要的属性数据进行读取。这样将一次读取的等待时间细分到为不同的时间段,而且通过只读取需要的属性数据,可以有效减少计算机内存占用,实现各个i/o节点的负载均衡。

(2)动态搜索树构建:为了快速实现网格单元定位,进行流线积分计算。本发明使用多线程并行构建动态搜索树,即将数据集构建成深度为3的树形结构(根节点、父节点、叶节点)。父节点和叶节点的规模是通过提前设置的阈值密度进行划分的,通过递归、排序和约减等操作逐步细化,以实现对每一个网格单元的定位。动态搜索树结构的深度固定为3,而数据块的规模是不同的,所以父节点和叶节点的节点数是根据数据规模动态变化的,这样降低了动态搜索树深度信息的复杂性。在处理大规模的三维数据时,使用多线程循环嵌套的方法加速维度信息处理,充分利用多核处理器计算资源,加快搜索树构建算法的效率。

(3)动态任务划分:基于任务划分的流线可视化算法,以种子点为任务划分对象。不同数据块的特征不同,其放置的计算种子点数目也不同,不能一贯处理。本发明提出了动态任务划分并行处理的方法,即获取计算种子点数目并根据提前设置的阈值进行规模判定,在根据不同的规模将计算种子点任务分组分配给多线程并行积分计算。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1为本发明实施例基于线程并行的结构化网格流线积分方法的流程图。

图2为本发明实施例步骤1~步骤4进行数据划分与并行读取的流程图。

图3a本发明实施例步骤5构建动态搜索树的过程示意图。

图3b为与图3a对应的本发明实施例步骤5构建动态搜索树的流程框图。

图4为本发明实施例步骤6计算种子点的任务规模进行动态分组的流程图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例

如图1所示,本实施例提出一种基于线程并行的结构化网格流线积分方法,包括以下步骤:

步骤1、对给定的多块结构化网格进行数据块的重划分。重划分操作需要研究人员对数据集具有一定的认知,知道块与块之间的联系便于重组拆分;以给定的多块结构化网格为数据集,对数据集的多块结构化网格中各个数据块进行序号标记,对不同数据块使用边界信息合并到一起从而完成重划分,使重划分后的数据块的规模均衡。

步骤2、对于重划分后的每一个数据块,计算其属性数据的类型和数目;数值模拟产生的数据集往往具有多种属性,如包含温度、压强、速度分量等属性,不同的属性数据可用于不同的可视化操作;

步骤3、反馈步骤2的计算结果,把数据块中的每一种类型的属性数据提取出来单独存储;即重划分后仍有较多的数据块,再将数据块按属性类型进一步拆分存储,对属性数据进一步细化,使得重划分后的每个数据块中只包含一种类型的属性数据。

步骤4、在进行三维矢量场流线可视化过程中,将需要的属性数据使用多线程进行并行读取;经过步骤2和步骤3的操作,数据块的同一属性数据也被分成了若干组,对各数据块进行标记,将标记好的数据块按照设置的偏移值分配给各个线程并行读取。数据块与线程数的关系对读取任务的均衡性有一定的影响。

前4个步骤的具体实现流程如图2所示,对应的伪代码如下所示:

input:dataset指要处理的数据集

block[i]表示数据集中的第i个数据块

data[n]表示数据块中的第n个属性数据

thread[i]表示当前第i号线程

1:functionextractionparallel(dataset)

2:a<-numattribute(block[i])计算数据集中的属性数目

3:getname(block[i])获取数据属性名

4:#pragmaompparallelfor

5:foreachblockmindatasetdo

6:data[n]<-divided<-block[m]n属于a

7:attributename[n]<-saveas<-data[n]数据块拆分后以属性类型命名存储

8:endfor

9:particleadvectionneedvectorattribute

10:#pragmaompparallelfor

11:foreachattributenamejindata[]do

12:thread0<-atributename[0,0+k,0+2k,…]

13:thread1<-atributename[1,1+k,1+2k,…]

14:…………

15:input<-thread[i]对属性数据进行多线程并行读取

16:endfor

17:return“readsuccess”

18:endfunction

上述伪代码说明:将数据集中的数据块按属性类型拆分存储,在可视化过程中将需要的属性数据根据偏移值平均分配给各个线程,以实现对属性数据的并行读取。

步骤5、使用读取的属性数据构建动态搜索树,以实现网格单元的定位。如图3a和图3b所示,该步骤5中构建动态搜索树的过程分为两个阶段:

第一阶段为粗粒度划分操作:以数据集(根节点)为操作对象,将其粗粒度划分到父节点中,各个父节点数据的总和仍为总体数据集。具体地:

首先根据坐标系统计算出数据集中数据块的尺寸(size),再通过数据集中网格单元的总数n确定粗划分的粒度density1;根据粗划分的粒度density1将数据集划分为以父节点为单元的数据集,这时划分为以父节点为单元的数据集的维度d的计算公式如下:

式中,中间参数r为:

式中,density1为粗划分的粒度,size[0]、size[1]、size[2]分别表示数据集在x、y、z维度上的尺寸。这时每一个父节点在x、y、z维度上所占的尺寸bs为:

式中,d[0]、d[1]、d[2]分别表示划分为以父节点为单元的数据集在x、y、z维度上所占维度。

第一阶段最后对父节点进行粗定位操作,初步实现各父节点的定位。为了加快定位的速度,本实施例采用多线程并行的方法每一个父节点,通过扫描、单元格排序、按关键字约减的操作实现各父节点的定位;所述按关键字约减的操作是指将具有相同关键字的网格单元整合到同一个父节点下。因为各数据集网格单元中的数据是相互独立的,所以使用多线程并行时可行的。值得注意的是,数据块的形状不是规则的立方体,故使用粗粒度划分方法生成的父节点单元大小不是相同的,而是根据数据集和坐标系统,父节点中网格单元数从几个到几百不等。

第二阶段为细粒度划分操作,第二阶段与第一阶段类似,即首先计算划分为以父节点为单元的数据集中父节点的个数n,其中,计算父节点的个数n,公式如下:

n=d[0]×d[1]×d[2]

然后设置细划分的粒度density2,细划分的粒度density2<粗划分的粒度density1;再根据父节点的个数n和细划分的粒度density2将父节点细化分为以叶节点为单元的父节点,细化分后的父节点单元被定义为规则的六面体结构。第二阶段最后再对叶节点进行细定位操作,实现父节点中每一个叶节点的定位。同样地,为了加快定位的速度,本实施例采用多线程并行的方法对每一个叶节点进行处理,通过扫描、单元格排序、按关键字约减的操作实现各叶节点的定位;所述按关键字约减的操作是指将具有相同关键字(如id)的网格单元整合到同一个叶节点下。

通过粗粒度与细粒度的划分,在积分定位过程中快速缩小备选区域,实现对网格单元的定位。因为树的深度不变,树的宽度会随着数据规模的变化动态变化。固定的深度树可以减少多次深度检索的复杂性,对于大规模数据采用多线程并行技术对维度信息进行处理也能有效加快算法效率。

构建动态搜索树的伪代码如下所示:

input:coords指数据集左边系统

field指要处理的属性字段

cells指数据集中的网格单元

node[i]指第i个父节点

density1、density2指粗、细划分的粒度

1:functioncelllocatortree(cords,field,cells)

2:coarse_tumble(coords,field,cells,density1)粗划分过程

3:ifall_donethen

4:break

5:endif

6:refine_tumble(coords,field,cells,node[i],density2)细化分过程

7:ifall_donethen

8:break

9:endif

10:endfunction

伪代码说明:经过粗粒度和细粒度两次划分,通过多线程并行将数据集构建为一棵深度为3,宽度可动态变化的搜索树结构。

单元格处理的伪代码如下所示:

1:calculate(cords,cells,size)计算划分后节点的维度、规模大小

2:foreachcellincellsdo

3:cell:<-scanexclusive(calculate)计算单元格、节点之间位置关系

4:cells<-reducebykey(cell)<-sortbykey(cell)<-sort(cell)对单元格进行规约排序

5:endfor

6:return“success”

伪代码说明:在细划操作过程中,对数据集中的网格单元进行规约排序等操作,实现对每一个单元格的定位操作。

步骤6、读取动态搜索树中计算种子点数,根据计算种子点的任务规模进行动态分组,再将分组后的计算种子点数分配给多线程并行积分计算;具体方法是:设置不同的阈值,每个阈值对应不同的任务规模,根据读取的种子点数目对任务规模进行分类。每一个任务规模下又对应一个k值,即将计算种子点k个一组按照偏移值进行划分,再将划分好的任务组分配给多线程并行积分计算,具体流程如图4所示。

动态分组的伪代码如下所示:

input:n指种子点数目

m指划分的任务组数

1:functiontaskallocation(n)

2:m=n/k将种子点分为m组

3:#pragmaompparallelfor

4:foreachiinm

5:functor

6:endfor

7:endfunction

伪代码说明:读取计算种子点数根据阈值判定任务量级,在根据阈值下的k值对种子点数进行分组,再将分组后的种子点数分配给各线程并行处理。

步骤7、将计算结果保存用于后续的可视化工作,完成所有流线可视化工作。

通过上述内容可知,本发明具有如下有益效果:

(1)数据属性提取与并行读取:对于多块结构化网格数据,数据块与数据块之间的规模不一,导致在数据i/o阶段容易负载失衡,随着数据规模变大,这种现象愈加明显。因此,本发明在数据读入内存之前对数据进行预处理,将数据块进行重划分,使每个数据块的规模均衡,再将每个数据块的属性数据进行拆分提取存储,用于后期对属性数据的并行读取。这样将整个数据集一次读取分解到算法运行的各个阶段,多线程并行对需要的属性数据进行读取。这样将一次读取的等待时间细分到为不同的时间段,而且通过只读取需要的属性数据,可以有效减少计算机内存占用,实现各个i/o节点的负载均衡。

(2)动态搜索树构建:为了快速实现网格单元定位,进行流线积分计算。本发明使用多线程并行构建动态搜索树,即将数据集构建成深度为3的树形结构(根节点、父节点、叶节点)。父节点和叶节点的规模是通过提前设置的阈值密度进行划分的,通过递归、排序和约减等操作逐步细化,以实现对每一个网格单元的定位。动态搜索树结构的深度固定为3,而数据块的规模是不同的,所以父节点和叶节点的节点数是根据数据规模动态变化的,这样降低了动态搜索树深度信息的复杂性。在处理大规模的三维数据时,使用多线程循环嵌套的方法加速维度信息处理,充分利用多核处理器计算资源,加快搜索树构建算法的效率。

(3)动态任务划分:基于任务划分的流线可视化算法,以种子点为任务划分对象。不同数据块的特征不同,其放置的计算种子点数目也不同,不能一贯处理。本发明提出了动态任务划分并行处理的方法,即获取计算种子点数目并根据提前设置的阈值进行规模判定,在根据不同的规模将计算种子点任务分组分配给多线程并行积分计算。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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