基于并行数据流的大规模数据可视化外文翻译资料
2022-09-16 10:27:06
英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料
基于并行数据流的大规模数据可视化
科学家们使用计算机仿真技术来模拟现实世界中一些现象的模型,包括地球环境模型, 物理力学加速器模型和天体模型。通过计算机额外的计算能力和算法的发展,研究人员可以模拟这些模型以更详细具体的方式,增加我们对周围世界的理解。在工程和产品设计中,仿真技术替换物理原型,能够降低设计周期和减少成本。这类应用程序的关键是仿真结果的可视化分析。模拟技术通常并行运行在高带宽的超级计算机或个人电脑集群上,由此产生的数据集是如此巨大,他们需要相似级别的并行计算来有效地进行可视化。
可视化大型数据集不是一个新问题,它一直是一个重要而难解决的问题。继续通过传统的硬件功能的改善处理更大的数据集可能更容易,而网络软件和硬件的改善也促进着网络计算集群的增长。我们预计,大数据集可视化的需求和数据集的大小将会持续增长。大型以及小型并行计算资源已成为科学家的普遍计算数据,所以必须开发并行可视化软件来有效地使用这些资源。
导致可视化大型数据集困难的原因有很多。当前分析代码产生大量元素数据集分布于成千上万的处理节点。在某些情况下,许多步骤不会存储到磁盘,但是必须可视化在内存中的处理节点。这就产生了一个问题,因为可视化必须共享已经模拟使用过的有限的资源。这个问题十分复杂,因为这可能需要比模拟更多的存储空间。另一个困难是,一些传统的可视化算法,如简化生成或网状简化,不适合并行操作分布式数据。此外, 可视化系统经常导致混合数据集拓扑结构,即使仿真数据集是一个统一的拓扑结构。一个直线网格的等值面是一种常见的例子。
要解决这些问题,我们开发了一个基于混合数据集拓扑结构的并行数据流的可视化体系结构。显然,任何可行的解决方案必须支持并行执行和可视化。混合拓扑的并行数据流快于混合数据流,这样我们可以保证可视化所需的存储资源显著小于模拟。此外, 它支持流媒体,即使数据集的拓扑结构从一个可视化算法变至下一个。
我们在可视化工具包(VTK)中实现了我们的架构。1它包括具体的添加支持消息传递的接口(MPIs);基于内存限制的数据流的隐式和显式拓扑;数据流在拓扑结构之间请求的翻译;传递数据和管道控制之间的共享,分布,混合内存配置。2这个架构直接支持两类并行处理方式。3
这篇文章并不是为了解决一些大数据可视化系统的大规模并行I / O,有效负载平衡或并行处理等已知问题,尽管我们简要讨论它们的影响。
发展现状:
并行可视化,数据流和混合拓扑可视化是已知需求的所有技术,它们很难,并且结合这三种技术是一个重大的挑战。
研究人员已经开发出大量的算法支持高效的大数据流。4,5这些方法核心是采用增量算法控制内存占用。这些方法包括流线、等值面、以及相关的计算几何的工作。6-11通常情况下,该算法将提供相关的功能,并且将增量写入到磁盘。紧随其后的特征提取是一个交互式的可视化的提取功能。这些算法缺乏一个整体架构,通常,他们独立工作,以及进行磁盘存储。有时候开发人员可以有代价地应用它们连续不断地在每一个算法之间读写数据到磁盘,这是一个糟糕的使用内存的层次结构。
系统,如开放数据浏览器(OpenDX),应用可视化系统(AVS),需求驱动的可视化工具(DDV),SCIRun提供一个管道基础设施和支持并行执行。12OpenDX(原IBM 数据浏览器)和AVS是基于数据流的可视化系统,为用户提供大量可视化和分析算法。13-14两个系统的架构都依赖与集中执行某种程度上的实例化模块,分配内存和执行模块。例如,他们可以与远程模块实现任务并行。 15两个系统以某种形式通过一个集中的执行模块并行处理数据。
SCIRun是一种基于数据流的模拟可视化系统,支持交互式计算。SCIRun提供线程任务和数据共享内存在多处理器上的并行。2,16SCIRun的并行扩展允许之行分布式内存的任务。SCIRun还使用一个集中的管理,通过这种方式,就像OpenDX和AVS。
所有这些系统都提供一个紧密集成编程环境, 通过一个图形用户界面,支持互动项目建设、执行和调试。对于项目建设和执行来说,单点控制的存在可能创建一个相关的集中执行。然而, 从一个集中的执行设计一个有效的机制来控制许多流程是很困难的。和这些系统相比,我们的方法避免了使用一个集中的执行,因此提供了一个可伸缩的解决方案。
DDV提供基于流水线结构,需要处理大型数据集的执行模型只要求产生所需的最少的数据结果。与大量数据集的存储或计算字段相比,这是一个很大的优势。DDV和其他方法还没有解决支持混合的任务,以及数据和管道的分布和共享内存在多处理器上的并行性。其他解决方案,比如pV3 Ensight,包含各种各样的技术和支持大型或并行数据但设计的更多是一站式应用程序。19pV3是在并行虚拟机(PVM)环境中实现的视觉可视化应用程序,这一过程中运行在异构计算机网络的数据,最终输出到收集器,收集并显示结果。尽管它是成功的,但pV3只是一个自定义应用程序,而不是一个工具包。此外,在收集较大的数据环境中存在问题。同样,Ensight易于使用,但缺乏我们的方法的灵活性和功能性。
我们在这里描述的所有方法都缺乏能力处理流数据在内存中的拓扑变化。
因为许多可视化技术可以改变数据的拓扑结构,所以这是一个重要的考虑因素。
即便使用非结构化网格,一般情况下,使用结构化的图像有时也是更有效和最佳的方法,而不是另一个非结构化网格。
数据流:
通过可视化数据流管道提供了两个主要的好处。首先,我们运行可视化数据通常不会存在内存交换;第二,我们可以运行可视化与更小的内存来占用较高的缓存命中率以及很少甚至没有磁盘交换。为此,可视化软件必须支持数据集打破成碎片和正确处理那些碎片。这就要求数据集和操作的算法是可分的,可映射,和结果不变。
- 可分的: 该算法必须能够把数据集打破成碎片。理想情况下,每一块应该有一致的几何、拓扑、和数据结构。分离数据应该简单和高效。此外,该算法在此体系结构中必须正确处理数据。
- 可映射:通过管道来控制数据流,我们必须能够确定要把哪些部分的输入数据生成给定部分的输出数据。这使得我们需要通过管道的大小和配置算法来控制数据。
- 结果不变:结果应该是独立的块的数量和执行模式(即单线程和多线程的)。这意味着正确处理可能重叠边界和开发多线程安全的算法。
其他研究人员已经讨论了实现此目的的一个定期采样数据的架构。该架构中的数据消费者,如渲染引擎或文件写入, 实现发出请求的数据使用三步管道更新机制。
第一步,更新信息,确定数据集的特征。这个请求是由数据的消费者和数据的来源产生的。结果信息包含原生数据类型(如浮动或短类型),最大程度上表示为(imin,imax,jmin jmax,kmin,kmax),标量值的数量,每一点和管道变更时间。该体系结构使用本机数据类型和数量的标量值来计算每一点给定的数据需要多少内存。通常,最大程度是一个磁盘上的数据集的大小。这有助于确定如何打破成碎片的数据集和硬边界在哪里(而不是一块的边界)。该架构使用管道变更时间确定何时可以使用缓存的结果。
许多可视化算法在更新信息传递时,管道必须修改信息。例如,一个不好的图像放大算法最大程度上会产生其输入两倍的信息、一个梯度算法会为每个输入组件产生三个组件的输出。
第二步,更新区段,传播管道(数据源)请求数据(更新程度)。如请求传播源,每个算法必须确定具体如何修改请求,以及算法生成的要求更新的所需的程度的输入范围是什么。对于许多算法,这是一个简单的一对一的映射。对于其他算法,比如梯度计算,使用中央差异,所需的输入范围与请求的程度不同。出于这个原因,必须可映射算法。通过更新区段的一个副作用是它会返回生成请求所需的总内存。这使得流媒体存在内存限制。例如,一个简单的流算法将传播大量更新程度超过用户指定的内存限制的数据。然后,它必须将更新数据分解成小块,直到符合内存限制。这就要求数据集是可分的。
最后一步,更新数据,使可视化管道来处理数据以及在第二步产生的更新要求。这三个步骤需要大量的代码来实现,但令人惊讶的是,他们的CPU开销可以忽略不计。一般来说,更好地提供性能加速缓存能弥补了额外的开销。唯一的例外是边界模块会重新计算多次,因为他们之间共享多个块。这是基于社区的典型算法,它创建一个块大小之间的权衡(内存消耗)和验算共享模块(计算)。
整个三步过程由数据的消费者作为一个作家,将数据写入磁盘或映射器,或者将数据转换为OpenGL调用。在这两种情况下,数据流是有效的,因为整个结果绝不是存储在内存中,而是写入磁盘碎片。
VTK中的流媒体很简单。伪代码示例:
- 创建管道
MyDataSource source
source SetStandardDeviation( 0.5 )
ContourFilter contour
contour SetInput (source)
contour SetContourValue( 220 )
// 设置内存限制
PolyDataMapper mapper
mapper SetInput (contour)
mapper SetMemoryLimit( 50 )
分析体积源的实例被创建在这个例子中,称为源。然后连接到一个轮廓滤波器,然后连接到一个映射器。50-Mbyte内存限制设置映射器,如果内存消耗超过限制,将启动控制流。映射器将生成的等高线数据转换为图形原语。唯一的变化是,这个程序通过SetMemoryLimit调用映射器支持流媒体。
支持并行:
大多数大型模拟使用并行,处理结果往往是分布的许多处理节点。这就要求可视化算法能够在这种环境中操作。支持并行性需要一些相同条件下的流媒体,比如数据可分性和结果不变性。它还需要异步执行、数据传输和收集。我们通过创建输入和输出端口对象过滤器(算法)来保证数据在不同的进程之间的通信。反过来,我们需要异步执行这一过程,并不是不必要的封锁,而是从另一个进程等待输入。
考虑图2中的管道。过滤器3有两个输入。第一次输入滤波器1是在另一个的过程,所以它需要一个输入和输出端口管理进程间通信。过滤器3执行前,必须确保输入的数据生成。简单的方法是要求每个管道输入生成的数据。问题在于,尽管过滤器3是等待过滤器1来计算其数据,但过滤2是空闲的。为了解决这个问题,我们在三步更新过程中做了两个修改。
第一个修改是在更新过程中添加一个非阻塞方法,称为触发异步更新。本质上,这个方法遍历管道,当它遇到一个管道,管道调用更新数据的输入。第二个修改是使用输入的位置来确定以什么样的顺序调用更新数据。我们定义一个输入的位置1.0,输入是在同一过程生成的,输入位置0.0,输入是在一个不同的过程中生成的,并在0.0和1.0之间,输入的一部分在一个过程中生成,另一部分在另一个过程中(例如在很长一段管道一半的算法是一个进程,一半在另一个)。
因此在图2中,触发异步更新将被派往过滤器1,这将导致过滤器1开始执行,因为它是在一个不同的过程。过滤器2不会触发异步更新响应,因为过滤器1和过滤器3之间没有任何管道。除了这些基本的变化,我们通过调用一个封装初始化过程和通信过程的类,这样用户不需要直接处理这些问题。
我们创建的具体子类的分布式内存并使用MPI和线程共享内存的过程。同样,我们编写了一个并行渲染类,使用进程间通信收集数据,然后复合并行渲染生成一个最终的图像。鉴于这种并行数据流架构,我们可以创建一个数据并行程序,只需编写一个函数,将在每个处理器执行。内部函数中,每个处理器基于其处理器ID将请求的不同程度的数据。如果其本地内存不足,每个处理器仍然可以利用数据流,让这个架构过程大规模可视化。考虑修改前面的伪代码例子来支持数据流并行性。
首先,我们定义了一个函数的过程,包含了大量的管道创建和渲染。MultiProcessController将调用此函数,封装了设置和初始化的过程。在这个例子中,我们使用MPIController MultiProcessController的子类。传递到函数的参数提供了信息,例如进程ID和总数量的过程。然后,调用渲染器将开始呈现过程。main()函数创建MPIController的一个实例,这是MultiProcessController的一个子类,为它创建一个函数,然后执行它。
process(MultiProcessController ctrl)
{
myId = ctrl GetLocalProcessId()
numPrcs = ctrl GetNumProcs()
- 创建管道
MyDataSource source
source SetStandardDeviation( 0.5 )
ContourFilter contour
contour SetInput (source)
contour SetValue( 220 )
PolyDataMapper mapper
mapper SetInput (contour)
//设置内存限制
mapper SetNumberOfPieces( numProcs)
mapper SetPiece( myId )
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[148651],资料为PDF文档或Word文档,PDF文档可免费转换为Word