Multithreading (datorarkitektur)
Interleaved/Temporal multithreadingEdit
Grovkornig multithreadingEdit
Den enklaste typen av multithreading inträffar när en tråd körs tills den blockeras av en händelse som normalt skulle skapa en långsam fördröjning. Ett sådant stopp kan vara en cachemiss som måste få tillgång till ett minne utanför chipet, vilket kan ta hundratals CPU-cykler innan data kommer tillbaka. Istället för att vänta på att det ska lösa sig, skulle en processor med trådar växla över utförandet till en annan tråd som är redo att köras. Först när uppgifterna för den tidigare tråden hade anlänt skulle den tidigare tråden placeras tillbaka på listan över trådar som är redo att köras.
Till exempel:
- Cykel i: instruktion j från tråd A utfärdas.
- Cykel i + 1: instruktion j + 1 från tråd A utfärdas.
- Cykel i + 2: instruktion j + 2 från tråd A utfärdas, vilket är en inläsningsinstruktion som missar i alla cacheminnen.
- Cykel i + 3: Trådplaneringen anropas, växlar till tråd B.
- Cykel i + 4: Instruktion k från tråd B utfärdas.
- Cykel i + 5: Instruktion k + 1 från tråd B utfärdas.
Konceptuellt sett liknar det kooperativ multitasking som används i realtidsoperativsystem, där uppgifter frivilligt avstår från exekveringstid när de behöver vänta på någon typ av händelse. Denna typ av multithreading kallas block-, kooperativ eller grovkornig multithreading.
Målet med maskinvarustödet för multithreading är att möjliggöra snabb växling mellan en blockerad tråd och en annan tråd som är redo att köras. För att uppnå detta mål är hårdvarukostnaden att replikera de programsynliga registren samt vissa processorkontrollregister (t.ex. programräknaren). Att växla från en tråd till en annan tråd innebär att maskinvaran växlar från en registeruppsättning till en annan. För att växla effektivt mellan aktiva trådar måste varje aktiv tråd ha en egen registeruppsättning. För att snabbt växla mellan två trådar måste till exempel registerhårdvaran instansieras två gånger.
Tillkommande hårdvarustöd för flertrådig tråd gör det möjligt att växla trådar på en CPU-cykel, vilket ger prestandaförbättringar. Ytterligare maskinvara gör det också möjligt för varje tråd att bete sig som om den utfördes ensam och inte delade några maskinvaruresurser med andra trådar, vilket minimerar mängden programvaruändringar som behövs i programmet och operativsystemet för att stödja multitrådning.
Många familjer av mikrokontroller och inbäddade processorer har flera registerbanker för att möjliggöra snabb kontextomkoppling för interrupts. Sådana system kan betraktas som en typ av blockmultitrådning mellan användarprogrammets tråd och avbrottstrådarna.
Interleaved multithreadingEdit
Syftet med interleaved multithreading är att ta bort alla databeroende stalls från exekveringspipeline. Eftersom en tråd är relativt oberoende av andra trådar är risken mindre att en instruktion i ett pipelineringssteg behöver en utgång från en äldre instruktion i pipelinen. Begreppsmässigt liknar det preemptive multitasking som används i operativsystem; en analogi skulle vara att det tidsintervall som ges till varje aktiv tråd är en CPU-cykel.
Till exempel:
- Cykel i + 1: en instruktion från tråd B utfärdas.
- Cykel i + 2: en instruktion från tråd C utfärdas.
Denna typ av multithreading kallades först för barrel processing, där stavarna i en tunna representerar pipeline-stegen och deras exekverande trådar. Interleaved, preemptive, fine-grained eller time-sliced multithreading är mer modern terminologi.
Förutom de hårdvarukostnader som diskuteras i blocktypen av multithreading har interleaved multithreading en extra kostnad för att varje pipeline-steg ska kunna spåra tråd-ID:t för den instruktion som behandlas. Eftersom det är fler trådar som exekveras samtidigt i pipelinen måste också delade resurser som cacheminnen och TLB:er vara större för att undvika thrashing mellan de olika trådarna.
Simultan flertrådningRedigera
Den mest avancerade typen av multithreading gäller superskalära processorer. Medan en normal superskalär processor utfärdar flera instruktioner från en enda tråd varje CPU-cykel, kan en superskalär processor vid samtidig multitrådning (SMT) utfärda instruktioner från flera trådar varje CPU-cykel. Eftersom varje enskild tråd har en begränsad mängd parallellitet på instruktionsnivå försöker denna typ av multitrådning utnyttja den parallellitet som finns tillgänglig i flera trådar för att minska slöseriet i samband med oanvända utgivningsplatser.
Till exempel:
- Cykel i: instruktionerna j och j + 1 från tråd A och instruktionen k från tråd B utfärdas samtidigt.
- Cykel i + 1: instruktionerna j + 2 från tråd A, instruktionerna k + 1 från tråd B och instruktionen m från tråd C utfärdas alla samtidigt.
- Cykel i + 2: instruktion j + 3 från tråd A och instruktionerna m + 1 och m + 2 från tråd C utfärdas alla samtidigt.
För att skilja de andra typerna av multithreading från SMT används termen ”temporal multithreading” för att beteckna när instruktioner från endast en tråd kan utfärdas åt gången.
Inom de hårdvarukostnader som diskuterats för interleaved multithreading har SMT den extra kostnaden att varje pipeline-steg spårar tråd-ID för varje instruktion som behandlas. Återigen måste delade resurser som cacheminnen och TLBs dimensioneras för det stora antalet aktiva trådar som behandlas.
Implementeringarna omfattar DEC (senare Compaq) EV8 (ej slutförd), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT och AMD Bulldozer och Zen-mikroarkitekturerna.