Register hernoemen

In computertechniek verwijst register-hernoeming naar een techniek die wordt gebruikt om onnodige seriële uitvoering van programma-instructies te voorkomen omdat dezelfde registers door die instructies worden hergebruikt.

 

Probleemstelling

Programma's zijn samengesteld uit instructies die werken op waarden. De instructies moeten deze waarden een naam geven om ze van elkaar te onderscheiden. Een typische instructie luidt: tel X en Y op en stop het resultaat in Z. In deze instructie zijn X, Y en Z de namen van opslaglocaties.

Met het oog op een compacte instructiecodering hebben de meeste processorinstructiesets een kleine reeks speciale locaties die rechtstreeks kunnen worden benoemd. De x86-instructieset heeft bijvoorbeeld 8 integer registers, x86-64 heeft er 16, veel RISC's hebben er 32, en IA-64 heeft er 128. Bij kleinere processoren komen de namen van deze locaties rechtstreeks overeen met elementen van een registerbestand.

Verschillende instructies kunnen verschillende hoeveelheden tijd in beslag nemen (bv. CISC-architectuur). Een processor kan bijvoorbeeld honderden instructies uitvoeren terwijl een enkele instructie van het laden uit het hoofdgeheugen aan de gang is. Kortere instructies die worden uitgevoerd terwijl het laden nog niet is voltooid, zullen als eerste klaar zijn, zodat de instructies buiten de oorspronkelijke programmavolgorde worden uitgevoerd. Out-of-order execution is in de meeste recente krachtige CPU's gebruikt om een deel van de snelheidswinst te behalen.

Beschouw deze volgorde van instructies op een CPU die niet in volgorde werkt:

1.LOAD R1, LOC MEM[1024] 2.R1 = R1 + 2 3.STORE R1, LOC MEM[1024+8] 4.LOAD R1, LOC MEM[2048] 5.R1 = R1 + 4 6.STORE R1, LOC MEM[2048+8]


 De instructies 4, 5 en 6 zijn onafhankelijk van de instructies 1, 2 en 3, maar de processor kan 4
niet afmaken voordat 3 klaar is, omdat 3 dan de verkeerde waarde zou schrijven.

Probleemoplossing

Wij kunnen deze beperking opheffen door de namen van sommige registers te veranderen:

1.LOAD R1, LOC MEM[1024] 2.R1 = R1 + 2 3.STORE R1, LOC MEM[1024+8] 4.LOAD R2, LOC MEM[2048] 5.R2 = R2 + 4 6.STORE R2, LOC MEM[2048+8]

Nu kunnen instructies 4, 5 en 6 parallel met instructies 1, 2 en 3 worden uitgevoerd, zodat het programma sneller kan worden uitgevoerd.

Indien mogelijk doen compilers deze hernoeming. Maar compilers worden beperkt door het aantal registers in de CPU. Veel krachtige CPU's hebben meer fysieke registers dan rechtstreeks in de instructieset kunnen worden benoemd, en zij kunnen de registers in de hardware hernoemen om beter parallellisme op instructieniveau te bereiken.

Alles wat gelezen en geschreven wordt, kan een andere naam krijgen. De registers voor algemene doeleinden en drijvende komma zijn het meest, maar ook vlag- en statusregisters of zelfs afzonderlijke statusbits worden vaak hernoemd.

Geheugenplaatsen kunnen ook worden hernoemd, hoewel dit niet vaak gebeurt op het niveau van registerhernoeming.

Gevaren Probleem

Wanneer meer dan één instructie naar een bepaalde plaats voor een operand verwijst, hetzij door lezen (als invoer), hetzij door schrijven (als uitvoer), kan het uitvoeren van die instructies in een andere volgorde dan de oorspronkelijke programmavolgorde leiden tot drie soorten problemen, ook wel gevaren genoemd:

  • Read-after-write (RAW)

Een lezing van een register of geheugenplaats moet de waarde opleveren die de laatste schrijfopdracht in het programma heeft opgeleverd, niet een andere schrijfopdracht. Dit wordt echte afhankelijkheid of stroomafhankelijkheid genoemd, en vereist dat de instructies in programmavolgorde worden uitgevoerd.

  • Write-after-write (WAW)

Opeenvolgende schrijfacties naar een bepaald register of geheugenplaats moeten die plaats verlaten met het resultaat van de tweede schrijfactie. Dit kan worden opgelost door het eerste schrijven te annuleren (synoniemen: annuleren, annuleren, mooting) indien nodig. WAW-afhankelijkheden worden ook wel uitvoerafhankelijkheden genoemd.

  • Write-after-read (WAR)

Het lezen van een register of geheugenplaats moet de laatst geschreven waarde naar die plaats teruggeven, en niet een waarde die na het lezen programmatisch is geschreven. Dit is het soort valse afhankelijkheid dat kan worden opgelost door hernoemen. WAR-afhankelijkheden worden ook wel anti-afhankelijkheden genoemd.

In plaats van het schrijven uit te stellen totdat alle lezingen zijn voltooid, kunnen twee kopieën van de locatie worden bewaard, de oude waarde en de nieuwe waarde. Lezingen die in programmavolgorde voorafgaan aan het schrijven van de nieuwe waarde kunnen worden voorzien van de oude waarde, terwijl andere lezingen die volgen op het schrijven worden voorzien van de nieuwe waarde. De valse afhankelijkheid wordt doorbroken en er ontstaan extra mogelijkheden voor out-of-order uitvoering. Wanneer aan alle reads die de oude waarde nodig hebben is voldaan, kan deze worden weggegooid. Dit is het essentiële concept achter het hernoemen van registers.  

Gerelateerde pagina's

  • Parallel rekenen
  • Parallellisme op instructieniveau
 

AlegsaOnline.com - 2020 / 2023 - License CC3