Parallel processing 在SIMD体系结构下,可以加速光线传输吗?

Parallel processing 在SIMD体系结构下,可以加速光线传输吗?,parallel-processing,real-time,gpu,simd,raytracing,Parallel Processing,Real Time,Gpu,Simd,Raytracing,答案似乎是否定的,因为光线行进是高度有条件的,即每一条光线都遵循一条唯一的执行路径,因为在每一步中,我们都会检查不透明度、终止等,这将根据单个光线的方向而变化 因此,SIMD似乎在很大程度上无法加速这一进程;相反,加速需要MIMD 这有意义吗?还是我遗漏了什么?仅在SSE允许您并行处理向量的情况下。过去几天,我为menger海绵构建了一个基于软件的raymarcher。目前没有使用SIMD,我也没有使用特殊的算法。我只是在X和Y中从-1跟踪到1,这是目标纹理的U和V。然后我得到了一个相机位置和一

答案似乎是否定的,因为光线行进是高度有条件的,即每一条光线都遵循一条唯一的执行路径,因为在每一步中,我们都会检查不透明度、终止等,这将根据单个光线的方向而变化

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


这有意义吗?还是我遗漏了什么?

仅在SSE允许您并行处理向量的情况下。

过去几天,我为menger海绵构建了一个基于软件的raymarcher。目前没有使用SIMD,我也没有使用特殊的算法。我只是在X和Y中从-1跟踪到1,这是目标纹理的U和V。然后我得到了一个相机位置和一个目的地,我用它来计算光线行进的增量向量

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

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


当然,这个答案包含猜测,但我将在并行化此例程后通知您。

如前所述,您可能会从实现 使用SSE指令的矢量数学(注意所讨论的影响 -也适用于其他方法)。这种方法将允许代码 保持简洁和可维护性

然而,我假设您的问题是关于“数据包遍历”(或其他什么) 也就是说,要处理多个标量值,每个标量值 不同光线:

原则上,应该可以将着色延迟到另一个过程。 一旦光秃秃的行军,SIMD包可以重新填充新的射线 过程终止,临时结果存储为着色的输入 通过。这将允许并行化特定的、依赖于大小写的百分比 您的代码的所有四个SIMD通道。 平铺图像并按莫顿顺序索引其中的光线可能会 为了避免缓存压力,这也是一个好主意(除非您的几何体 严格程序性)

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

您是否考虑过使用SIMT体系结构,如可编程GPU? 某种程度上最新的可编程图形板允许您执行以下操作: 以交互速率进行raymarching(请在浏览器中查看)。

仅适用于不确定SIMT和SIMD之间差异的其他人。