gpt4 book ai didi

assembly - 如何将 4 个 32 位 float 存储到一个 128 位 xmm 寄存器中?

转载 作者:行者123 更新时间:2023-12-01 11:13:20 24 4
gpt4 key购买 nike

我想将 4 个 32 位浮点数存储到 xmm0 中,其中每个浮点数都存储在一个 128 位寄存器中。
例如,我有 4 个浮点数:
xmm1:10.2
xmm2:5.8
xmm3:9.3
xmm4:12.7(每个只使用128位寄存器的32位)
并希望它们像这样存储到 xmm0 中:
10.2、5.8、9.3、12.7
这样它们就被存储在 xmm0 中。

然后我还想在对 xmm0 进行一些数学运算后分别提取它们中的每一个(例如 mulps ..)

我试过使用 movlps 和 movhps,但它们只使用内存来加载,而不是使用 128 位寄存器作为源。由于性能原因,我不想使用任何额外的内存。

PSLLDQ 可能会有所帮助,但我的问题有更好的解决方案吗?

最佳答案

compiler output for _mm_set_ps(f3,f2,f1,f0) 或为 _mm_setr_ps(f0,f1,f2,f3)随您选择的曲调和-march选项。

或者看Agner Fog's optimization guide :他有一个关于 SSE/AVX 的章节,里面有一个按类型分类的方便的数据移动指令表。非常适合了解在高度非正交的 SSE/AVX 扩展中可以使用哪些 shuffle。

正如人们所指出的,标准方式是 2x unpcklps将对合并为 [00ba] 的向量[00dc]哪里0是一个无关紧要的值或实际上 0.0如果您的标量浮点数的上层元素碰巧为零。 (我的符号遵循 Intel 约定,图中的高元素位于左侧,因此左移将数据在符号中向左移动,并且查看具有不同元素宽度的数据不会改变您编写数据的方式。)

然后movlhps将一个 xmm 寄存器的低 qword 复制到另一个寄存器的高 qword(合并到现有值中)。

如果这对您来说不是很明显和众所周知,您应该使用 C 语言编写内在函数,并查看优化的编译器输出以了解基本方法。 clang 有一个非常好的 shuffle 优化器,可以找到更好的方法来实现你的内在逻辑到 asm。

可能有更好的方法:

这 3 条指令都是 shuffle,并且在 Intel Sandybridge 系列 CPU 上每个时钟吞吐量限制为 1 个(竞争端口 5)。

如果我们有 SSE4.1 可用于 blendps (使用即时混合控制),我们也许可以将其用作最后一步而不是随机播放。它可以在任何端口上运行。

我想我们可以使用 shufps 创建 [0c0a] 的向量和 [d0b0] . shufps的低2元素输出来自第一个 source=dst 操作数,另一半来自另一个源。

如果您的输入向量实际上是零扩展且绝对没有高垃圾,您可以使用 SSE1 orps而不是混合得到 [dcba]

关于assembly - 如何将 4 个 32 位 float 存储到一个 128 位 xmm 寄存器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904640/

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