在英特尔 CPU 上将最近的 8 个顶点插值到随机采样点时,对称 3D 网格的最有效数据布局
Most efficient data layout for a symmetrical 3d mesh when interpolating nearest 8 vertices to random sampled point on Intel CPU
我有一个 3D 数据的查找表(一个 3D RGB 查找表(,其中我为每个 ri、gi、bi(r、g 和 b(预设了 f(r,g,b( 的值(r、g 和 b 不一定均匀分布(。 在这种情况下,r g 和 b 的 n 恰好相同。
r1,r2, ...., rnG1,G2, ...., gnB1,B2, ...., 十亿
我需要通过在 r,g,b 周围最近的 8 个顶点的 f(( 值之间进行插值来计算和存储来自任何输入 (r,g,b( 图像的数百万个估计 f(r,g,b( 值。连续输入的r,g,b值是RGB视频像素,不是特别可预测。它们可能相似但不完全相同,因为几十个值然后迅速变化。不过,接近中点的 R,G,B 值通常比非常极端的值更常见。f(( 值表是预设的,不会改变 - 除了 f(( 的采样间隔足够精细以至于插值顶点是一个合理的估计之外,我无法对 f(( 做出假设。我的目标是使用C++的高端英特尔 CPU。
鉴于整个表可能很大(几 MB(,并且可能不适合 L1 或 L2 缓存,是否有一种缓存高效布局,它的索引成本不是很高,并使 8 个相邻的顶点在内存中彼此靠近,以使缓存未命中的可能性降低?如果我从多个线程使用相同的 f(( 表来提高速度,它可能会表现不佳吗?
我的第一个想法是使用一个简单的线性 C 数组并计算一个索引 - ftable[r + n (g + nb(]
一种替代方法是使用 C 样式的 3d 数组及其多个查找 - ftable[r][g][b],但考虑到索引的几个加法和乘法的相对便宜,它似乎表现得更糟,而不是查找费用和潜在的 L1/L2 缓存未命中。或者,是否有一种狡猾的方法来布置 C 样式的 3D 数组,以提高缓存命中率,以查找基本上随机输入值的 8 个相邻顶点?
这是否是最有效的方法,但是KD树可以非常有效地解决您的问题。
https://en.wikipedia.org/wiki/K-d_tree
它易于实现,专为此类问题而设计。
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 如何从 3D 曲面网格中删除自相交三角形?
- CUDA 使用共享内存平铺 3D 卷积实现
- 检查框内的 3D 点
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- 在 OpenGL 中使用键盘移动 3D 形状,C++
- 是否可以制作没有内部分割的cgal 3d多多马因网格?
- 我想通过OpenGL创建3D金字塔
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- 在英特尔 CPU 上将最近的 8 个顶点插值到随机采样点时,对称 3D 网格的最有效数据布局