Arhitectura modernă x86_64 include unități hardware masive pentru SIMD (Single Instruction, Multiple Data). În loc să adunați câte un număr pe rând într-un registru de uz general (RAX, RBX), extensiile SSE și AVX permit procesarea în paralel a mai multor numere întregi sau reale într-un singur ciclu de ceas.
Adunarea vectorială a 4 numere float simultan folosind registrele XMM (SSE)
section .data
align 16
vector_a: dd 1.0, 2.0, 3.0, 4.0 ; 4 numere float pe 32 de biți (16 octeți total)
vector_b: dd 10.0, 20.0, 30.0, 40.0
section .bss
align 16
vector_rezultat: resd 4
section .text
global aduna_vectori_simd
aduna_vectori_simd:
; Încărcăm 4 valori float în registrul de 128 de biți XMM0:
movaps xmm0, [vector_a]
; Încărcăm 4 valori float în XMM1:
movaps xmm1, [vector_b]
; ADDPS = Add Packed Single-Precision (adună toate cele 4 perechi în paralel!):
; xmm0[0] = 1.0 + 10.0 = 11.0
; xmm0[1] = 2.0 + 20.0 = 22.0
; xmm0[2] = 3.0 + 30.0 = 33.0
; xmm0[3] = 4.0 + 40.0 = 44.0
addps xmm0, xmm1
; Salvăm rezultatul înapoi în memorie:
movaps [vector_rezultat], xmm0
ret
| Extensie SIMD | Registre | Lățime Registru | Capacitate paralelă |
|---|---|---|---|
| SSE (1 – 4.2) | XMM0 - XMM15 |
128 biți (16 octeți) | 4 numere float sau 2 numere double sau 16 caractere char |
| AVX / AVX2 | YMM0 - YMM15 |
256 biți (32 octeți) | 8 numere float sau 4 numere double sau 8 întregi int32 |
| AVX-512 | ZMM0 - ZMM31 |
512 biți (64 octeți) | 16 numere float sau 8 numere double |
Întrebări & Exemple de Cod:
Registre Vectoriale SIMD (SSE și AVX) în x86_64: XMM, YMM și Paralelism de DateAi o nelămurire despre utilizarea comenzii
Registre Vectoriale SIMD (SSE și AVX) în x86_64: XMM, YMM și Paralelism de Datesau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.