2012-02-05 55 views
1

答案似乎是否定的,因为raymarching是高度条件的,即每条光线都遵循唯一的执行路径,因为在每一步我们都会检查不透明度,终止等,这将根据单个光线的方向而变化。在SIMD架构下可以加速raymarching?

因此,似乎SIMD很大程度上无法加速这一点;相反,加速需要MIMD。

这是否有意义?或者我错过了什么?

回答

1

如前所述,你很可能使用SSE指令实现您 矢量数学得到了加速(注意影响讨论 here - 也为其他的方法)。这种方法将使代码 保持简洁和可维护性。

我承担,但是,你的问题是关于“包穿越”(或东西 喜欢它),换句话说处理多个标量值每一个 不同的射线:

原则上应该是可能的推迟阴影到另一个通行证。 一旦裸行进 通过终止并且临时结果作为输入存储为阴影 通过,则可以用新射线重新填充SIMD分组。这将允许并行化您的代码的某个特定案例相关百分比 ,以显示所有四个SIMD通道。 为了避免高速缓存压力(除非您的几何体严格为程序性),平铺图像并将其中的射线编入Morton-order可能是一个好主意。

除非您尝试,否则您不知道它是否有回报。我的猜测是,如果它 确实如此,那么加速的数量可能并不值得代码 在四条车道上的复杂性。

您是否考虑过使用SIMT架构,如可编程GPU? 最新的可编程图形卡允许您以交互式速率执行 raymarching(查看它发生在您的浏览器here)。

+0

只需[添加到您的答案](http://www.yosefk.com/blog/simd-simt-smt- parallelism-in-nvidia-gpus.html)为其他谁不确定SIMT和SIMD之间的差异。 – 2012-09-02 11:42:41

1

最后几天我为一块海绵做了一个基于软件的raymarcher。目前没有使用SIMD,我也没有使用特殊的算法。我只在X和Y的-1和1之间追踪,这是目标纹理的U和V.然后我得到了一个相机位置和一个目的地,我用它来计算raymarch的增量矢量。

之后,我使用恒定的迭代值执行,其中只有一个分支决定是否与分形体积有交集。所以如果我的相机眼睛是E,我的方向矢量是D,我必须找到最小的t。如果我发现或达到了最大距离,我会打破循环。最后我有 - 从计算片段颜色。

在我看来,应该可以通过SSE1/2来并行化这些操作,因为可以通过将矢量中的字段置零(__m64/__m128)来解决分支问题,所以进一步的SIMD操作将不适用于此处。这实际上取决于你的raymarch/-cast,但如果你只是从一个函数中计算片段颜色(就像我的分形曲线一样),而不是非线性地访问内存,有一些技巧可以使它成为可能。

当然,这个答案包含猜测,但是当我并行化这个例程时,我会通知你。

+0

谢谢,是的,如果/当你这样做的时候,请在这里放一张纸条... – 2012-05-18 11:26:39