1

对不起,我不知道确切的词汇表。

我要实现的是一个类似队列的 SIMD 容器。

想象一下,我使用 SIMD 进行打包光线行进,即一次有四条光线行进距离场。有可能两条射线首先击中对象,然后我想从当前 SIMD 寄存器中提取它们并在寄存器中获取另外两条射线 ID。

我发现将一个 Ray ID 与剩余的 3-Ray-ID-tuple 寄存器组合起来非常困难,因为 SIMD 的 shuffle 操作不能以这种方式工作。

使用一些位移/位掩码操作是一种解决方案,但我想听听是否有另一种优雅的方法来解决这个问题。

4

2 回答 2

2

这不是 SIMD 的工作原理,抱歉。

您可以并行运行 4 个相同的计算没有问题。

但是,在光线行进中对高度场进行采样已经存在一些问题。4 条不同的光线一次需要不同的样本,除非这是一个非常人为的特殊情况(平行光线,以 1 texel 偏移量间隔,并且平行于uv)。换句话说,您需要一个收集操作。

大多数当前架构(您没有指定一个)不支持分散/聚集,例如从高度图中读取 4 个任意位置到一个 SIMD 寄存器中。您当然可以这样做,但是它将是 4 次读取和 4 次随机播放,并且会比一起跳过 SIMD 慢。

您也不能在任意时间轻松地交换任意数据,并在 SIMD 寄存器的一半中继续使用其他代码,同时在另一半执行不同的操作(计算的第一部分)。SIMD 就是不能那样工作
在 SIMD 操作中,所有数据同时执行相同的指令(或者更确切地说,指令只执行一次,但在“多条数据”上执行)。此外,SIMD 和分支是一种“不可行”。分支不仅效率低下,而且还会影响每条数据,而不仅仅是您想要的数据。
如果有的话,一个人使用 SIMD 条件移动,或者一个人只是继续计算整个批次。

于 2012-08-28T11:38:41.720 回答
0

您是否考虑过其他 SSE 命令仅加载低或高元素?

movss: copy a single floating-point data
movlps: copy 2 floating-point data (low packed)
movhps: copy 2 floating-point data (high packed)
movaps: copy aligned 4 floating-point data (fast)
movups: copy unaligned 4 floating-point data (slow)
movhlps: copy 2 high elements to low position
movlhps: copy 2 low elements to high position

http://www.songho.ca/misc/sse/sse.html

或者,如果您想使用 SHUFPS,我可以导出一个 Windows .exe 工具,它可以帮助您了解所有洗牌的可能性。

另外,查看AVX SIMD;它仅在最新的 Intel 和 AMD CPU 上可用,但允许一次处理 8 个 32 位浮点数据元素。

于 2012-08-29T01:28:22.993 回答