对不起,我不知道确切的词汇表。
我想要实现的是一个类似队列的SIMD容器。
想象一下,我用SIMD进行压缩射线行进,也就是说,一次有四条射线在距离场上行进。有一种可能性是,其中两条光线首先击中对象,然后我想从当前SIMD寄存器中提取它们,并在寄存器中获取另两条光线ID。
我发现将一个Ray ID与一个剩余的3-Ray-ID元组寄存器相结合非常困难,因为SIMD的混洗操作不能以这种方式工作。
使用一些比特移位/比特掩蔽操作是一种解决方案,但我想知道是否有另一种优雅的方法来解决这个问题。
对不起,SIMD并不是这样工作的。
你可以并行运行4个相同的计算,没有问题。
然而,在光线行进中对高度场进行采样已经存在一些问题。一次4条不同的光线将需要不同的样本,除非是非常非常有贡献的特殊情况(平行光线,以恰好1个texel偏移间隔,并平行于u或v)。换句话说,您需要一个聚集操作。
大多数当前的体系结构(您没有指定)不支持分散/聚集,例如,将高度图中的4个任意位置读取到一个SIMD寄存器中。你当然可以这样做,但这将是4次读取和4次洗牌,而且比一起跳过SIMD要慢。
您也不能在任意时间轻松地交换任意数据,并在SIMD寄存器的一半继续使用其他代码,同时在另一半执行不同的操作(计算的第一部分)SIMD就是不能那样工作
在SIMD操作中,所有数据同时执行相同的指令(或者更确切地说,指令只执行一次,但对"多条数据"执行)。此外,SIMD和分支有点"不可行"。分支不仅效率低下,而且还会影响每一条数据,而不仅仅是您想要的数据
如果有什么不同的话,可以使用SIMD的条件移动,或者只继续整个批次的计算。
您是否考虑过其他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;它只在最新的英特尔&AMD CPU,但允许同时处理8个32位浮点数据元素。