【问题标题】:SSE 2 and above - Why floating point data types store only 2 floating point numbersSSE 2 及更高版本 - 为什么浮点数据类型仅存储 2 个浮点数
【发布时间】:2017-12-05 08:26:57
【问题描述】:

我正在尝试使用 SSE 内在函数优化我的代码。浏览文档后,我看到 SSE 中有 __m128 数据类型用于浮点变量,能够存储 4 个浮点数。 SSE2 中有一个__m128d 只能存储 2 个浮点数?这些变量之间有什么区别? SSE2 不应该比 SSE 快吗?

【问题讨论】:

  • SSE2 不是应该比 SSE 快吗? 不,它应该提供整数和双精度浮点数的指令,而不仅仅是单精度浮点数。请参阅 SSE 标签 wiki:stackoverflow.com/tags/sse/info。也许您正在寻找 AVX,它提供 256b 寄存器:8 float 或 4 double
  • 哦。我将它们都混淆为不同的指令集!知道了。谢谢。
  • 它们是不同的指令集。 Pentium III 仅支持 SSE,因此只能将 XMM 寄存器用于标量或压缩单精度,而不是整数或双精度。 SSE2 是后来添加的。
  • 但 SSE2 仅支持双数据类型。如果我想使用浮点数据类型,我需要使用 __m128。所以 SSE2 是 SSE 的一种扩展,对吧?从某种意义上说,它只添加了 SSE 中不可用的那些函数和数据类型。
  • 是的,没错。大多数后来的扩展(SSE3、SSSE3、SSE4.1)为每种现有数据类型添加了一些指令。 (一些pxxx 整数,一些xxxps 浮点数,一些xxxpd 指令。参见hjlebbink.github.io/x86doc。其中列出了每条指令的扩展组。)

标签: x86 sse simd sse2


【解决方案1】:

SSE 指令使用 128 位寄存器。

float 使用 4 个字节 = 32 位 -> 因此您可以存储 4 个浮点数 (4*32=128),这些是 __m128

double 使用 8 个字节 = 64 位 -> 因此您可以存储 2 个双精度数 (2*64=128),这些是 __m128d

-> 更多信息https://felix.abecassis.me/2011/09/cpp-getting-started-with-sse/

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2019-08-20
    • 2021-04-09
    • 2018-11-26
    • 2013-10-21
    • 2016-03-23
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多