打扰一下,我不知道确切的词汇表。
我想要实现的是类似队列的SIMD容器。
想象一下,我使用SIMD进行打包光线行进,也就是说,有四条光线一次行进距离场。 有两条光线有可能首先击中物体,然后我想从当前的SIMD寄存器中提取它们并在寄存器中获取另外两条光线ID。
我发现将一个Ray ID与一个剩余的3-Ray-ID-tuple寄存器组合起来很困难,因为SIMD的shuffle操作不能以这种方式工作。
使用一些位移/位屏蔽操作是一种解决方案,但我想知道是否有另一种优雅的方法来解决这个问题。
答案 0 :(得分:2)
这不是SIMD的工作原理,抱歉。
你可以同时运行4个相同的计算没问题。
但是,在光线行进中对高度字段进行采样已经存在一些问题。 4种不同的光线一次需要不同的样品,除非它是一个非常非常有特殊的特殊情况(平行光线,间隔为1纹素偏移,与 u 或 v平行)。换句话说,您需要一个收集操作。
大多数当前架构(您没有指定一个)不支持分散/收集,例如从高度图读取4个任意位置到一个SIMD寄存器。你当然可以这样做,但它将是4次读取和4次shuffle,它将比仅仅跳过SIMD慢。
您也无法在任意时间轻松地交换和输出任意数据,并在另一半执行不同的操作(计算的第一部分)时继续使用SIMD寄存器的一半中的一些其他代码。 SIMD就是这样不行的 在SIMD操作中,所有数据同时执行相同的指令(或者说,指令仅执行一次,但是在“多个数据”上执行)。此外,SIMD和分支是一种“不行”。分支不仅效率低下,而且还会影响每一段数据,而不仅仅是你想要的数据 如果有的话,可以使用SIMD进行条件移动,或者只使用整个批次继续计算。
答案 1 :(得分: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位浮点数据元素。