可以在 SIMD 架构下加速 raymarching 吗?
Posted
技术标签:
【中文标题】可以在 SIMD 架构下加速 raymarching 吗?【英文标题】:Can raymarching be accelerated under an SIMD architecture? 【发布时间】:2012-02-05 10:14:32 【问题描述】:答案似乎是否定的,因为光线行进是高度有条件的,即每条光线都遵循唯一的执行路径,因为在每一步中,我们都会检查不透明度、终止等,这些会根据单个光线的方向而有所不同。
因此,SIMD 似乎在很大程度上无法加速这一进程;相反,加速需要 MIMD。
这有意义吗?还是我错过了什么?
【问题讨论】:
【参考方案1】:如前所述,您可能会通过实施您的 使用 SSE 指令的向量数学(注意所讨论的效果 here - 也适用于其他方法)。这种方法将允许代码 保持简洁和可维护。
但是,我假设您的问题是关于“数据包遍历”(或其他 喜欢它),换句话说,处理多个标量值中的每一个 不同的光线:
原则上应该可以将着色推迟到另一个通道。 一旦裸行进,SIMD 数据包可以重新填充新的光线 pass 终止,临时结果存储为着色的输入 经过。这将允许并行化某个特定的、取决于案例的百分比 开发所有四个 SIMD 通道的代码。 平铺图像并以莫顿顺序索引其中的光线可能是 为了避免缓存压力也是一个好主意(除非您的几何图形是 严格的程序)。
除非你尝试,否则你不会知道它是否有回报。我的猜测是,如果它 确实,加速量可能不值得代码的复杂性 只有四个车道。
您是否考虑过使用 SIMT 架构,例如可编程 GPU? 最新的可编程图形板允许您执行 以交互速率进行 raymarching(在浏览器中查看 here)。
【讨论】:
对于不确定 SIMT 和 SIMD 之间差异的其他人,请致 add to your answer。【参考方案2】:最近几天,我为门格尔海绵构建了一个基于软件的 raymarcher。目前没有使用 SIMD,我也没有使用特殊算法。我只是在 X 和 Y 中从 -1 跟踪到 1,它们是目标纹理的 U 和 V。然后我得到了一个相机位置和一个目的地,我用它来计算 raymarch 的增量向量。
之后,我使用一个恒定的迭代值来执行,其中只有一个分支决定是否与分形体积有交集。所以如果我的相机眼睛是 E 并且我的方向向量是 D 我必须找到最小的 t。如果我发现或达到最大距离,我会打破循环。最后我得到了 t - 我计算了片段颜色。
在我看来,应该可以通过 SSE1/2 并行化这些操作,因为可以通过将向量 (__m64 / __m128) 中的字段归零来解决分支问题,因此此处不再适用进一步的 SIMD 操作。这真的取决于你 raymarch/-cast 的内容,但如果你只是从一个函数计算片段颜色(比如我的分形曲线)并且不以非线性方式访问内存,那么有一些技巧可以使它成为可能。
当然,这个答案包含推测,但是当我并行化这个例程时,我会通知你。
【讨论】:
【参考方案3】:例如,仅当 SSE 允许您对向量进行并行操作时。
【讨论】:
以上是关于可以在 SIMD 架构下加速 raymarching 吗?的主要内容,如果未能解决你的问题,请参考以下文章
这个 Delphi 6 位图修改代码可以用 SIMD 或其他方法加速吗?
Chrome 91 支持 WebAssembly SIMD,加速 Web 在 AI 等领域的应用