【问题标题】:How to use imm8 in SSE?如何在 SSE 中使用 imm8?
【发布时间】:2018-01-30 19:30:42
【问题描述】:

我有一个充满 32 位整数的 __m128i 寄存器。我想从寄存器中提取第四个元素。

例如, 如果

int extract;
__m128i register = _mm_set_epi32(3,2,1,0);

然后我希望“提取”的值为 3。

似乎 _mm_extract_epi32() 应该完成这项工作。但是,它有一个 imm8 参数。


图片: description on Intel's website


我只是不明白imm8 是如何工作的(或者在这种情况下会工作)。 有人可以详细说明如何使用 imm8 作为参数吗?

【问题讨论】:

  • 您是否尝试传递 3(或者如果顺序颠倒,则可能是 8-3)作为该参数的值?不必因为符号有点不寻常而复杂。
  • 试过了,以前不行。也许是缺少一个#include 文件。现在很好,非常感谢

标签: c++ visual-studio x86 sse simd


【解决方案1】:

imm8 必须是字面常量,即在编译时已知的数字。另请注意,register 是保留字。例如

#include <smmintrin.h> // SSE 4.1

__m128i v = _mm_set_epi32(3, 2, 1, 0); // initialise v to 4 x 32 bit int values
int extract = _mm_extract_epi32(v, 3); // extract element 3

【讨论】:

  • 对,进行了更改。抱歉,我写的时候脑子里有 16 位。我试过你之前说的,还是不行。现在工作。我猜我有 #include 不知何故丢失了。谢谢!
  • 一些编译器可能需要一个 literal 常量,但大多数编译器接受任何 constexpr,以及一些在编译时计算为常量的任何东西,即使它不是声明constexpr。 (gcc 编译 int pos = 3; / _mm_extract_epi32(v, pos);,但仅在启用优化的情况下。)事实证明 MSVC 要求您声明它 constconstexpr 即使使用 -Oxgodbolt.org/g/UbokBt。 (如果您想为要作为 imm8 arg 传递给内在函数的东西赋予符号名称,则绝对应该使用 const 或最好使用 constexpr。)
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多