在GPU上优化数据可视化?

问题描述:

我有一个过程,随着时间的推移积累了大部分静态数据 - 以及它的很多数以百万计的数据元素。数据的一小部分可能会偶尔发生变化,但大部分情况并不会改变。在GPU上优化数据可视化?

但是,我想允许用户*地改变这些数据的形状和颜色。

有没有一种方法可以将数据作为数据存储在GPU上。然后有许多方法可以将数据转换为GPU上可呈现的内容。然后用户可以在这些算法中进行选择,并且我们可以高效地进行交换,而不必触摸数据。此外,颜色ID将在数据中,但用户可以改变每个ID应匹配的颜色,而不用触摸数据。

因此,举例来说,可能有如下的数据:

[1000,602,1,1] [1003 602.5,2,2]

注意:数据是NOT顶点,而是可能需要一些计算或查找来转换为顶点。

用户可以选择可视化算法。假设一个人会在(0,602,0)和(3,602.5,100)处显示两个立方体。用户选择颜色ID 1 =蓝色和2 =绿色。所以起源立方体显示为蓝色,另一个显示为绿色。

然后,根本没有对数据进行任何修改,用户选择不同的可视化,现在球体显示在(10,602,10)和(13,602.5,20),并且颜色不同,因为用户改变了颜色映射。

另一种可视化可能会显示所有数据元素,或者为每个组4个矩形之间的线路等

就是上面描述的东西,可以以简单的方式来完成?最好怎么做?

请注意,我们将添加新数据,并追加到最后。可能每秒发生数千次的爆发。现有数据的修改会更为少见,并且对这些情况的性能影响是可以接受的。用户更改算法和颜色映射相对较少。

我宁愿使用跨平台API(跨操作系统和GPU)来做到这一点,所以我假设OpenGL。

您可以将数据存储在VBO(在GPU内存中),并在更改时更新它。

在GPU方面,您可以使用几何着色器来生成更多的几何图形。不知道如何从线切换到球体,但如果您在每个位置绘制三角形,则GS可以输出“额外”三角形(线和点同上)。

至于颜色更改功能,您可以将该逻辑烘焙到顶点着色器中。 idx(1,2,...)应该是一个顶点属性;有VS查找表给idx - >颜色映射(这可以存储为一个小纹理)。您可以更新纹理以即时更改颜色映射。

+0

谢谢!有什么方法可以优化附加到VBO?因为我有时可能会很快添加数据。 另外,在几何着色器中,它是否可以一次访问多个点,以便在一种情况下可以为每个点创建一个形状,但在其他情况下,它会为每个多点创建一个形状? – mentics 2013-04-10 06:44:06

+0

'glBindBuffer'接受一个* target *参数(它暗示着这个VBO是否保存顶点或索引数据)。 'glBufferData'接受一个*用法*参数(暗示数据是静态的,动态的还是流的,以及应用程序是否会读取,复制或绘制)。 – 2013-04-10 06:49:14

+0

此外,什么确切的提示组合会给**你**最好的性能只能通过分析发现。这真的归结于您的硬件+ OpenGL驱动程序版本。 – 2013-04-10 06:55:14

对于像你这样的应用程序,有特殊的GPGPU编程基础设施:CUDA和OpenCL。 OpenCL是跨供应商系统。 CUDA是交叉平台,但仅支持NVidia GPU。此外,OpenGL在OpenGL-4.2(计算着色器)中引入了通用计算功能。

和它的很多,数据元素

百万上千万是不是一个很大量的,哪怕一个单一的元素消耗100个字节,这将是那么只有100的MIB为了transfert。现代GPU可以从主机系统内存传输大约10 GiB/s的数据。

上述描述是否可以用直接的方式完成?最好怎么做?

是的,它可以做到。但是,只有当您可以并行处理您的问题并使其内存访问模式迎合GPU的偏好时,才会真正看到性能。特别糟糕的内存访问模式会导致几个数量级的性能损失。