在英特尔 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 网格 采样 数据 有效数 有效 布局 随机 CPU 英特尔      更新时间:2023-10-16

我有一个 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

它易于实现,专为此类问题而设计。