2013-07-01 67 views
0

我不得不用AVX指令开发一个冒泡排序算法,输入中有单精度数字。任何人都可以帮助我寻找最佳实施?AVX和Bubble Sort

我做了一个冒泡排序版本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 

回答

3

大多数排序算法一般不借给自己SIMD执行。您可能需要考虑使用network sort算法,这对于使用SIMD实现少量元素相对简单。对于更大的排序,您可以使用网络排序作为较大的非SIMD排序算法的内核“内核”。

+0

但对于我的问题,我需要实现这种类型的算法。我为sse3做了这个版本。这是我的代码,它的工作原理:http://pastebin.com/EimcJdQg 所以我必须使用AVX – Frank

+0

实现它你测量了你的SSE代码的性能吗?标量代码是否更快? –

+0

32位sse3的版本在23秒内编译100000个随机数。这个版本在33秒内在avx中http://pastebin.com/bmQtNKrq。该死的。我必须改进这个性能 – Frank