performance - 实时数据可视化示例
问题描述
我正在从事实时数据可视化项目,需要以高达 ~10Gb/秒的性能呈现原始数据。
要求能够将多达 10000 个数据轨道显示为由每个 X 坐标的最大值/最小值(信号和噪声范围)表示的条带。数据显示要流畅,占用单CPU核数不超过20%。条带是重叠的,应该使用一些颜色混合技术。系统是Linux和接口c++。计算给了我 10000strips x 1000points/0.01sec 来显示*2points min/max => 数据速率 2*10^9 点每秒或大约 8Gb/秒(大约 pcie3.0 x8 的吞吐量)。
我在图形方面的经验非常有限。我正在寻找相同的示例如何:1)以 8Gb/秒的速率将数据传递到视频卡 2)用一些统计数据填充视频卡上的矩形,例如通过每个点的条带数(或在 cpu 上执行此步骤以节省 pcie 吞吐量?) 3) 将 (2) 中的统计数据转换为点颜色并显示此矩形
我研究了 OpenGL,但对于纯 2D 来说它看起来有点过分。我可以在这个项目中使用什么技术?或者有什么我可以开始的例子吗?此外,我只需要为 linux 使用免费的库/api。
解决方案
好的,10Gbit/s 的数据大约是每秒 1GB(千兆字节)的数据。每个显示更新间隔大约有 20MB 的数据(我只是在此处进行包络估计)。考虑到关于未压缩 4k 视频的 R8G8B8 色彩空间。
不知道如何制作线性绘制的数据轨迹,而不必首先认真地重新连接人类视觉皮层。也许先投资基因编辑?
开个玩笑,你所问的,从技术上讲是完全可能的。首先,关于此评论的重要说明:
我研究了 OpenGL,但对于纯 2D 来说它看起来有点过分。
*pshht* 我告诉你一个小秘密:OpenGL是一个 2D 图形 API。所有那些 3 和 4 元素向量、矩阵、关于变换和其他东西的讨论?可以这么说,所有的“烟雾和镜子”。所有这些“3D”的东西实际上只是一些方便计算,使其更容易计算,在平面屏幕上,更高维对象的投影最终会在 2D 空间中结束。
都是实物图?这一切都发生在二维中。
我可以在这个项目中使用什么技术?
OpenGL、Vulkan、DirectX 或任何其他加速图形 API。
计算给了我 10000strips x 1000points
好的,现在你必须找到至少在一个方向上至少有 2*10000 像素的显示器(为什么是 2×?因为奈奎斯特,即采样定理)。但是一旦你得到了它,你就是金色的。也许将一堆 4k 显示器放入视频墙,并创建一个强大的多显示器设置。
要将数据传输到 GPU,您需要尽可能避免不必要的开销。
一般的想法是在 GPU 上创建一些缓冲区,以循环方式将数据流式传输到这些缓冲区。使用 OpenGL,您可以通过缓冲区对象(glGenBuffers、glBindBuffer、glBufferData、glBufferSubData)来做到这一点。
不幸的是,当前的图形 API 都被“锁定”在通过内存映射完成所有事情。是的,我明白了,通过虚拟内存做事感觉很好。但它涉及填充页表,这很昂贵。听起来可能违反直觉,定向 I/O 写入(通过 DMA)通常比通过虚拟内存映射更便宜。
但是我们不能选择它是如何完成的。在 OpenGL 中,函数 glBufferSubData可以通过定向 I/O 写入进行操作,但通常它在幕后进行页面映射舞蹈。使用 glMapBuffer 这变得明确。
在 Vulkan 中,一切都是通过映射缓冲区发生的,所以就是这样。
一旦你在 GPU 上获得了数据,你就可以编写一些着色器代码,从缓冲区对象中获取数据并使用它来控制“像素”的生成(嗯,实际上是片段,但这几乎是一回事)。令人惊讶的是,在片段着色器中绘制全屏三角形(使用剪刀测试剪裁)并从每个像素基础上的缓冲区读取通常优于现代硬件上单个线段的生成。
这是您需要做的粗略概述:
(可选,但推荐)找到一个分辨率足够高的显示器,以便真正能够显示您想要看到的内容。
(可选)对人类进行基因工程,使他们的眼睛实际上能够解决那么多细节。
掌握 OpenGL。编写一些“Hello Triangle”程序。
了解如何在各个着色器阶段从缓冲区对象中读取数据。
了解如何从顶点着色器中的缓冲区数据创建线段(不要打扰几何着色器,它们很糟糕)。
了解如何使用距离场测试从片段着色器生成绘图(即,对于每个片段(大约一个像素))测试它与绘图线的距离,并相应地着色 - 这提供了非常高质量的绘图流畅的线条,通常比线条更好的性能。
推荐阅读
- azure-active-directory - 方法调用失败 [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext] 不包含名为“AcquireTokenAsync”的方法
- scheme - 手动执行函数体替换以查看过程如何工作
- python - python“升级”连接从HTTP到TCP,如何?
- dart - Dokan 使用 REST API 更新设置错误
- c# - 如何在资产中找到所有 .cs 文件类型?
- python - Heroku 在页面更改时默认为 127.0.0.01
- openscad - OpenSCAD - 什么是节点?
- pytorch - 在对角线上获得对称 Torch 张量的优雅方法
- amazon-web-services - 无法使用 configuration_aliases 发布 terraform 模块
- python - 检测用户的角色是否高于/低于特定角色 (Discord.py)