gpt4 book ai didi

c++ - SSE4内存比较差异位置

转载 作者:行者123 更新时间:2023-11-30 03:29:03 27 4
gpt4 key购买 nike

在尝试使用 SSE4 优化跟随时,我自己的实现让我反感:

std::distance(byteptr, std::mismatch(byteptr, ptr + lenght, dataptr).first)

这会比较 byteptr 和数据并返回字节不匹配的索引。我确实需要原始速度,因为我正在处理如此多的内存,RAM 速度已经成为瓶颈。使用 SSE4 一次获取和比较 16 个字节将提供速度提升,因为一次比较 16 个字节更快。

这是我无法正常工作的当前代码。它使用 GCC SSE 内在函数并需要 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 个字节 - 甚至超出变量的末尾。这成为页面边界上的问题,在分配到未分配内存的边界上。参见 here (scroll down to "Renat Saifutdinov") .

这可以通过仅使用源的对齐读取来避免,即使支持未对齐读取也是如此,see this SO answer .

这可能是您的代码失败的可能性之一。

关于c++ - SSE4内存比较差异位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46027952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com