在SIMD架构下可以加速光线传输吗?

时间:2012-02-05 10:14:33

标签: parallel-processing real-time gpu simd raytracing

答案似乎是否定的,因为光线追踪是高度条件的,即每条光线都遵循一条独特的执行路径,因为在每一步我们检查不透明度,终止等,这将根据单个光线的方向而变化。 / p>

因此,似乎SIMD在很大程度上无法加速这一点;相反,MIMD将是加速所必需的。

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

3 个答案:

答案 0 :(得分:1)

最后几天,我为一块海绵制造了一个基于软件的射线追踪器。目前没有使用SIMD,我也没有使用特殊算法。我只是在X和Y中从-1跟踪到1,它们是目标纹理的U和V.然后我得到了一个摄像机位置和一个目的地,我用它来计算射线场的增量矢量。

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

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

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

答案 1 :(得分:1)

如上所述,你可能会从实施你的速度加快 使用SSE指令的矢量数学(请注意所讨论的效果 here - 也适用于其他方法)。这种方法将允许代码 保持简洁和可维护。

但我认为,你的问题是关于“数据包遍历”(或者其他东西) 喜欢它,换句话说,每个处理多个标量值 不同的光线:

原则上应该可以将阴影推迟到另一次传递。 一旦裸步,SIMD数据包可以用新射线重新填充 pass终止,临时结果存储为着色的输入 通过。这将允许并行化某个与案例相关的百分比 您的代码显示所有四个SIMD通道。 平铺图像并以Morton顺序索引其中的光线可能是 一个好主意,以避免缓存压力(除非你的几何是 严格程序性的。)

除非你尝试,否则你不会知道它是否会得到回报。我的猜测是,如果它 是的,加速量可能不值得代码的复杂化 只有四个车道。

您是否考虑过使用SIMT架构,例如可编程GPU? 最新的可编程图形板可让您执行 以互动费率进行光线追踪(请在您的浏览器here中查看)。

答案 2 :(得分:0)

例如,只有SSE允许您对矢量并行执行操作。