Это мой исходный код в сборке для strlen с использованием AVX512BW
strlen_avx512:
mov rax, rdi
test al, 63 ; aligned ?
jz .aligned_str
vmovdqu64 zmm0, zword [rax] ; unaligned load
vptestnmb k0, zmm0, zmm0
kortestq k0, k0
jz .do_align_64
kmovq rcx, k0
tzcnt rax, rcx
vzeroupper
ret
.do_align_64:
add rax, 63
and rax, -64
.aligned_str:
vmovdqa64 zmm0, ZWORD [rax]
vmovdqa64 zmm1, ZWORD [rax+64]
vmovdqa64 zmm2, ZWORD [rax+128]
vmovdqa64 zmm3, ZWORD [rax+192]
vpminub zmm4, zmm0, zmm1
vpminub zmm5, zmm2, zmm3
vpminub zmm5, zmm5, zmm4
vptestnmb k0, zmm5, zmm5 ; 0x00 ?
kortestq k0, k0
jnz .done
add rax, 256
jmp .aligned_str
.done:
sub rax, edi
vptestnmb k0, zmm0, zmm0
kortestq k0, k0
jnz .end
vptestnmb k0, zmm1, zmm1
kortestq k0, k0
jnz .end1
vptestnmb k0, zmm2, zmm2
kortestq k0, k0
jnz .end2
vptestnmb k0, zmm4, zmm4
add rax, 192
.end:
kmovq rcx, k0
tzcnt rcx, rcx
add rax, rcx
vzeroupper
ret
.end1:
add rax, 64
jmp .end
.end2:
add rax, 128
jmp .end
Эта функция работает без каких-либо проблем, но она не дает мне ожидаемой скорости! я написал AVX2-версию этой функции (с vpminub (то же, что и у этой функции)) с регистрами ymm и скоростью была очень удивительной (я вызывал эту функцию 1000000 раз), а время выполнения составляло 4 с, но в этой функции, когда я вызывал ее 1000000 раз , время выполнения было 3 с (2,9 с), я ожидаю, что это будет примерно 2 секунды или ... но это всего лишь в 1,5 раза быстрее, а не в 2 раза быстрее!
1 - я думаю, что эта функция нуждается в некотором оптимизация для ускорения ... возможно ли сделать что-то еще для ускорения этой функции?
2 - другой вопрос ... почему vzeroupper ????! ! я сгенерировал некоторый код avx512 с флагом g cc '-march = skylake-avx512' и g cc помещает vzeroupper в код, поэтому я тоже добавил его в свой исходный код, но почему !!!?
3 - и другие вопросы об этой функции ... я видел некоторые функции, которые написали 'cross_page check' и ... есть ли что-то еще, что я должен проверить в этой функции (что-нибудь о проверка страницы и ...) ???