Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ _mm_packus_epi16饱和问题_C++_C_X86_Sse_Simd - Fatal编程技术网

C++ _mm_packus_epi16饱和问题

C++ _mm_packus_epi16饱和问题,c++,c,x86,sse,simd,C++,C,X86,Sse,Simd,当我使用_mm_packus_epi16时,小于零的值将变为零,但大于127的数字将变为负值 根据这个链接,它应该是无符号饱和 但事实并非如此 有什么建议吗 代码: 由于UnsignedSaturate将16位有符号整数转换为8位无符号整数,因此需要一种处理不适合的值的方法,因此小于0的值请记住,来自有符号值的值被剪裁为0,而大于255的值被剪裁为255 如果将结果值130转换为无符号8位字符,那么如果将该数据解释为有符号8位字符,则结果值为-126 由于您使用uu m128i保存结果,因此必

当我使用_mm_packus_epi16时,小于零的值将变为零,但大于127的数字将变为负值

根据这个链接,它应该是无符号饱和

但事实并非如此

有什么建议吗

代码:

由于UnsignedSaturate将16位有符号整数转换为8位无符号整数,因此需要一种处理不适合的值的方法,因此小于0的值请记住,来自有符号值的值被剪裁为0,而大于255的值被剪裁为255

如果将结果值130转换为无符号8位字符,那么如果将该数据解释为有符号8位字符,则结果值为-126

由于您使用uu m128i保存结果,因此必须自己进行转换,即从有符号转换为无符号,除非您使用SSE的特定扩展,例如Microsoft的m128i_u8

总之:您只是解释了错误的数据。

由于UnsignedSaturate将16位有符号整数转换为8位无符号整数,因此需要一种处理不适合的值的方法,因此小于0的值请记住,来自有符号值的值被剪裁为0,而大于255的值被剪裁为255

如果将结果值130转换为无符号8位字符,那么如果将该数据解释为有符号8位字符,则结果值为-126

由于您使用uu m128i保存结果,因此必须自己进行转换,即从有符号转换为无符号,除非您使用SSE的特定扩展,例如Microsoft的m128i_u8


总而言之:您只是错误地解释了数据。

我怀疑您只是误解了输出数据,例如,将其显示为有符号8位而不是无符号。下面是一个演示程序,它可能有助于澄清问题:

#include <xmmintrin.h>
#include <stdio.h>

int main(void)
{
    __m128i resultLo = _mm_setr_epi16(800, 700, 600, 500, 400, 300, 200, 100);
    __m128i resultHi = _mm_setr_epi16(0, -100, -200, -300, -400, -500, -600, -700);
    __m128i result = _mm_packus_epi16(resultLo, resultHi);
    printf("resultLo = %vhd\n", resultLo);
    printf("resultHi = %vhd\n", resultHi);
    printf("result   = %vu\n", result);
    return 0;
}

我怀疑您只是误解了输出数据,例如,将其显示为有符号8位而不是无符号。下面是一个演示程序,它可能有助于澄清问题:

#include <xmmintrin.h>
#include <stdio.h>

int main(void)
{
    __m128i resultLo = _mm_setr_epi16(800, 700, 600, 500, 400, 300, 200, 100);
    __m128i resultHi = _mm_setr_epi16(0, -100, -200, -300, -400, -500, -600, -700);
    __m128i result = _mm_packus_epi16(resultLo, resultHi);
    printf("resultLo = %vhd\n", resultLo);
    printf("resultHi = %vhd\n", resultHi);
    printf("result   = %vu\n", result);
    return 0;
}

也许你必须初始化resultHi和resultLo。这应该像你期望的那样工作-压缩值应该都在0到255的范围内-你能发布一些重现问题的实际代码吗?我猜你只是误判了结果。resultHi和resultLo中有值。我只是希望resultHi和resultLo的16位值饱和为8位无符号Int。也许你必须初始化resultHi和resultLo。这应该像你期望的那样工作-压缩值应该都在0..255范围内-你能发布一些实际的代码来重现这个问题吗?我猜你只是误判了结果。resultHi和resultLo中有值。我只是希望resultHi和resultLo的16位值饱和到8位无符号intI,我同意你的看法,但我得到的结果很奇怪。我正试图上传调试输出的快照,但不允许。我同意你的观点,但我得到的结果很奇怪。我正试图上传调试输出的快照,但不允许我上传。
$ gcc -Wall -msse3 packus.c && ./a.out
resultLo = 800 700 600 500 400 300 200 100
resultHi = 0 -100 -200 -300 -400 -500 -600 -700
result   = 255 255 255 255 255 255 200 100 0 0 0 0 0 0 0 0
$