C++ _mm_packus_epi16饱和问题
当我使用_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_u8C++ _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保存结果,因此必
总而言之:您只是错误地解释了数据。我怀疑您只是误解了输出数据,例如,将其显示为有符号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
$