近年来,伴随着超算等大算力设备在CAE领域的应用,CAE仿真的网格量与计算结果的数据量也在不断攀升,尤其在CFD仿真计算领域,千万级的网格数据量已经成为常态,这也对可视化程序提出了更高的要求,传统的单线程的后处理模式已经在交互的实时性与数据处理效率两个方面面临着越来越严峻的挑战,在易用性与友好性上难以满足用户要求。大规模数据的并行后处理技术旨在解决数据规模很大的情况下数据的快速渲染与软件快速响应问题。本文试图探索MPI与VTK相结合的并行后处理方法解决上述问题,并探究其可行性与关键技术。
01技术路线
经过对ParaView、VisIt以及VTK等程序的调研与测试,发现在图形的渲染方面,三者的差异较小,均能在普通工作机上完成千万级网格量的渲染,但是在流线生成、切片、镜像对称等数据操作的效率上存在较大的差异。因此基于VTK的图形可视化程序,效率提升的重点在于提高数据处理的效率,可以将数据处理过程进行并行化以提高处理效率。
![](https://i-blog.csdnimg.cn/blog_migrate/564cf4f42acb284a7855564321dcc1c2.png)
为解决数据处理效率的问题,计划采用MPI多进程并行的方案提升数据处理效率。MPI启动多进程中,0号进程为渲染进程,在该进程中实现数据可视化渲染与用户交互;其他进程均为数据处理进程,数据处理进程彼此独立,中间彼此不进行通信,独立的进行数据读写与数据处理。渲染进程将数据处理命令下发到各个数据处理进程,数据处理进程将输出处理完成之后将结果数据发送回渲染进程进行数据可视化与图形交互操作。
02软件模块划分
软件可以分为图形渲染与交互模块、数据处理模块、进程间通信模块、外存文件IO以及程序拓展接口五部分。
![](https://i-blog.csdnimg.cn/blog_migrate/91deafa671f0e363d18b86fe1c038d89.png)
1
图形渲染交互模块
采用VTK与Qt技术实现三维模型的渲染与用户的交互操作,是人机交互的主要模块。该模块主要对应上述0号进程。
2
数据处理模块
主要采用VTK提供的数据处理算法实现对原始数据进行计算与处理,生成可渲染数据。该模块主要对应上述1到N号进程。
3
进程间通信模块
主要基于MPI的通信接口实现对数据处理参数的分发,以及对渲染数据的回传,主要涉及阻塞式通信、非阻塞式通信、广播等通信模式。该模块需要实现MPI与VTK的结合,主要功能为数据通信和序列化与反序列化。
4
文件IO模块
实现对后处理文件的读取,可以由图形渲染模块调用后即将数据分发到数据处理模块,也可以由数据处理模块独立读取。
5
程序拓展接口
实现软件的拓展性要求,实现数据处理、通信方式、渲染形式与多种文件格式的支持与拓展。
03关键技术
本文所述的方法的核心是将大规模数据分发到不同的数据处理进程中进行并行的数据处理,以达到提高软件运行效率的目的。本文认为将会涉及以下关键技术:
1
数据通信方式与策略
并行方法较串行方法在数据处理的效率上将会有一个明显的提升,但同时也会引入进程间通信的额外时间花销,尤其在数据规模非常大的情况下,可能需要引入像表面网格提取这样的数据处理算法,进一步增大时间开销。因此需要设计好数据通信的方式与策略,以达到最优的效率。
2
数据处理的并行控制
在大部分的数据处理中,各个进程可以独立处理,彼此之间无需通信,但在流线生成等数据处理方法中为保证结果的连续性需要对数据处理进程的运行顺序进行控制,以实现最好的计算效果。
3
数据分块
并行计算的结果数据有一些是合并输出的,单一的文件中包含了大量的数据,因此需要将数据拆分成小一点的数据块,然后出入到程序中进行处理。
04测试效果
基于本文所述方法目前已经进行了部分代码开发,实现了简单的数据通信与可视化功能:
![](https://i-blog.csdnimg.cn/blog_migrate/492fccf22b703a8dfec3cbad4842b10e.png)
采用217万节点与304万单元的数据集进行测试,文件读取与云图渲染功能的加速比如下:
数据处理进程数 | 1 | 2 | 3 | 4 |
加速比 | 1 | 1.93 | 2.78 | 3.57 |
05结语
本文所述的方法目前尚在技术探索阶段,目前完成了简单的Demo,能够实现多进程数据处理与进程间数据通信,但离实际应用还有很大的差距。如有不足,希望本文的读者、专家们能够在评论区留下观点和建议。