cyb70289 commented on PR #51478:
URL: https://github.com/apache/arrow/pull/51478#issuecomment-5890382618

   Let ai dig into latest release binary, looks the function is vectorized in 
internal lib. Microbenchmark refuses to vectorize for some reason.
   Below are avx2 and neon assembly for `FindMinMax`.
   The conbench compare link is spinning forever, not sure if some benchmarks 
are improved by this PR.
   
   <details>
   
   <summary>avx2</summary>
   
   ```
   $ llvm-objdump -d -C --x86-asm-syntax=intel --no-show-raw-insn \
       --start-address=0x3c8910 --stop-address=0x3c8ac4 \
       pyarrow-x86/libparquet.so.2500
   
   pyarrow-x86/libparquet.so.2500:      file format elf64-x86-64
   
   Disassembly of section .text:
   
   00000000003c8910 <parquet::internal::FindMinMaxAvx2(short const*, long)>:
     3c8910:            mov     r8, rdi
     3c8913:            mov     rdi, rsi
     3c8916:            test    rsi, rsi
     3c8919:            jle     0x3c8a80 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x170>
     3c891f:            lea     rax, [rsi - 1]
     3c8923:            cmp     rax, 14
     3c8927:            jbe     0x3c8a90 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x180>
     3c892d:            mov     eax, 2147516416
     3c8932:            mov     rcx, rsi
     3c8935:            mov     rdx, r8
     3c8938:            vmovd   xmm2, eax
     3c893c:            shr     rcx, 4
     3c8940:            mov     eax, 2147450879
     3c8945:            shl     rcx, 5
     3c8949:            vmovd   xmm0, eax
     3c894d:            vpbroadcastd    ymm2, xmm2
     3c8952:            add     rcx, r8
     3c8955:            vpbroadcastd    ymm0, xmm0
     3c895a:            nop     word ptr [rax + rax]
     3c8960:            vmovdqu ymm1, ymmword ptr [rdx]
     3c8964:            add     rdx, 32
     3c8968:            vpminsw ymm0, ymm0, ymm1
     3c896c:            vpmaxsw ymm2, ymm2, ymm1
     3c8970:            cmp     rdx, rcx
     3c8973:            jne     0x3c8960 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x50>
     3c8975:            vextracti128    xmm3, ymm2, 1
     3c897b:            mov     rdx, rdi
     3c897e:            vpmaxsw xmm1, xmm3, xmm2
     3c8982:            and     rdx, -16
     3c8986:            vpsrldq xmm4, xmm1, 8           # xmm4 = 
xmm1[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
     3c898b:            mov     ecx, edx
     3c898d:            vpmaxsw xmm1, xmm1, xmm4
     3c8991:            vpsrldq xmm4, xmm1, 4           # xmm4 = 
xmm1[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
     3c8996:            vpmaxsw xmm1, xmm1, xmm4
     3c899a:            vpsrldq xmm4, xmm1, 2           # xmm4 = 
xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
     3c899f:            vpmaxsw xmm1, xmm1, xmm4
     3c89a3:            vextracti128    xmm4, ymm0, 1
     3c89a9:            vpextrw esi, xmm1, 0
     3c89ae:            vpminsw xmm1, xmm4, xmm0
     3c89b2:            vpminsw xmm0, xmm0, xmm4
     3c89b6:            vpsrldq xmm5, xmm1, 8           # xmm5 = 
xmm1[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
     3c89bb:            vpminsw xmm1, xmm1, xmm5
     3c89bf:            vpsrldq xmm5, xmm1, 4           # xmm5 = 
xmm1[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
     3c89c4:            vpminsw xmm1, xmm1, xmm5
     3c89c8:            vpsrldq xmm5, xmm1, 2           # xmm5 = 
xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
     3c89cd:            vpminsw xmm1, xmm1, xmm5
     3c89d1:            vpextrw eax, xmm1, 0
     3c89d6:            vpmaxsw xmm1, xmm2, xmm3
     3c89da:            cmp     rdi, rdx
     3c89dd:            je      0x3c8abf 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x1af>
     3c89e3:            vzeroupper
     3c89e6:            mov     r9, rdi
     3c89e9:            sub     r9, rdx
     3c89ec:            lea     r10, [r9 - 1]
     3c89f0:            cmp     r10, 6
     3c89f4:            jbe     0x3c8a53 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x143>
     3c89f6:            vmovdqu xmm2, xmmword ptr [r8 + 2*rdx]
     3c89fc:            mov     rdx, r9
     3c89ff:            and     rdx, -8
     3c8a03:            vpmaxsw xmm1, xmm1, xmm2
     3c8a07:            vpminsw xmm0, xmm0, xmm2
     3c8a0b:            add     ecx, edx
     3c8a0d:            and     r9d, 7
     3c8a11:            vpsrldq xmm2, xmm1, 8           # xmm2 = 
xmm1[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
     3c8a16:            vpmaxsw xmm1, xmm1, xmm2
     3c8a1a:            vpsrldq xmm2, xmm1, 4           # xmm2 = 
xmm1[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
     3c8a1f:            vpmaxsw xmm1, xmm1, xmm2
     3c8a23:            vpsrldq xmm2, xmm1, 2           # xmm2 = 
xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
     3c8a28:            vpmaxsw xmm1, xmm1, xmm2
     3c8a2c:            vpextrw esi, xmm1, 0
     3c8a31:            vpsrldq xmm1, xmm0, 8           # xmm1 = 
xmm0[8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
     3c8a36:            vpminsw xmm0, xmm0, xmm1
     3c8a3a:            vpsrldq xmm1, xmm0, 4           # xmm1 = 
xmm0[4,5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero
     3c8a3f:            vpminsw xmm0, xmm0, xmm1
     3c8a43:            vpsrldq xmm1, xmm0, 2           # xmm1 = 
xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
     3c8a48:            vpminsw xmm0, xmm0, xmm1
     3c8a4c:            vpextrw eax, xmm0, 0
     3c8a51:            je      0x3c8a79 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x169>
     3c8a53:            movsxd  rcx, ecx
     3c8a56:            nop     word ptr cs:[rax + rax]
     3c8a60:            movzx   edx, word ptr [r8 + 2*rcx]
     3c8a65:            cmp     ax, dx
     3c8a68:            cmovg   eax, edx
     3c8a6b:            cmp     si, dx
     3c8a6e:            cmovl   esi, edx
     3c8a71:            inc     rcx
     3c8a74:            cmp     rdi, rcx
     3c8a77:            jg      0x3c8a60 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x150>
     3c8a79:            shl     esi, 16
     3c8a7c:            or      eax, esi
     3c8a7e:            ret
     3c8a7f:            nop
     3c8a80:            mov     esi, 4294934528
     3c8a85:            mov     eax, 32767
     3c8a8a:            shl     esi, 16
     3c8a8d:            or      eax, esi
     3c8a8f:            ret
     3c8a90:            mov     eax, 2147516416
     3c8a95:            xor     edx, edx
     3c8a97:            mov     esi, 4294934528
     3c8a9c:            xor     ecx, ecx
     3c8a9e:            vmovd   xmm1, eax
     3c8aa2:            mov     eax, 2147450879
     3c8aa7:            vmovd   xmm0, eax
     3c8aab:            vpbroadcastd    xmm1, xmm1
     3c8ab0:            mov     eax, 32767
     3c8ab5:            vpbroadcastd    xmm0, xmm0
     3c8aba:            jmp     0x3c89e6 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0xd6>
     3c8abf:            vzeroupper
     3c8ac2:            jmp     0x3c8a79 
<parquet::internal::FindMinMaxAvx2(short const*, long)+0x169>
   ```
   
   </details>
   
   
   <details>
   
   <summary>neon</summary>
   
   ```
   $ objdump -d -C --no-show-raw-insn \
       --start-address=0x21130c --stop-address=0x2113d0 \
       venv/lib/python3.10/site-packages/pyarrow/libparquet.so.2500
   
   venv/lib/python3.10/site-packages/pyarrow/libparquet.so.2500:     file 
format elf64-littleaarch64
   
   
   Disassembly of section .text:
   
   000000000021130c <parquet::internal::FindMinMax(short const*, long)>:
     21130c:    mov     x5, x0
     211310:    cmp     x1, #0x0
     211314:    b.le    2113b0 <parquet::internal::FindMinMax(short const*, 
long)+0xa4>
     211318:    sub     x0, x1, #0x1
     21131c:    cmp     x0, #0x6
     211320:    b.ls    2113c0 <parquet::internal::FindMinMax(short const*, 
long)+0xb4>  // b.plast
     211324:    lsr     x3, x1, #3
     211328:    mov     x2, x5
     21132c:    movi    v31.8h, #0x80, lsl #8
     211330:    mvni    v30.8h, #0x80, lsl #8
     211334:    add     x3, x5, x3, lsl #4
     211338:    nop
     21133c:    nop
     211340:    ldr     q29, [x2], #16
     211344:    smin    v30.8h, v30.8h, v29.8h
     211348:    smax    v31.8h, v31.8h, v29.8h
     21134c:    cmp     x2, x3
     211350:    b.ne    211340 <parquet::internal::FindMinMax(short const*, 
long)+0x34>  // b.any
     211354:    smaxv   h31, v31.8h
     211358:    and     x3, x1, #0xfffffffffffffff8
     21135c:    sminv   h30, v30.8h
     211360:    sxtw    x4, w3
     211364:    smov    w2, v31.h[0]
     211368:    smov    w0, v30.h[0]
     21136c:    cmp     x1, x3
     211370:    b.eq    2113a8 <parquet::internal::FindMinMax(short const*, 
long)+0x9c>  // b.none
     211374:    nop
     211378:    nop
     21137c:    nop
     211380:    ldrsh   w3, [x5, x4, lsl #1]
     211384:    add     x4, x4, #0x1
     211388:    cmp     w3, w0
     21138c:    csel    w0, w3, w0, lt  // lt = tstop
     211390:    cmp     w3, w2
     211394:    csel    w2, w3, w2, gt
     211398:    sxth    w0, w0
     21139c:    sxth    w2, w2
     2113a0:    cmp     x1, x4
     2113a4:    b.gt    211380 <parquet::internal::FindMinMax(short const*, 
long)+0x74>
     2113a8:    bfi     w0, w2, #16, #16
     2113ac:    ret
     2113b0:    mov     w2, #0xffff8000                 // #-32768
     2113b4:    mov     w0, #0x7fff                     // #32767
     2113b8:    bfi     w0, w2, #16, #16
     2113bc:    ret
     2113c0:    mov     x4, #0x0                        // #0
     2113c4:    mov     w2, #0xffff8000                 // #-32768
     2113c8:    mov     w0, #0x7fff                     // #32767
     2113cc:    b       211380 <parquet::internal::FindMinMax(short const*, 
long)+0x74>
   ```
   
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to