Vektorisera kod med SIMD
Upptäck tekniker för att optimera kodens prestanda genom att vektorisera operationer med SSE/AVX-instruktioner för dataparallella uppgifter.
Vektorisera kod med SIMD är en gratis lektion i Assembler och lågnivåprogrammering för x86-system på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Assembler och lågnivåprogrammering för x86-system, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.
Introduktion till vektorisering
Välkommen till den sista lektionen om SIMD! Ni har fått lära er om SSE/AVX-register och instruktioner. Nu ska vi sätta ihop allt för att vektorisera kod.
Vektorisering är en kompilatoroptimering eller en manuell kodningsteknik som omvandlar loopar så att de utför operationer på flera dataelement samtidigt, i stället för ett i taget.
Varför vektorisera? SIMD-kraft
Föreställ er att ni adderar två listor med tal. En traditionell (skalar) metod adderar ett par i taget. Med vektorisering och SIMD kan ni addera flera par i en enda instruktion.
- Skalärt:
A[0]+B[0], sedanA[1]+B[1]och så vidare. - SIMD:
(A[0], A[1], A[2], A[3]) + (B[0], B[1], B[2], B[3])på en gång!
Denna parallella bearbetning gör repetitiva uppgifter på stora datamängder dramatiskt snabbare.
Datajustering är viktig
För optimal SIMD-prestanda bör era data vara justerade i minnet. Det innebär att startadressen för ert datablock bör vara en multipel av vektorstorleken (till exempel 16 byte för SSE och 32 byte för AVX).
- Justerad åtkomst: Snabbare och använder instruktioner som
MOVAPS. - Ojusterad åtkomst: Långsammare och använder instruktioner som
MOVUPS, eftersom processorn behöver utföra extra arbete för att hämta data.
Korrekt justering hjälper processorn att hämta data effektivare och undvika prestandaförluster.
Läsa in vektordata
För att arbeta med data i SIMD-register måste ni först läsa in dem från minnet. Här är vanliga instruktioner för flyttal med enkel precision (PS):
MOVAPS XMM0, [mem]: Flyttar 4 justerade flyttal med enkel precision från minnet tillXMM0.MOVUPS XMM0, [mem]: Flyttar 4 ojusterade flyttal med enkel precision från minnet tillXMM0.
Försök alltid använda MOVAPS om era data garanterat är justerade, så får ni bättre prestanda.
Utföra vektorberäkningar
När data finns i SIMD-register kan ni utföra operationer på alla element samtidigt. Om ni till exempel vill addera två vektorer med flyttal med enkel precision:
ADDPS XMM0, XMM1: Adderar motsvarande packade flyttal med enkel precision iXMM1tillXMM0. Resultatet lagras iXMM0.
Denna enda instruktion utför fyra separata additioner parallellt!
Lagra vektorresultat
När data har bearbetats i SIMD-register vill ni lagra resultaten tillbaka i minnet. Precis som vid inläsning finns det instruktioner för både justerad och ojusterad lagring:
MOVAPS [mem], XMM0: Lagrar 4 justerade flyttal med enkel precision frånXMM0till minnet.MOVUPS [mem], XMM0: Lagrar 4 ojusterade flyttal med enkel precision frånXMM0till minnet.
Prioritera återigen MOVAPS vid lagring om målminnet är justerat.
Vektorisera en arrayaddition
Vi ska titta på ett enkelt exempel där två arrayer med flyttal med enkel precision adderas med SSE-instruktioner. Programmet adderar array1 och array2 och lagrar resultatet i result.
Vi bearbetar 4 flyttal åt gången i en loopliknande ordning och flyttar 16 byte (4 flyttal) per steg.
section .data
; Define 8 single-precision floats (4 bytes each), aligned to 16 bytes
; 'dd' defines a doubleword (4 bytes), suitable for floats
array1: align 16
dd 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0
array2: align 16
dd 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0
result: align 16
dd 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
section .text
global _start
_start:
; Process the first 4 floats (16 bytes)
movaps xmm0, [array1] ; Load 1.0, 2.0, 3.0, 4.0 into xmm0
movaps xmm1, [array2] ; Load 8.0, 7.0, 6.0, 5.0 into xmm1
addps xmm0, xmm1 ; Add packed floats: (9.0, 9.0, 9.0, 9.0)
movaps [result], xmm0 ; Store result to result[0-3]
; Process the next 4 floats (16 bytes offset)
movaps xmm0, [array1 + 16] ; Load 5.0, 6.0, 7.0, 8.0 into xmm0
movaps xmm1, [array2 + 16] ; Load 4.0, 3.0, 2.0, 1.0 into xmm1
addps xmm0, xmm1 ; Add packed floats: (9.0, 9.0, 9.0, 9.0)
movaps [result + 16], xmm0 ; Store result to result[4-7]
; Exit program (Linux specific system call)
mov eax, 1 ; sys_exit system call number
xor ebx, ebx ; exit code 0
int 0x80 ; Call kernelAndra vanliga SIMD-operationer
Utöver ADDPS tillhandahåller SSE/AVX ett stort antal instruktioner för olika packade operationer:
SUBPS: Subtraherar packade flyttal med enkel precision.MULPS: Multiplicerar packade flyttal med enkel precision.DIVPS: Dividerar packade flyttal med enkel precision.ANDPS,ORPS,XORPS: Bitvisa logiska operationer på packade flyttal.- Jämförelseinstruktioner (till exempel
CMPPS): Jämför packade flyttal.
Det viktiga är att alla arbetar med flera dataelement samtidigt.
När ska man vektorisera?
Vektorisering är en kraftfull optimering, men den är inte alltid nödvändig eller fördelaktig. Tänk på följande:
- Stora datamängder: Mest effektivt för loopar som bearbetar många element.
- Repetitiva operationer: Idealiskt för identiska operationer som tillämpas på många dataelement.
- Dataarrangemang: Fungerar bäst med sammanhängande, justerade data.
- Omkostnader: Små loopar kan få större omkostnader av att konfigurera vektorregister än den hastighetsökning som uppnås.
Kompilatorer kan ofta autovektorisera, men manuell vektorisering ger er detaljerad kontroll.
Snabbtest: vektorisering
Vilka av följande är viktiga fördelar med att vektorisera kod med SIMD-instruktioner?
Sammanfattning: SIMD-kraft
Bra jobbat! Nu har ni lärt er att använda SSE/AVX-instruktioner för att vektorisera er kod.
- Vektorisering utför operationer på flera dataelement samtidigt.
- Korrekt datajustering är avgörande för optimal prestanda.
- Instruktioner som
MOVAPS,ADDPSochMOVAPSanvänds för att läsa in, bearbeta och lagra packade data. - Vektorisering är mycket effektiv för repetitiva operationer på stora, sammanhängande datamängder.
Med denna kraftfulla teknik kan ni uppnå betydande prestandavinster i era x86-assemblerprogram. Fortsätt öva!
Lär dig Assembly med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Vektorisera kod med SIMD” gratis?
Ja – hela texten till ”Vektorisera kod med SIMD” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Assembler och lågnivåprogrammering för x86-system, kan Ni uppgradera till CoddyKit PRO. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.
Vad lär jag mig i ”Vektorisera kod med SIMD”?
Upptäck tekniker för att optimera kodens prestanda genom att vektorisera operationer med SSE/AVX-instruktioner för dataparallella uppgifter. Ni övar på Assembler och lågnivåprogrammering för x86-system med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Assembler och lågnivåprogrammering för x86-system?
Du behöver inga förkunskaper. Utbildningen i Assembler och lågnivåprogrammering för x86-system på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Vektorisera kod med SIMD”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Assembler och lågnivåprogrammering för x86-system-lektionen?
Ja. Varje Assembler och lågnivåprogrammering för x86-system-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Grunderna i x87 FPU-programmering
- Introduktion till SSE/AVX-instruktionsuppsättningar
- Vektorisera kod med SIMD
- Flyttalsprecision, avrundning och undantag