Home

SIMDoperasjoner

SIMD står for Single Instruction, Multiple Data og beskriver en teknikk der en enkelt instruksjon opererer på flere datapunkter samtidig. Ved å behandle flere datapunkter i parallell kan prosessorer oppnå betydelige ytelsesforbedringer i dataintensive oppgaver som bilde- og lydbehandling, vitenskapelige beregninger og spillgrafikk. Grunnprinsippet er at data legges i vektorregistre og operasjoner utføres på hele vektorens lengde i én syklus. Vektorbredden varierer mellom arkitekturer, typisk 128, 256 eller 512 biter. Eksempler på implementeringer inkluderer SSE og AVX fra Intel/AMD, NEON fra ARM og Altivec fra eldre PowerPC-arkitekturer. Moderne systemer kan også støtte SIMD i andre miljøer, som WebAssembly SIMD eller ulike tilpassede varianter.

Programmering med SIMD skjer vanligvis på to måter. Lavnivå intrinsics gir direkte tilgang til vektorregistre og

Ytelsene avhenger av minneadgang og datalokalitet. SIMD gir størst gevinst når dataene ligger fortløpende i minnet

kontrollerte
operasjoner,
mens
kompilatoren
kan
forsøke
å
auto-vectorisere
eksisterende
kode
hvis
det
er
mulig.
Intrinsics
støtter
operasjoner
som
addisjon,
multiplikasjon,
min,
maks,
sammenligninger,
bitvise
operasjoner
og
skift,
ofte
for
flere
datapunkter
samtidig.
For
portabilitet
brukes
ofte
abstraksjoner
eller
biblioteker
som
skjuler
ISA-spesifikke
detaljer,
eller
man
skriver
nisjekode
for
hver
plattform.
og
kan
lastes/stores
i
aligned
brøker;
ellers
kan
gevinsten
reduseres
av
minnebåndbredde,
avhengigheter
mellom
datapunkter
og
grenlogikk.
Begrensninger
inkluderer
at
ikke
alle
algoritmer
kan
SIMD-tilpasses
like
effektivt,
og
at
symbolisering
raskt
blir
ikke-portabel
på
tvers
av
ulike
ISA-er.