SSE4存储器与差分位置进行比较
SSE4 memory compare with difference position
我自己的实现在尝试使用SSE4:
进行优化时咬住了我std::distance(byteptr, std::mismatch(byteptr, ptr + lenght, dataptr).first)
这比较了Byteptr和数据,并返回索引不匹配。我确实确实需要原始速度,因为我正在处理如此多的内存,RAM速度已经是瓶颈。在时间时与SSE4进行比较16个字节将提供速度提升,因为比较时间更快。
。这是我无法使用的当前代码。它使用GCC SSE Intersics,并且需要SSE4.2:
// define SIMD 128-bit type of bytes.
typedef char v128i __attribute__ ((vector_size(16)));
// mask of four low bits set.
const uintptr_t aligned_16_imask = (uintptr_t)15;
// mask of four low bits unset.
const uintptr_t aligned_16_mask = ~aligned_16_imask;
inline unsigned int cmp_16b_sse4(v128i *a, v128i *b) {
return __builtin_ia32_pcmpistri128(__builtin_ia32_lddqu((char*)a), *b, 0x18);
}
size_t memcmp_pos(const char * ptr1, const char * ptr2, size_t lenght)
{
size_t nro = 0;
size_t cmpsz;
size_t alignlen = lenght & aligned_16_mask;
// process 16-bytes at time.
while(nro < alignlen) {
cmpsz = cmp_16b_sse4((v128i*)ptr1, (v128i*)ptr2);
ptr1 += cmpsz;
ptr2 += cmpsz;
nro += cmpsz;
// if compare failed return now.
if(cmpsz < 16)
return nro;
if(cmpsz != 16)
break;
}
// process remainder 15 bytes:
while( *ptr1 == *ptr2 && nro < lenght) {
++nro;
++ptr1;
++ptr2;
}
return nro;
}
测试上述功能时,大部分时间都可以工作,但在某些情况下会失败。
pcmpistri
的一个已知问题是,它始终读取整个16个字节 - 甚至超出了变量的末尾。这成为页面边界上的问题,在分配给未分配的内存的边界上。请参阅此处(向下滚动到" Renat Saifutdinov")。
即使支持未对齐的读取,也可以仅使用对源的对齐读取,请参阅此答案。
这可能是您的代码失败的可能性之一。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 将值指定给向量(2D)的向量中的某个位置
- 为什么比较运算符如此快速
- 使用Unreal C++获取VR耳机的世界位置/方向
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- C++自定义比较函数
- 如何比较自定义类的std::变体
- C 比较数组中的元素并打印位置
- 如何比较限制小数位置的双重值
- SSE4存储器与差分位置进行比较
- 如何比较和存储 2 个向量的数据元素位置
- 如何通过两个值在向量中的位置进行条件比较
- 将字符串数组与用户输入的单个字符串进行比较,它还表明它在该位置找到 2 次
- 如何比较clang中的两个源位置?
- 在不知道最后一个元素的位置的情况下,向后比较两个数组