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 分段错误,

成员边界对齐#pragma pack(n)

成员边界对齐#pragma pack(n)

新增版本管理及版本对比,接口测试结果增加误报标记,MeterSphere开源持续测试平台v1.17.0发布

RenderScript Intrinsics 高斯模糊

Intrinsics 与 Naive Vector 减少结果的差异