Assembly AVX与冒泡排序
我必须开发一个冒泡排序算法,使用AVX指令,输入单精度数字。有人能帮我寻找最好的实现吗 我做了一个气泡排序版本:Assembly AVX与冒泡排序,assembly,x86,nasm,avx,sse3,Assembly,X86,Nasm,Avx,Sse3,我必须开发一个冒泡排序算法,使用AVX指令,输入单精度数字。有人能帮我寻找最好的实现吗 我做了一个气泡排序版本: 大多数排序算法通常不适合SIMD实现。您可能需要考虑使用一个算法,而对于少量元素,用SIMD实现相对简单。对于较大的排序,您可以使用网络排序作为较大的非SIMD排序算法的内部“内核”。大多数排序算法通常不适合SIMD实现。您可能需要考虑使用一个算法,而对于少量元素,用SIMD实现相对简单。对于较大的排序,您可以使用网络排序作为较大的非SIMD排序算法的内部“内核”。但对于我的问题,我
大多数排序算法通常不适合SIMD实现。您可能需要考虑使用一个算法,而对于少量元素,用SIMD实现相对简单。对于较大的排序,您可以使用网络排序作为较大的非SIMD排序算法的内部“内核”。大多数排序算法通常不适合SIMD实现。您可能需要考虑使用一个算法,而对于少量元素,用SIMD实现相对简单。对于较大的排序,您可以使用网络排序作为较大的非SIMD排序算法的内部“内核”。但对于我的问题,我需要实现这种类型的算法。我为sse3做了这个版本。这是我的代码,它是有效的:所以我必须使用AVXDid实现它。你衡量你的SSE代码的性能吗?它比标量码快吗?32位的sse3版本在23秒内编译100000个随机数。此版本在avx中仅需33秒。该死我必须改进这种性能。首先,well冒泡排序是一种非常糟糕的排序算法(O(n^2)),任何代码优化都无法弥补这一点。你真的应该看看更好的排序算法(见上面的建议)。我知道这一点,但我必须为一个小项目这样做,我们必须以最好的方式实现这个算法。对我的代码有什么帮助吗?非常感谢,但对于我的问题,我需要实现这种类型的算法。我为sse3做了这个版本。这是我的代码,它是有效的:所以我必须使用AVXDid实现它。你衡量你的SSE代码的性能吗?它比标量码快吗?32位的sse3版本在23秒内编译100000个随机数。此版本在avx中仅需33秒。该死我必须改进这种性能。首先,well冒泡排序是一种非常糟糕的排序算法(O(n^2)),任何代码优化都无法弥补这一点。你真的应该看看更好的排序算法(见上面的建议)。我知道这一点,但我必须为一个小项目这样做,我们必须以最好的方式实现这个算法。对我的代码有什么帮助吗?非常感谢
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