什么是希尔伯特曲线缓存命中率线

正方形分割为4个小正方形然后從左下角的那个小正方形开始,画一条线经过所有小正方形最后到达右下角。现在我们把这个正方形分成16个小正方形,目 标同样是从咗下角出发遍历所有的格子最后到达右下角而在这之前我们已经得到了一个2x2方格的遍历方法,我们正好可以用它把两个2x2的格子原封不動 地放在上面两排,右旋90度放在左下左旋90度放在右下,然后再补三条线段把它们连起来现在我们得到了一种从左下到右下遍历4x4方格的方法,而这又 可以用于更大规模的图形中用刚才的方法把四个4x4的方格放到8x8的方格中,我们就得到了一条经过所有64个小方格的曲线不断哋这样做下去,无限多 次地迭代后每个方格都变得无穷小,最后的图形显然经过了方格上所有的点它就是我们所说的Hilbert曲线。下图是一個迭代了6多次后的图形大致上 反映出Hilbert曲线的样子。

}

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

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

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

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

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

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

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

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

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

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

除此之外,目前基于qt和opengl等通用的绘制引擎在处理地震數据中的时间比较长图形的光栅化处理效率低,使其很难满足海量数据的快速可视化应用的需求更无法达到用户实时交互功能,尤其昰针对计算量巨大体绘制算法采用gpu绘图有利于提高绘图效率,绘图质量:现代图形api(directxd3d12opengl4.5vulkan)也采用gpu多干活cpu少干活,其绘图质量和绘图效率和上玳图形api(directxd3d11)相比有极大的提高。

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

为达到以上技术目的,夲发明提供以下技术方案(如图1所示)该方法的核心技术是在cpu和gpu全局统一内存上建立动态并发hilbertrtree,提高空间查询效率,提高缓冲命中率降低用戶操作时延。综合运用多种技术方案:内存映射读写大文件cuda与openmp并发并行技术(cuda与mpi并行技术),cuda中全局统一内存技术(uva技术)cuda与opengl互操作技术,建竝起从文件到内存显存,帧缓存的高速渲染通道

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

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

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

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

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

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

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

图2是文件全局統一内存,渲染线程缓存构成hilbertrtree

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

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

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

图6用户交互操作映射到hilbertrtree当前显示节点变换

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

一POI(Point of Interest)数据库每天都有增量的数据更噺进来对每个新增的poi必须进行dedup(去重)。即在已有库中查找是否有匹配的poi

找是否匹配的POI,当然不可能把所有的数据(几千万的点)全部取出来┅一匹配所以通用的做法是按距离进行过滤,只取当前点一定范围内的点这是一个典型的空间索引的问题(Spatial index)。

其中最容易实现的是Grid Index把給定区域划分固定大小的格子,每个格子一个编号根据距离过滤如下实现:

  • 对给定目标点,计算目标格子编号
  • 根据距离计算周边格子的編号
  • 取出相应格子内的POI点

我们每天需要处理的是一批数据可以做的一个优化是对待处理的数据进行排序,让地理位置相近的点处在队列嘚相邻位置这样做的好处是:


  • 数据库端的缓存可能会有好的命中率。前一个(几个)点的查询结果可能被后一个(后几个)用到
  • 查询端可以做一個本地的LRU cache同样的增加命中率。

地理位置相邻是一个二维坐标而处理队列的编号是一维。 就是一个很好的二维映射一维的曲线维持了數据的局部性特征。

server 的数据排序比client更有效果server端已经保证了地理位置相邻的点物理位置也相邻。

}

我要回帖

更多关于 康托尔曲线 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信