【问题标题】:AVX and Bubble Sort [closed]AVX 和冒泡排序 [关闭]
【发布时间】:2013-06-28 17:56:59
【问题描述】:

我必须使用输入单精度数字的 AVX 指令开发冒泡排序算法。谁能帮我寻找最佳实施方案?

我为SSE3 做了一个冒泡排序版本:

global sort32

sort32: start

    mov eax, [ebp+8]        ; float* x
    mov ebx, [ebp+12]       ; int n

    call    sort

    stop

    ; --------------------------------------------------
    ; Inserire qui il proprio algoritmo di ordinamento
    ; --------------------------------------------------
    ; eax = vector start address
    ; ebx = vector length
    ; --------------------------------------------------

sort:   
    mov edi, ebx    ;contatore ciclo esterno
    sub edi, 4

ciclo_esterno:
    mov esi, 0      ;contatore ciclo interno

ciclo_interno:
    movups  xmm0, [eax+esi*4]
    jmp     verifica

; controllo se l'array da 4 non è già ordinato
verifica:
    movaps  xmm4, xmm0
    shufps  xmm4, xmm4, 10010000b
    cmpleps xmm4, xmm0
    movmskps edx, xmm4
    cmp     edx,    15
    je  incremento  

    movaps  xmm1, xmm0
    movhlps xmm1, xmm0

    movaps  xmm4, xmm0  ;confronto
    minps   xmm0, xmm1
    maxps   xmm1, xmm4

    shufps  xmm1, xmm1, 11100001b   ;inverto i massimi e riconfronto

    movaps  xmm4, xmm0  ;confronto
    minps   xmm0, xmm1
    maxps   xmm1, xmm4

    movaps  xmm4, xmm0
    shufps  xmm4, xmm4, 11100001b   ; confronto la coppia dei minimi

    cmpltps xmm4, xmm0
    movmskps edx, xmm4
    cmp     edx, 2
    je  cmp_max
    shufps  xmm0, xmm0, 11100001b   ; non sono ordinati all'interno quindi scambio

cmp_max:
    movaps  xmm4, xmm1
    shufps  xmm4, xmm4, 11100001b   ; confronto la coppia dei massimi

    cmpltps xmm4, xmm1
    movmskps edx, xmm4
    cmp edx, 2
    je  unisci
    shufps  xmm1, xmm1, 11100001b   ; non sono ordinati all'interno quindi scambio

unisci:
    movlhps xmm0, xmm1
    movups  [eax+esi*4], xmm0

incremento: 
    inc esi
    cmp esi, edi
    jg aggiorna_edi
    jmp ciclo_interno

aggiorna_edi:
    dec edi
    cmp edi, 0
    jl endl
    jmp ciclo_esterno   

endl:   ret

【问题讨论】:

    标签: assembly x86 nasm avx sse3


    【解决方案1】:

    大多数排序算法通常不适合 SIMD 实现。您可能要考虑改用network sort 算法,对于少量元素,使用 SIMD 实现该算法相对简单。对于较大的排序,您可以将网络排序用作较大的非 SIMD 排序算法的内部“内核”。

    【讨论】:

    • 但是对于我的问题,我需要实现这种类型的算法。我做了 sse3 的版本。这是我的代码,它可以工作:pastebin.com/EimcJdQg 所以我必须使用 AVX 来实现它
    • 测量 SSE 代码的性能了吗?它比标量代码更快吗?
    • sse3 32 位版本在 23 秒内编译 100000 个随机数。此版本 pastebin.com/bmQtNKrq 在 avx 中 33 秒。该死。我必须提高这个性能
    • 嗯,冒泡排序首先是一个非常糟糕的排序算法 (O(n^2)),任何代码优化都无法弥补这一点。你真的应该看看更好的排序算法(见上面的建议)。
    • 我知道这一点,但我必须为一个小项目做这个,我们必须以最好的方式实现这个算法。那么对我的代码有什么帮助吗?非常感谢
    猜你喜欢
    • 2021-08-15
    • 2011-11-22
    • 1970-01-01
    • 2012-11-14
    • 2013-02-02
    • 2015-03-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多