я написал функцию strlen с инструкциями avx-512, и это мой исходный код
size_t avx512_strlen(const char * s) {
__m512i vec0, vec1;
unsigned long long mask;
const char * ptr = s;
vec0 = _mm512_setzero_epi32();
while (1) {
vec1 = _mm512_loadu_si512(s);
mask = _mm512_cmpeq_epi8_mask(vec0, vec1);
if(mask != 0) {
mask = __builtin_ctz(mask);
return (s-ptr) + mask;
}
s += 64;
}
return s-ptr;
}
есть проблема в значении '__builtin_ctz (mask)', и возвращаемое значение неверно. на самом деле, эта функция не может вычислить позицию нулевого терминатора (0x00) в последней проверке
, например, у меня есть эта строка
char str[] = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";
длина этой строки(360), но эта функция возвращает (352), из-за чего проблема возникла из части __builtin_ctz. перед выполнением '__builtin_ctz', указанная маска верна, и в последней проверке она
0001110100010001000100010000000000000000000000000000000000000000
, мы проверили 320 символов, и __builtin_ctz должен вернуть (40) (как вы можете видеть в маске, мы считаем40 нулей к первому «1», при условии, что маска верна, а «__builtin_ctz» считает ее неправильной!
В чем проблема?