(Oblig)
En diskusjon med ChatGPT:
ChatGPT: Dette fenomenet kan forklares med hvordan moderne prosessorer bruker cache-hukommelse og hvordan
de forutsier dataadgangsmønstre.
Når du ikke sorterer data-arrayet, er tallene i det tilfeldige. Når du går gjennom arrayet, er det ingen
klar mønster til tallene du sammenligner med 127, så prosessoren har ingen måte å forutsi hvilke data den
skal hente fra hovedminnet og laste inn i cachen.
Når du sorterer data-arrayet, blir tallene ordnet i en bestemt rekkefølge. Nå, når du går gjennom arrayet, er
det en klar sekvens til tallene du sammenligner med 127. Dette gjør det mye lettere for prosessoren å forutsi
hvilke data den skal hente fra hovedminnet og laste inn i cachen.
Cache-henting er mye raskere enn å hente data fra hovedminnet, så når prosessoren kan forutsi hvilke data den
trenger å hente, kan den gjøre det på forhånd og spare tid når dataene faktisk trengs. Dette er kjent
som cache-forvarming.
Så selv om sortering av data-arrayet legger til en ekstra operasjon, gjør det dataadgangen under summen mye
mer effektiv, noe som fører til en total reduksjon i kjøretid.
Dette er et flott eksempel på hvorfor det noen ganger kan være vanskelig å forutsi ytelsen til et program
basert på antall operasjoner alene - maskinvareegenskapene og hvordan de samhandler med programmet kan ha
en stor innvirkning på den faktiske ytelsen.
-------------------------------------------------------------------------------------
Haugerud: Det kan vel ikke stemme? At dataene er sortert påvirker ikke cache, den samme sekvensen av tall
hentes inn hver gang. Og cache er i begge tilfeller varm etter første runde i løkken. Hva kan dette
ellers skyldes?
-------------------------------------------------------------------------------------
ChatGPT: Beklager for forvirringen. Du har rett, mine unnskyldninger for feilinformasjonen. Cache-
forutsigbarhet skulle ikke være en faktor her siden vi itererer gjennom hele arrayet sekvensielt
i begge tilfeller.
Det som faktisk skjer her, er relatert til prosessorens branch prediction. Moderne prosessorer prøver å
forutsi resultatet av betingede grener (som if-uttalelser) for å forbedre ytelsen. Ved å sortere arrayet,
gjør vi effektivt if (data[c] > 127)-sjekken mer forutsigbar for prosessoren, noe som fører til færre
mispredicted branches og dermed raskere utførelse.
Når arrayet er sortert, vil alle tallene større enn 127 være på slutten av arrayet, så prosessoren kan
effektivt forutsi at if-sjekken vil være false for den første halvparten av arrayet, og true for den andre
halvparten. Når arrayet ikke er sortert, er resultatet av if-sjekken tilfeldig, noe som fører til mange
mispredicted branches og dermed tregere utførelse.
Dette er et godt eksempel på hvordan detaljene i prosessorarkitekturen kan påvirke programytelsen
på uventede måter.
-------------------------------------------------------------------------------------
Haugerud: Ja, den vil vel etterhvert gjette riktig hver gang, helt til man her halvveis i arrayet.
-------------------------------------------------------------------------------------
ChatGPT: Ja, det stemmer! Når du sorterer arrayet, vil prosessoren etter hvert lære å forutsi utfallet av
if-instruksjonen korrekt. I starten vil den forutsi at utfallet alltid er false (siden alle tallene i
starten av det sorterte arrayet er mindre enn eller lik 127). Når den når midtpunktet i arrayet, vil den
merke at utfallet plutselig endrer seg til true og vil raskt tilpasse seg denne endringen, og begynner
å forutsi at utfallet vil være true.
Dermed vil prosessorens branch predictor effektivt "følge" sorteringen av arrayet og oppnå en høy grad
av nøyaktighet i sine forutsigelser, noe som gjør at koden kjører raskere.
Dette demonstrerer hvordan moderne prosessorer bruker sofistikerte teknikker for å forbedre ytelsen,
og hvordan egenskapene til dataene dine kan påvirke disse teknikkene.
-------------------------------------------------------------------------------------
Haugerud: Har dette også hatt sikkerhetsmessige konsekvenser i form av malware?
-------------------------------------------------------------------------------------
ChatGPT: Ja, prosessorfunksjoner som branch prediction og cache-mekanismer kan utnyttes av skadelig
programvare til å få tilgang til sensitiv informasjon. To kjente eksempler på dette er Spectre og Meltdown
sikkerhetsfeilene som ble oppdaget i 2018.
Spectre utnytter prosessorens branch prediction mekanismen til å lure prosessoren til å kjøre
instruksjoner som ellers ikke ville blitt kjørt, og deretter få tilgang til resultatene
av disse operasjonene gjennom cache.
Meltdown angriper en optimalisering kalt "ut-av-rekkefølge utførelse" hvor prosessoren utfører
instruksjoner i en ikke-lineær rekkefølge for å maksimere ytelsen. Meltdown kan få tilgang til data
fra andre programmer og operativsystemet ved å utnytte denne funksjonen.
Disse angrepene er mulige på grunn av den komplekse interaksjonen mellom programvare og maskinvare, og de
har ført til betydelige endringer i hvordan operativsystemer og prosessorer er designet og implementert
for å forbedre sikkerheten.