基于希尔伯特空间填充曲线索引的多地震数学数据快速交叉显示

文档序号:1739053 发布日期:2019-12-20 浏览:26次 >En<

阅读说明:本技术 基于希尔伯特空间填充曲线索引的多地震数学数据快速交叉显示 (Multi-seismic mathematical data rapid cross display based on Hilbert space filling curve index ) 是由 胡叶正 郭政宏 黄旭日 徐云贵 曹卫平 唐静 于 2019-09-20 设计创作,主要内容包括:基于希尔伯特空间填充曲线索引的多地震数学数据快速交叉显示是一种地震大数据3D可视化的方法,具体技术为基于CUDA并行和OpenGL可视化技术和基于GPU的并行非对称无损压缩算法,在CPU-GPU的全局统一内存上建立并发动态Hilbert R Tree数据索引结构,基于CUDA和OpenGL互操作技术,基于Hilbert编码的紧致包围盒算法的GPU体绘制技术。在文件,内存,缓存上建立一颗动态并发的Hilbert R Tree,可以有效降低CPU的工作负载和内存的占用,提高多地震的数学数据的渲染速度,提高绘图质量,降低用户交互时延,提高用户体验效果。(The method is characterized in that a concurrent dynamic Hilbert R Tree data index structure is established on a global unified memory of a CPU-GPU (central processing unit-graphics processing unit), and the GPU volume rendering technology is based on a CUDA and OpenGL interoperation technology and a Hilbert coding compact bounding box algorithm. A dynamic concurrent Hilbert R Tree is established on a file, a memory and a cache, so that the working load of a CPU (Central processing Unit) and the occupation of the memory can be effectively reduced, the rendering speed of the mathematical data of multiple earthquakes is improved, the drawing quality is improved, the user interaction time delay is reduced, and the user experience effect is improved.)

基于希尔伯特空间填充曲线索引的多地震数学数据快速交叉 显示

技术领域

本发明涉及基于希尔伯特空间填充曲线索引的一种海量地震数学数据的3D可视化的方法。

背景技术

目前,我国大部分油田已进入开发中后期阶段,大量的油气已被采出,油气开采难度加大,对物探勘探开发技术也有更高的要求。通过对地震数据的三维可视化,能够清晰描绘地质体的内部结构特点和整体形态特征。充分发挥三维数据体的优势,多角度,多类型,多属性对地震波信息(振幅,频率,相位,空间)进行三维可视化显示。地质解释人员可以在此基础上,获得更好的认识,做出有利的决策,大大提高寻找油气藏的效率,具有重大的经济价值。

但是,随着地震勘探的技术不断提升,产生的数据规模和速度已经远远超出了计算机的内存,GPU显存大小,传输带宽的限制。尽管CPU和CPU的算力在“摩尔定律”的推动下显著提升,但是受制与孱弱的内存大小,内存和显存之间的总线传输带宽,GPU显存大小的制约,只能对这些海量数据“望洋兴叹”。

好在,用户只有通过可视化终端(屏幕,投影仪,VR设备,AR设备)观察到数据是具有可视化意义,通常这一部分数据占整个数据比列很低。而用户可以通过交互系统,遍历所有感兴趣的数据,这为海量数据可视化提供可能。

目前,在不更改计算机硬件设备条件下(增加内存条,换用高级别的显卡),可以通过一是通过对海量数据进行压缩,减少数据的绘制量;二是对海量数据进行分块,在显示过程按用户需要调用子块。

在可视化过程中,若采用对数据压缩方法实现快速可视化,一般要求对原始数据进行无损压缩。防止在数据可视化过程中,由于插值,重采样等的过程发生导致结果不真(某些JPEG图片压缩算法,反复压缩解压之后,图片出现发绿现象)。

目前在海量数据分块,建立索引过程中常用八叉树(平面上为四叉树)进行块编码,Z-Order编码对数据进行组织,编码简单。但是由于八叉树的均匀分块策略的数据组织方法,若终止条件选取不当,则会造成子块增多,构成的八叉树十分臃肿,文件操作急剧上升。Z-Order编码,局部保序性较差,随着曲线编码的阶数变换,其连续性较差,破坏了数据的空间连续性。若采用Hilbert对子块编码,可以很好的保证数据的空间相关性,其编码连续,所形成的Hilbert-R Tree便于查询。结合人机交互模型确定需要加载关键数据,减少数据的延迟。

当前地震数据科学可视化过程中,2D可视化领域主要以B+W地震剖面图,这方面绘制技术已经成熟,前人已采用Qt,OpenGL,GPU等技术,绘图效率和绘图质量的得到了大幅度的提高。3D可视化领域中,由于体绘制技术相比于其他绘图技术如抛雪球法绘图质量高,内部细节清楚,得到了广泛商业使用。

