如何在 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 位。我试过你之前说的,还是不行。现在工作。我猜我有 #includeconstexpr
,以及一些在编译时计算为常量的任何东西,即使它不是声明constexpr
。 (gcc 编译 int pos = 3;
/ _mm_extract_epi32(v, pos);
,但仅在启用优化的情况下。)事实证明 MSVC 要求您声明它 const
或 constexpr
即使使用 -Ox
。 godbolt.org/g/UbokBt。 (如果您想为要作为 imm8 arg 传递给内在函数的东西赋予符号名称,则绝对应该使用 const
或最好使用 constexpr
。)以上是关于如何在 SSE 中使用 imm8?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Cloud Formation 模板在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?
如何在 Code::Blocks 上启用 SSE/SSE2?