如何在 SSE 中使用 imm8?

Posted

技术标签:

【中文标题】如何在 SSE 中使用 imm8?【英文标题】:How to use imm8 in SSE? 【发布时间】: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 文件。现在很好,非常感谢 【参考方案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 即使使用 -Ox。 godbolt.org/g/UbokBt。 (如果您想为要作为 imm8 arg 传递给内在函数的东西赋予符号名称,则绝对应该使用 const 或最好使用 constexpr。)

以上是关于如何在 SSE 中使用 imm8?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloud Formation 模板在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?

如何使用 SSE 指令?

如何在 Code::Blocks 上启用 SSE/SSE2?

如何在 python 中计算 SSE

Ubuntu - 如何判断 CPU 应用程序当前正在使用 AVX 还是 SSE?

AVX2 置换控制位