Сборка strlen AVX512BW оптимизирует и ускоряет - PullRequest
0 голосов
/ 09 апреля 2020

Это мой исходный код в сборке для 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' и ... есть ли что-то еще, что я должен проверить в этой функции (что-нибудь о проверка страницы и ...) ???

...