光线投射算法是三维地震可视化算法中的经典算法,其基本原理如下:首先确定光线如何投射,每一条的光线都是从屏幕上的像素开始,并沿着视线的方向进行投射。接下来确定如何穿越体数据,当投射数据与体数据包围盒相交时进行采样计算,在光线投射方向,对体数据内的光线片段等距离采样,并对当前采样点的光学属性(颜色值,不透明度)进行插值计算,然后对其合成(由从前到后和从后到前),得出该投射光线最终要系显示的颜色值。

因此,光线投射算法导致计算量很大,绘制速度慢,导致实时交互性差,限制了其在较多领域中的应用。目前为解决该问题,有两种方法:一是对包围的体素的最小紧致包围盒子进行合理分块编码,尽可能地剔除掉不与光线的相交盒子,减轻绘制的任务量;二是采用非对称压缩算法(对压缩算法性能要求不高,对解压算法要求性能很高)对体素进行压缩,在绘制时进行GPU实时解压。3D可视化过程中这两个解决方案和之前的海量数据可视化思路不谋而合,如何巧妙设计一个分块编码方案和数据压缩方法,成为提高海量数据可视化绘图效率,绘图质量,实时交互的核心问题。

除此之外,目前基于Qt和OpenGL等通用的绘制引擎在处理地震数据中的时间比较长,图形的光栅化处理效率低,使其很难满足海量数据的快速可视化应用的需求,更无法达到用户实时交互功能,尤其是针对计算量巨大体绘制算法。采用GPU绘图有利于提高绘图效率,绘图质量:现代图形API(DirectX D3D 12OpenGL 4.5 Vulkan)也采用GPU多干活,CPU少干活,其绘图质量和绘图效率和上代图形API(DirectX D3D11)相比,有极大的提高。

发明内容

本发明的目的在于多地震数学数据快速交叉显示方法,该方法基于Hilbert索引构建在CPU-GPU全局统一内存动态并发Hilbert R tree,支持多个渲染线程和数据压缩线程同时操作R tree,支持单个数据多个视图模式。基于Hilbert索引在GPU显存中建立适合体绘制的Hilbert R tree数据结构,基于GPU的无损的bzip2压缩算法,基于CUDAUVA全局统一内存技术,CUDA-OpenGL互操作技术,降低数据从文件到内存再到显存的传输大小,避免数据来回在CPU和GPU拷贝。

为达到以上技术目的,本发明提供以下技术方案(如图1所示)。该方法的核心技术是在CPU和GPU全局统一内存上建立动态并发Hilbert R Tree,提高空间查询效率,提高缓冲命中率,降低用户操作时延。综合运用多种技术方案:内存映射读写大文件,CUDA与OpenMP并发并行技术(CUDA与MPI并行技术),CUDA中全局统一内存技术(UVA技术),CUDA与OpenGL互操作技术,建立起从文件到内存,显存,帧缓存的高速渲染通道。

渲染线程中的局部缓存中Hilbert R Tree是全局CPU-GPU内存Hilbert R Tree的一个子节点;全局CPU-GPU内存中Hilbert R Tree在经过希尔伯特编码的Hilbert R Tree的一个子节点:通过Hilbert R Tree的结构保证这三级缓存的空间结构关系(如图2所示)。用户的所有人机交互操作可以被映射成对Hilbert R Tree操作(如图6所示)。

该方法依次包括以下步骤:

(1)文件IO与全局内存交互:读取文件中海量数据,在CPU-GPU全局统一内存上建立动态并发希尔伯特树。

(2)文件IO与全局内存交互:读取文件中海量数据(压缩数据)使用GPU无损压缩算法(解压算法)对希尔伯特树的子块进行压缩(解压),压缩(解压)的后的子块存入按照Hilbert节点索引顺序写入文件中;

(3)全局内存与局部缓存交互:CPU-GPU全局统一内存中建立的动态并发希尔伯特树和渲染线程中的体绘制法中的希尔伯特树子块数据交互;

(4)人机交互与局部缓存交互:交互窗口的视点变换动态更新渲染线程中的希尔伯特树数据结构。

附图说明

图1是技术方案的流程图。

图2是文件,全局统一内存,渲染线程缓存构成Hilbert R Tree。

图3是图1中1中的并发读写压缩流程示意图。

图4是图1中2的bzip2压缩算法流程图。

图5 Hilbert曲线二进制编码表。

图6用户交互操作映射到Hilbert R Tree当前显示节点变换。

图7 CUDA&OpenGL互操作API。

图8用户交互操作模型命中缓存示意图。

具体实施方式

下面结合附图对发明做进一步说明。

步骤一:读取文件中海量数据,进行规则分块,对每一个分块进行压缩编码。从原始未压缩的海量数据,按照以下原则进行规则分块:一是分块大小必须是内存分页大小的整数倍。这是由于采用内存映射的方式读写文件,其起始偏移大小必须是分页内存大小的整数倍。采用内存映射方式读取文件可以采用MPI多进程并行或者OpenMP多线程并发模式读取子块;二是分块的大小需要考虑压缩算法压缩效率,内存的大小限制,显存大小的限制。尽可能在内存和显存的大小限制下,分的最大的子块,这样压缩的算法压缩的效率很高,显著降低数据传输量,同时可以很好覆盖人机交互操作,避免频繁的数据传输。最后,为了便于算法实现,采用固定大小分块。

