Ik vind je uitleg nu niet echt toelichten wat het verschil is. En eerlijk gezegd het voorbeeld van het downloaden ook niet echt duidelijk, want dat kunnen gewoon verschillende programma's zijn.
Normaal kunnen verschillende programma's (schijnbaar) tegelijk werken, doordat het operating systeem heel vaak wisselt tussen de verschillende programma's, en deze steeds verdeelt over de verschillende cores.
Dat werkt leuk voor losse programma's. Je kunt iets downloaden, tegelijk een mailtje schrijven en een muziekje luisteren.
Maar als je binnen programma ook dingen tegelijk wilt doen, moet het programma intern in "losse sub-programmaatjes" opgedeeld worden. Dit noemen we threads.
Het operating systeem behandelt dit min of meer als losse programma's, zodat deze threads ook schijnbaar tegelijk verwerkt worden.
Een goed voorbeeld is de tekstverwerker Word. Deze bestaat uit 3 threads. Eentje voor het normale tikwerk, de opmaak, enzovoort. Eentje voor de spellings- en grammaticacontrole. (Je hoeft immers niet steeds te wachten wanneer je een woord voltooid hebt, je tikt gewoon verder. Als je een bestand opent, kun je ook gewoon gaan tikken, de spellingscontrole haalt je dan in). En de derde thread is het "printen-in-de-achtergrond".
Nu denk je misschien dat e.e.a. dan efficienter werkt wanneer je minimaal 3 cores hebt, maar dat is echt niet nodig. Op een gemiddelde pc draaien al gauw 20 processen, en dat wordt gewoon keurig verdeeld over de aanwezige cores.
Ok, nu nog het verschil tussen meerdere "echte" cores, en hyperthreading. Bij hyperthreading is er geen echte tweede core, maar is er slechts een klein gedeelte aanwezig in de processor. De overige delen van de core worden gedeeld. Voordeel is dat het veel goedkoper te maken is. Nadeel is dat twee threads vaak op elkaar moeten wachten op de gedeelde onderdelen, en de snelheidswinst beperkt is.
Om een idee te geven: Met 2 echte cores draaien twee onafhankelijke programma's gewoon 2x zo snel. Met 2 echte cores en twee threads binnen één programma is de snelheidswinst eerder een factor 1,9. (Dit vanwege de overhead om de twee threads onderling te laten communiceren en af te stemmen). Intel geeft bij hyperthreading een snelheidswinst op van 1,3 (dus een "hyperthread core" zal gemiddeld 30% van de snelheid van een echte core hebben).
En natuurlijk kan e.e.a. gecombineerd worden. Dus bij een "echte" 4-core processor met hyperthreading ziet het operating system 8 verwerkingseenheden. Maar het is lang geen echte volwaardige 8-core processor. Een "echte" 6-core processor is waarschijnlijk sneller dan zo'n 4/8 core processor.
[Reactie gewijzigd door Munters op dinsdag 17 november 2009 12:38]
Mag ik nog even wat puntjes op de i zetten?
In een CPU zonder hyperthreading heb je een stukje opslag (de zogenaamde registers, de waarden waar je mee aan het rekenen bent) en een stukje dat daadwerkelijk berekeningen uit kan voeren (de ALU, de "arithmetic and logic unit"). Om een processor sneller te maken moet je met de ALU aan de slag, die moet simpelweg sneller worden (kloksnelheid omhoog), je moet er meerdere hebben (multi-core processors) of je moet hem efficiënter gebruiken (daar is hyperthreading een voorbeeld van).
Het punt is namelijk dat je RAM geheugen, in verhouding tot de processor, de laatste jaren steeds langzamer wordt (geheugen wordt sneller, maar processoren ook, en dat laatste gaat veel harder). Daarom komt het steeds vaker voor de je processor staat te wachten op het geheugen (dat data aan moet leveren), voordat ie verder kan. Oftewel: de ALU staat niks te doen.
Truc van hyperthreading: 1 ALU en 2 sets registers (ter vergelijking, een dual-core is 2 ALUs en 2 sets registers). Omdat er twee sets registers zijn ziet je OS twee processoren
er is, conceptueel, niet echt een wezenlijk verschil tussen twee single-cores of één dual-core en kunnen er dus twee threads aan worden toegewezen (elke "processor" eentje). Omdat er slechts één ALU is kan echter maar één "processor" / thread tegelijk verwerkt worden. Zodra er echter data uit het geheugen gehaald moet worden voor deze thread boek je winst: normaal staat de ALU dan een hele tijd niks te doen, maar met hyperthreading kan de ALU meteen "overgeschakeld" worden naar de andere thread, die dan verwerkt kan worden.
Blijft er nog één vraag over: waarom niet gewoon een dual-core maken? Nou ja, dat kost meer ruimte op je chip. Een set registers neemt weinig ruimte in beslag, dat past makkelijk, een set registers
plus een volledige ALU neemt meer plek in beslag. Uiteindelijk is één hyperthreaded core een "tussen-station" tussen een "gewone" single-core en een "gewone" dual-core.
Ik heb geen persoonlijke ervaring met hyperthreading (geef mij maar AMDtjes

) dus ik kan je niet vertellen hoe goed het in de praktijk werkt. Het is in theorie mogelijk (vanwege een beetje overhead) dat een hyperthreaded core net iets langzamer is dan een "gewone" core. In het gunstigste (theoretische!) geval kan het twee keer zo snel zijn. In de praktijk zal het er ergens tussenin liggen (volgens Munters hierboven dus 30% volgens Intel).
Truc van hyperthreading: 1 ALU en 2 sets registers
Het is meer dan dat.
Elke CPU heeft velen functional units, daar vallen inderdaad dingen als de ALU onder, maar ook diverse andere dingen. Veel van deze FU's zijn in meervoud uitgevoerd, met het idee dat de CPU instructies van 1 thread parallel kan uitvoeren (ILP). Alleen, het wordt steeds moeilijker om alle FU's ook daadwerkelijk bezig te houden.
Met hyperthreading probeer je gewoon je spare FU's bezig te houden met instructies vanuit je andere threads. Dikwijls ontstaan er toch weer afhankelijkheden, omdat er toch enige dependencies zijn. Als je totaal geen dependencies had, zou je het gewoon modelleren als een 2de core.
Ok, mijn uitleg was inderdaad niet helemaal compleet, maar geloof dat het plaatje nu wel duidelijk genoeg geschetst is
Echt ervaring heb ik niet met het voordeel van hyperthreading met mijn core i7, heb hem nog nooit helemaal vol getrokken, of vergeleken met hyperthreading uit. Maar het blijft wel machtig mooi om 8 grafiekjes te zien in task manager

Maar het blijft wel machtig mooi om 8 grafiekjes te zien in task manager
Op mijn dual CPU workstation geeft top en mpstat -P ALL er zelfs 16 weer
(2x quad-core nehalem + hyper threading

)