av ak » tir 09.01.2007 22:34
Det er et godt spørsmål, jeg har såvidt begynt å sette meg inn i det.
På SMP (flere prosessorer) maskiner er det viktig å kunne "forke", dvs starte en kopi av programmet som så kan flyttes over på en CPU. Ulempen med dette er at alt som den første kopien hadde i minne må kopieres. Fordelen er at de kan jobbe helt adskilt, bortsett fra et felles minneområde hvor de utveksler informasjon.
Alternativet til forking er threads. Da starter man en ny tråd, men den jobber på samme minneområde som den gamle. Dvs. at man slipper å kopierer alt som lå i minne, og de har lettere tilgang til den samme informasjonen. Ulempen er at disse vanskelig kan kjøres på to forskjellige CPUer, fordi det ødelegger for caching. I en moderne maskin så er det sjelden av CPUen spør minne, mellom 95% og 98% av alle forespørsler skal kunne besvares av cachen på CPUen. (Her er forskjellen mellom Celeron og "ordentlige" prosessorer, den har lite cache). Hvis to forskjellige CPUer behandler de samme dataene må cachene synkroniseres hele tiden, i verstefall kan man få langt dårligere ytelse enn om man bare hadde hatt en CPU.
I de nyeste CPU designene så deler to og to kjerner den samme cachen. Dvs at to stk godt kan jobbe om trådene til det samme programmet, men man bør helst ikke involvere en CPU som bruker annen cache. Dette minner litt om noe som kalles NUMA.
Kort fortalt så krever flere kjerner tilpasninger, men ikke mer enn SMP maskiner har gjort i mange år. Veldig mange programmer komme ikke til å utnytte dette, og noen problemer kan rett og slett ikke formuleres på en måte som tillater parallel beregning (f.eks. beregning av fibonaccis rekke).