gpt4 book ai didi

assembly - 使用Intel SIMD SSE加载非连续值

转载 作者:行者123 更新时间:2023-12-04 17:45:27 27 4
gpt4 key购买 nike

我想用32位非连续浮点数加载128位寄存器。实际上,这些浮点数在内存中的间隔为128位。

因此,如果内存看起来像这样:

| Float 0  | Float X | Float X | Float X |
| Float 4 | Float X | Float X | Float X |
| Float 8 | Float X | Float X | Float X |
| Float 12 | Float X | Float X | Float X |

我想加载这样的向量:
| Float 0  | Float 4 | Float 8 | Float 12 |

最佳答案

希望您可以将其他数据用于某些用途,在这种情况下,加载所有内容并进行转置可能会很有用。

如果不是这样,那么只有在将数据放入向量中之后要做大量工作的情况下,SIMD才是可行的,因为将其打包到向量中非常昂贵。

@ zx485的答案中显示的movss/insertps是“正常”方式,就像您使用_mm_set_ps(f[12], f[8], f[4], f[0]);可能从编译器获取的一样

当步幅正好为4时,使用AVX,您可以在两个载荷下跨越所有四个浮子,然后进行混合。

(相关:What's the fastest stride-3 gather instruction sequence?或对于第2步,显然更值得进行向量加载和混洗。)

vmovups   ymm1, [float0]                  ; float0 and float4 in the low element of low/high lanes
vblendps ymm1, [float8 - 4], 0b00100010 ; { x x f12 f4 | x x f8 f0 }

这不是很好,因为您可能会跨过缓存线边界与其中一种负载。对于第二次加载,您可以使用 vshufps ymm0, ymm1, [float8], 0b???????实现类似的功能。

根据周围的代码,这可能会很好,尤其是如果您将AVX2用于 vpermps(具有随机控制矢量常数)或 vpermpd(具有立即数)用于跨车道随机混合以将所需的元素放入低128b channel 中。

如果没有使用AVX2进行跨 channel 混洗,则需要先 vextractf128然后 shufps。这可能需要事先进行计划,才能在此 shufps可以将元素放置在正确位置的地方放置元素。

当然,所有这些都适用于内在函数,但是它们需要进行更多的输入。

关于assembly - 使用Intel SIMD SSE加载非连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com