在上交所比较时行为奇怪
Strange behaviour when comparing in SSE
我的代码中没有收到错误。我尝试将无符号字符值的缓冲区与常量进行比较。然后我想根据比较存储 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];
,您应该得到更预期的结果。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 智能指针作为无序映射键,并通过引用进行比较
- 比较if语句中的数组值和int值
- 对于循环变体比较
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 在上交所比较时行为奇怪