SIMD_MMX_SSE
Publié : mer. 25/juil./2012 13:02
Bonjour.
Je teste les fonctionnalités SIMD, les bases pour débuter les additions de vecteurs/tableau avec des entiers. (vecteur/tableau étant des éléments contigue de meme longueur / aligné).
les petits détails :
_Est'il possible de mettre directement dans le registre xmm0 un vecteur/tableau sans passer par l'intermédaire d'un registre EAX , idem si on augmente la taille des vecteurs/tableau avec comme limite les 128 bits xmm0, donc la variable long = 15 ?
style : !mov... xmm0, [v_a]
_2 vecteurs/tableau de 64bits peuvent se tenir cote à cote dans les 128 bits d'un seul registre xmm0 , la aussi est'il possible de les aligner cote à cote ?
style : !mov.. xmm0, [v_a + v_b ] ( 64_64)

Je teste les fonctionnalités SIMD, les bases pour débuter les additions de vecteurs/tableau avec des entiers. (vecteur/tableau étant des éléments contigue de meme longueur / aligné).
Code : Tout sélectionner
;
; ADDITION_SIMD_MMX_SSE_
; 1=> test Vecteur//Tableau
; long.l = 7 // = 8*8 = 64 bits
; long.l = 15 //= 16*8 = 128 bits
long.l = 7
;
Dim veca.b(long) ;// Source 1
Dim vecb.b(long) ;// Source 2
Dim vecc.b(long) ;// Destination
;
a.l = @veca()
b.l = @vecb()
c.l = @vecc()
; Remplir Vecteur
;
For i = 0 To long
;
veca(i) = i + 1
vecb(i) = i + 10
vecc(i) = 0
Debug"======================"
Debug "Adresse "+Str(i)
Debug "Vecteur A contient = "+Str(veca(i))
Debug "Vecteur B contient = "+Str(vecb(i))
Debug "Vecteur C contient = "+Str(vecc(i))
;
Next i
;
Debug"_______________________"
Debug"_______________________"
;
;***** adition tableau_vecteur
!mov eax, [v_a] ;// source Vecteur a en memoire eax = 64 bits = 8 valeur
!movq xmm0, [eax] ;// copie en memoire xmm0/128_bits contenu eax/64_bits
;
!mov ebx, [v_b] ;// source Vecteur b en memoire ebx = 64 bits = 8 valeur
!movq xmm1, [ebx] ;// copie en memoire xmm1/128_bits contenu ebx/64_bits
;
!mov ecx, [v_c] ;// destination Vecteur c en memoire ecx = 64 bits = 8 valeur
!movq xmm2, [ecx] ;// copie en memoire xmm2/128_bits contenu ecx/64_bits
;
!paddq xmm2, xmm0 ;// adition regitres xmm2 et xmm0 / vecc + veca
!paddq xmm2, xmm1 ;// adition regitres xmm2 et xmm1 / vecc + vecb
;
!movq [ecx], xmm2 ; // resultat dans destination = vecc
;
;*******
;
For i = 0 To long
Debug"________SSE_ADITION_RESULTAT_________"
Debug "Adresse "+Str(i)
Debug "Vecteur A contient = "+Str(veca(i))
Debug "Vecteur B contient = "+Str(vecb(i))
Debug "Vecteur C contient = "+Str(vecc(i))
Next i
;
Debug""
_Est'il possible de mettre directement dans le registre xmm0 un vecteur/tableau sans passer par l'intermédaire d'un registre EAX , idem si on augmente la taille des vecteurs/tableau avec comme limite les 128 bits xmm0, donc la variable long = 15 ?
style : !mov... xmm0, [v_a]
_2 vecteurs/tableau de 64bits peuvent se tenir cote à cote dans les 128 bits d'un seul registre xmm0 , la aussi est'il possible de les aligner cote à cote ?
style : !mov.. xmm0, [v_a + v_b ] ( 64_64)
