Assembly-sprog og x86-systemprogrammering på lavt niveau · Lektion

Introduktion til SSE/AVX-instruktionssæt

Få et overblik over moderne SIMD-instruktionssæt (SSE, AVX) og deres registre, som er udviklet til parallel databehandling.

Lektion 2 af 411 trin

Introduktion til SSE/AVX-instruktionssæt er en gratis Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Assembly-sprog og x86-systemprogrammering på lavt niveau, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.

Velkommen til SIMD!

I denne lektion udforsker vi effektive instruktionssæt, der er udviklet til parallel behandling: SSE og AVX. Disse udvidelser gør det muligt for CPU'en at udføre den samme operation på flere datastykker samtidigt.

Denne teknik, der kaldes Single Instruction, Multiple Data (SIMD), er afgørende for at gøre opgaver som grafikgengivelse, videnskabelige beregninger og videobehandling hurtigere.

Skalar- og vektorbehandling

Forestil dig, at du skal lægge to lister med tal sammen. En traditionel skalarprocessor lægger dem sammen ét par ad gangen:

  • Det første tal + det første tal
  • Det andet tal + det andet tal
  • ... og så videre.

En vektorprocessor, der bruger SIMD, kan lægge flere par sammen i én instruktion, hvilket er betydeligt hurtigere for store datasæt.

Introduktion til SSE

SSE står for Streaming SIMD Extensions. SSE blev introduceret af Intel og tilføjede 128 bit brede registre og instruktioner til x86-processorer.

Det betyder, at en SSE-instruktion kan behandle 128 bit data på én gang. For kommatal med enkeltpræcision, hvor hvert tal fylder 32 bit, gør det det muligt at behandle fire tal samtidigt.

SSE-registre: XMM0-XMM15

SSE bruger et dedikeret sæt på 16 XMM-registre, navngivet fra XMM0 til XMM15. Hvert XMM-register er 128 bit bredt.

  • De kan indeholde fire 32-bit-kommatal med enkeltpræcision.
  • Eller to 64-bit-kommatal med dobbeltpræcision.
  • Eller seksten 8-bit-heltal.

Disse registre er adskilt fra registrene til generelle formål, f.eks. EAX og EBX.

SSE-databevægelse: MOVAPS

Lad os se på en grundlæggende SSE-instruktion: MOVAPS. Denne instruktion flytter justerede pakkede kommatal med enkeltpræcision. Den indlæser 128 bit data fra hukommelsen i et XMM-register.

Prøv at køre dette eksempel, som bruger NASM-syntaks til Linux x86-64:

section .data
  ; Define 4 single-precision floats (128 bits total)
  my_sse_data dd 1.0, 2.0, 3.0, 4.0

section .text
  global _start

_start:
  ; Load 128 bits from my_sse_data into XMM0
  movaps xmm0, [my_sse_data]

  ; XMM0 now holds [1.0, 2.0, 3.0, 4.0]

  ; Exit the program (Linux x86/x64 syscall)
  mov eax, 1    ; sys_exit
  xor ebx, ebx  ; exit code 0
  int 0x80      ; Invoke kernel

Ud over SSE: AVX

AVX, eller Advanced Vector Extensions, er en videreudvikling af SIMD-behandling. AVX udvider SIMD-registrene til 256 bit, så der behandles dobbelt så meget data pr. instruktion som med SSE.

AVX introducerede også et nyt instruktionskodningsskema, VEX-præfikset, samt ikke-destruktive operationer. Det betyder, at destinationsregistre som standard ikke overskriver kilderegistre.

AVX-registre: YMM0-YMM15

AVX introducerede 16 nye YMM-registre, fra YMM0 til YMM15. Hvert YMM-register er 256 bit bredt.

  • Et YMM-register kan indeholde otte 32-bit-kommatal med enkeltpræcision.
  • Eller fire 64-bit-kommatal med dobbeltpræcision.

De nederste 128 bit i hvert YMM-register overlapper det tilsvarende XMM-register. For eksempel er den nederste halvdel af YMM0 XMM0.

AVX-databevægelse: VMOVAPS

AVX-modstykket til MOVAPS er VMOVAPS. Præfikset 'V' angiver en VEX-kodet AVX-instruktion. Denne instruktion flytter justerede pakkede kommatal med enkeltpræcision, men nu 256 bit ad gangen.

Her er et eksempel, der viser, hvordan du indlæser 8 kommatal i et YMM-register:

section .data
  ; Define 8 single-precision floats (256 bits total)
  my_avx_data dd 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0

section .text
  global _start

_start:
  ; Load 256 bits from my_avx_data into YMM0
  vmovaps ymm0, [my_avx_data]

  ; YMM0 now holds [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]

  ; Exit the program (Linux x86/x64 syscall)
  mov eax, 1    ; sys_exit
  xor ebx, ebx  ; exit code 0
  int 0x80      ; Invoke kernel

Vigtige forskelle: SSE og AVX

Selvom både SSE og AVX er SIMD-udvidelser, indeholder AVX væsentlige forbedringer:

  • Registerstørrelse: SSE bruger 128-bit XMM-registre, mens AVX bruger 256-bit YMM-registre.
  • Datagennemløb: AVX kan behandle dobbelt så meget data pr. instruktion som SSE.
  • Ikke-destruktive operationer: Mange AVX-instruktioner tillader et format med tre operander, så kildeoperanderne bevares.
  • VEX-præfiks: AVX-instruktioner bruger et VEX-præfiks, som muliggør mere fleksibel kodning og fremtidige udvidelser.

Hurtigt tjek: SIMD-registre

Hvilke af følgende udsagn om SSE- og AVX-registre er SANDE?

Opsummering: SIMDs styrke

Vi har introduceret SSE og AVX, effektive SIMD-instruktionssæt, der gør det muligt for CPU'en at udføre operationer på flere dataelementer samtidigt. Du har lært om:

  • Begrebet SIMD og fordelene ved parallel behandling.
  • SSE med 128-bit XMM-registre (XMM0-XMM15).
  • AVX med 256-bit YMM-registre (YMM0-YMM15).
  • Grundlæggende instruktioner til databevægelse som MOVAPS og VMOVAPS.

En forståelse af disse instruktionssæt er afgørende for optimering af ydeevnen i dataintensive opgaver.

Gratis at komme i gang

Lær Assembly med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Introduktion til SSE/AVX-instruktionssæt” gratis?

Ja — hele teksten til “Introduktion til SSE/AVX-instruktionssæt” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset, skal du opgradere til CoddyKit PRO. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Introduktion til SSE/AVX-instruktionssæt”?

Få et overblik over moderne SIMD-instruktionssæt (SSE, AVX) og deres registre, som er udviklet til parallel databehandling. Du øver dig i Assembly-sprog og x86-systemprogrammering på lavt niveau med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Assembly-sprog og x86-systemprogrammering på lavt niveau?

Der kræves ingen tidligere erfaring. Assembly-sprog og x86-systemprogrammering på lavt niveau på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Introduktion til SSE/AVX-instruktionssæt”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion?

Ja. Alle Assembly-sprog og x86-systemprogrammering på lavt niveau-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende x87 FPU-programmering
  2. Introduktion til SSE/AVX-instruktionssæt
  3. Vektorisering af kode med SIMD
  4. Præcision, afrunding og undtagelser ved flydende tal
← Tilbage til Assembly-sprog og x86-systemprogrammering på lavt niveau