对每一个固定子块使用基于GPU的bzip2压缩算法进行压缩(如图4所示),形成一个压缩子块;同时对每一个子块进行Hilbert编码,写入压缩文件当中。该过程可以作为后台线程(进程)静默执行,用于完成海量数据压缩功能。

与此同时,根据用户当前窗口要显示的内容,在CPU-GPU全局构建一个并发动态的Hilbert R Tree。

步骤二:根据窗口显示的内容在CPU-GPU全局统一内存中建立动态发的Hilbert RTree。CPU-GPU全局统一内存中建立动态发的Hilbert R Tree具有以下特点,树的高度的是确定,每个子块是均匀分块。

根据窗口显示内容,计算其所需要的加载的子块的Hilbert码值。

根据要加载的子块的Hilbert码值,从压缩后的数据文件,读入内存进行解压,按照图5的映射方式,把每一个子块的空间坐标编码成Hilbert码值。对均匀分块的子块按照Hilbert码值的顺序自下而上建立起一颗Hilbert R Tree。(若从原始数据文件中读取,则需要把Hilbert码按照图5Hilbert曲线二进制编码表逆映射成线性码值,在照后续操作)。

CPU-GPU全局统一内存(CUDA中的UVA技术)是由以下CUDA API提供的:cudaMallocManaged,cudaFree等函数族提供的,避免了CPU和GPU数据来回拷贝。

步骤三:CPU-GPU全局统一内存中建立的动态并发希尔伯特树和渲染线程中的体绘制法中的希尔伯特树子块数据交互。渲染线程中的局部缓存是由OpenGL函数簇建立起来,从内存中的Hilbert Tree选取合适层级的叶子节点作为渲染线程局部缓存中的Hilbert R Tree的根节点,建立其可完整的Hilbert R Tree。用户的人机操作将会被映射对渲染线程中Hilbert R Tree的和内存中Hilbert R Tree交互操作(如图6所示)。

以CUDA和OpenGL互操作为例(如图7所示):OpenGL用于绘制的元素如像素缓冲区(PBO),纹理缓冲区对象(Texture Object),屏幕帧缓冲(FrameBuffer),顶点缓冲区对象(VB0),OpenGL可编程渲染管线缓冲区对象:首先这些缓冲区是可以通过CUDA-OpenGL互操作API进行低成本映射CUDA指针,交给内核函数执行,执行完毕后解除映射,交给OpenGL进行绘制。对于其他图形API(DirectX D3D11,DirectX D3D12,Vukan)亦有相应的互操作机制。

窗口显示的内容为Hilbert R Tree某一级别的子块,该子块会作为渲染线程局部缓存中的根节点,按照固定分块原则进行分块,并编码,在局部缓存上建立起一颗HilbertR Tree。使用光线投射算法对其进行体绘制,对于光线不经过的子块,不参与计算,最终经过体绘制算法在可视化终端上绘制出对应的图片。

步骤四:交互窗口的视点变换动态更新渲染线程中的希尔伯特树数据结构。

用户的旋转视图操作——3D旋转视图,在基于体绘制的渲染线程看来,仅是视点发生了旋转变化,需要改变视线的方向,重新进行计算。此时渲染线程的Hilbert R Tree未发生任何的数据更新操作。其用户操作可以命中被渲染线程的局部缓存,也就图8的表示的A操作。

用户的放大操作,可以解析成两种情况,一是需要视图窗口的变换,这个将会被OpenGL相机模型捕获,通过减小视点成像平面的距离既可以实现放大操作。当放大操作引起可视化操作图像失真时,此时就需要对原始Hilbert-R Tree移动某个子块,从新进行渲染。如图6中的放大操作。无论是哪一种情况,不需要任何额外的数据。故该放大操作表示图8中的A操作。

用户的缩小操作,可以解析成两种情况,一种是视图窗口变换,这个同放大操作类似,将会被OpenGL相机模型捕获,通过增大视点到成像平面的距离可以实现缩小操作即表示为图8中的A操作。当缩小操作引起可视化图像失真时,此时就需要对窗口显示的子块替换为其父节点子块,进行从新渲染即表示为图8中的B操作。此时当前窗口的显示节点更新为原来节点的父节点,如图6中的缩小操作。

用户的平移试图操作部分会被OpenGL视图窗口操作捕获,超出OpenGL试图平移操作的能力,将会导致当前窗口变成其兄弟节点,如图6中的平移操作。此时会引起渲染线程中的根节点替换成其兄弟节点,亦从内存中获取数据,如图8中的B操作。

用户的随机操作,可能会突破Hilbert R Tree的缓存机制,有可能会导致从压缩好的文件中从新读取压缩好的快,解压后送到全局内存建立Hilbert R Tree,如图8中的C操作,根据窗口显示内容在局部缓存中建立Hilbert R Tree,供体绘制法绘制3D图像。

10页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:图像模型数据处理方法、装置以及电子设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!