gpt4 book ai didi

c - 英特尔 SSE : Why does `_mm_extract_ps` return `int` instead of `float` ?

转载 作者:太空狗 更新时间:2023-10-29 16:51:02 26 4
gpt4 key购买 nike

为什么 _mm_extract_ps 返回 int 而不是 float

从 C 中的 XMM 寄存器读取单个 float 的正确方法是什么?

或者更确切地说,另一种提问方式是:_mm_set_ps 指令的反义词是什么?

最佳答案

似乎没有一个答案能真正回答问题,为什么它返回 int

原因是,extractps 指令实际上是将 vector 的一个分量复制到一个通用寄存器中。它返回一个 int 看起来确实很愚蠢,但这就是实际发生的事情 - 原始浮点值最终出现在一个通用寄存器中(它保存整数)。

如果您的编译器配置为为所有浮点运算生成 SSE,那么最接近将值“提取”到寄存器的方法是将该值混洗到 vector 的低位分量中,然后将其转换为标量漂浮。这应该会导致 vector 的该组件保留在 SSE 寄存器中:

/* returns the second component of the vector */
float foo(__m128 b)
{
return _mm_cvtss_f32(_mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 2)));
}

_mm_cvtss_f32 内在函数是免费的,它不会生成指令,它只会让编译器将 xmm 寄存器重新解释为 float,因此它可以原样返回。

_mm_shuffle_ps 将所需的值放入最低的组件中。 _MM_SHUFFLE 宏为生成的 shufps 指令生成一个立即操作数。

示例中的 2 从 127:0 寄存器的第 95:64 位获取 float (从头开始的第 3 个 32 位组件,按内存顺序)并将其放入 31:寄存器的 0 部分(开头,按内存顺序)。

生成的代码很可能会自然地返回寄存器中的值,就像任何其他浮点值返回一样,不会低效地写入内存并读回。

如果您生成的代码使用 x87 FPU 进行浮点运算(对于没有 SSE 优化的普通 C 代码),这可能会导致生成低效的代码——编译器可能会存储SSE vector 然后使用 fld 将其读回 x87 寄存器堆栈。一般来说,64 位平台不使用 x87(它们对所有 float 使用 SSE,主要是标量指令,除非编译器进行矢量化)。

我应该补充一点,我总是使用 C++,所以我不确定在 C 中按值或指针传递 __m128 是否更有效。在 C++ 中,我会使用 const __m128 &这种代码将在 header 中,因此编译器可以内联。

关于c - 英特尔 SSE : Why does `_mm_extract_ps` return `int` instead of `float` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5526658/

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