在上交所比较时行为奇怪

Strange behaviour when comparing in SSE

本文关键字:上交所 比较      更新时间:2023-10-16

我的代码中没有收到错误。我尝试将无符号字符值的缓冲区与常量进行比较。然后我想根据比较存储 1 或 0。这是我的代码(在结构中(:

void operator()(const uint8* src, int32 swidth, int32 sheight, uint8* dst, uint8 value) {
   uint8 t[16];
   __m128i v_one = _mm_set1_epi8((uint8)1);
   __m128i v_value = _mm_set1_epi8(value);
   printf("value = %dn", value);
   SHOW(t, v_one);
   SHOW(t, v_value);
   std::cout << "****" << std::endl;
   for (int32 i = 0; i < sheight; ++i) {
      const uint8* sdata = src + i * swidth;
      uint8* ddata = dst + i * swidth;
      int32 j = 0;
      for ( ; j <= swidth - 16; j += 16) {
         __m128i s = _mm_load_si128((const __m128i*)(sdata + j));
         __m128i mask = _mm_cmpgt_epi8(s, v_value);
         SHOW(t, s);
         SHOW(t, mask);
         std::cout << std::endl;
      }
   }
}

的第一行是我所期望的:

value = 100
  1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100

但是我的比较是错误的:

214 100 199 203 232  50  85 195  70 141 121 160  93 130 242 233
  0   0   0   0   0   0   0   0   0   0 255   0   0   0   0   0

我真的不知道错误在哪里。

SHOW宏为:

#define SHOW(t, r)                  
  _mm_storeu_si128((__m128i*)t, r); 
  printf("%3d", (int32)t[0]);       
  for (int32 k = 1; k < 16; ++k)    
    printf(" %3d", (int32)t[k]);    
  printf("n")

您正在将s数组中的元素与value数组进行比较。

value数组中的所有值均为 100。s数组中混合了值。

但是,_mm_cmpgt_epi8处理有符号值,由于这些是字节,因此它会考虑从 -128 到 +127 的值。

因此,唯一可能> 100 的值是 101 到 127 范围内的值。

由于您在该范围内只有 1 个值 (121(,因此这是唯一设置了掩码的值。

要看到这一点,请将uint8 t[16];更改为int8 t[16];,您应该得到更预期的结果。