Intel Intrinsics pack 命令误解
Posted
技术标签:
【中文标题】Intel Intrinsics pack 命令误解【英文标题】:Intel Intrinsics pack commands misunderstanding 【发布时间】:2016-10-04 23:03:41 【问题描述】:刚从内在函数开始,然后发现了一些暴露我无知的东西。这是我所看到的人工版本(VS2015):
__m128i test;
//test.m128i_u16[0] = 127;
//test.m128i_u16[1] = 128;
//test.m128i_u16[2] = 129;
//test.m128i_u16[3] = 130;
//test.m128i_u16[4] = 131;
//test.m128i_u16[5] = 132;
//test.m128i_u16[6] = 133;
//test.m128i_u16[7] = 134;
test.m128i_u16[0] = 50;
test.m128i_u16[1] = 70;
test.m128i_u16[2] = 90;
test.m128i_u16[3] = 110;
test.m128i_u16[4] = 50;
test.m128i_u16[5] = 70;
test.m128i_u16[6] = 90;
test.m128i_u16[7] = 110;
__m128i result = _mm_packus_epi16 (test, test);
所以最后一个命令“使用无符号饱和将压缩的 16 位整数从 a 和 b 转换为压缩的 8 位整数,并将结果存储在 dst 中”。 如果我如图所示运行,我会得到我所期望的:
- m128i_i8 char[16]
[0] 50 char
[1] 70 char
[2] 90 chara
[3] 110 char
[4] 50 char
[5] 70 char
[6] 90 char
[7] 110 char
[8] 50 char
[9] 70 char
[10] 90 char
[11] 110 char
[12] 50 char
[13] 70 char
[14] 90 char
[15] 110 char
但是如果我交换上面的输入(使用注释值集),那么我会得到看起来是整数饱和的结果:-
m128i_i8 char[16]
[0] 127 char
[1] -128 char
[2] -127 char
[3] -126 char
[4] -125 char
[5] -124 char
[6] -123 char
[7] -122 char
[8] 127 char
[9] -128 char
[10] -127 char
[11] -126 char
[12] -125 char
[13] -124 char
[14] -123 char
[15] -122 char
我在这里缺少什么?解释,错误的命令?
【问题讨论】:
如果您制作一个表格,其中相应的输入和输出(水平或垂直)排列,您的问题会更短且更易于阅读。 【参考方案1】:您似乎将结果向量打印为包含int8_t
,而不是uint8_t
元素,即使您执行了无符号饱和。所以每一个大于 127 的值都打印为负数。
所以饱和到 0xFF 的所有内容都将打印为 -1。 (饱和到 0 的所有内容都将打印为 0,但您的 int16_t 输入都不是负数)。
另请注意,PACKUSWB 将其 输入 视为已签名,以防不清楚。
【讨论】:
以上是关于Intel Intrinsics pack 命令误解的主要内容,如果未能解决你的问题,请参考以下文章
Intel SSE Intrinsics _mm_load_si128 分段错误,