Croga schreef op donderdag 04 januari 2007 @ 08:42:
[...]
Als je kijkt naar de werking van cache zal de vulling van de cache voor een groot deel afhankelijk zijn van de branch prediction. Branch prediction vult de pipeline met de instructies die het meest waarschijnlijk als volgende uitgevoerd moeten worden. Vervolgens wordt de cache gevuld met de bijbehorende data. Een miss in de prediction logic zorgt er dus automatisch voor dat een groot deel van de data in de cache ook opnieuw geladen moet worden.
Dit is zo'n beetje het meest belangrijke punt in de hele discussie: Branch prediction heeft een direct effect op de efficientie van de cache en daarmee automatisch ook op hoe er met het geheugen om gegaan wordt.
Dat is dus onzin.
Ten eerste kijkt de branch prediction niet zo heel ver vooruit, dus zo enorm veel data kan er niet gelezen worden in die code.
Ten tweede wil een branch naar een ander stuk code helemaal niet zeggen dat de data daar niet in de cache staat. Sterker nog, vanwege de enorm grote caches vandaag de dag is dat maar heel zelden het geval, en is die invloed verwaarloosbaar.
Ten derde, zelfs al staat de data niet in de cache, dan nog is het onwaarschijnlijk dat ALLE data niet in de cache staat, danwel niet in dezelfde cacheline of een aangrenzende als een voorgaand stuk data, zodat het niet in 1 burst-read ingeladen kan worden, en maar 1 keer de latency gerekend hoeft te worden.
Als laatste verklaart dit niet waarom een langere pipeline meer of minder last heeft van de latency.
De lengte van de pipeline bepaalt namelijk alleen hoe lang een pipeline flush duurt. Als we uitgaan van een processors met identieke branch prediction-mogelijkheden en cache, dan zullen alle processors, ongeacht hun pipeline-lengte even vaak goed of fout voorspellen. Het effect van de latency wordt pas groter als er vaker fout voorspeld wordt, zodat er meer gecached zou moeten gaan worden (wat gezien bovenstaande verhaal maar zelden voorkomt, dus het verschil in prediction moet redelijk groot zijn).
Goed voorspellen scheelt je dus zowel in benodigde bandbreedte als in latency. Als branch prediction altijd de juiste voorspelling zou doen, zouden we allemaal met PC133 CL5 toe kunnen. Helaas is dat niet zo......
Dit voorspellen doet de branch-prediction niet. Dat doet de cache.
Branch-prediction bepaalt alleen of een branch al dan niet genomen wordt.
Vervolgens worden er instructies in de ooo-buffer geladen, en worden lees- en schrijfopdrachten geprepareerd en uiteindelijk naar de LSU gestuurd... alwaar ze door de cache verwerkt worden, die dan eventueel geheugenopdrachten gaat bufferen om ze uiteindelijk in burst-writes om te zetten, na voorspeld te hebben over wat voor soort geheugentoegang het zou kunnen gaan.
En DAAR maakt de C2D het verschil met de P4.
Ja, zo werkt het dus niet....
C2D en Ath64 voeren veel meer instructies per clockcycle uit dan P4. De pipeline bestaat uit instructies. Die paar extra megahertzen gaan daar dus niet helpen. Resultaat: De predictors van de C2D en Ath64 hebben het vele malen drukker dan die van de P4.
Ik snap niet hoe je tot deze conclusie komt.
In principe doet iedere processor iedere clockcycle een 'stap' met de complete pipeline. Dus in theorie kan iedere cycle de IP een plaats opgeschoven worden, en zouden er nieuwe instructies binnen kunnen komen, waaronder branches, dus moet iedere cycle het mechanisme lopen.
Hogere frequentie is dus automatisch een 'drukkere' processor.
In de praktijk kan de P4 alleen in verhouding minder instructies per clockcycle afronden dan de andere processors, bij dezelfde code (maar wat jij beweert, geeft me eerder de indruk dat je denkt dat er op die processors ineens meer branches in de code zitten?).
Maar ik kan wel een stuk code bedenken dat iedere cycle op een P4 een branch uitvoert. Dan zal de processor dat toch moeten voorspellen. En dat doet ie ook.
In absolute zit is de pipeline lengte van de P4, uitgedrukt in doorlooptijd, dus ook veel langer.
Doorlooptijd = lengte / IPC / snelheid. Lengte is bij de P4 veel langer, IPC is kleiner, snelheid is iets groter. Doorlooptijd is bij de P4 dus langer.
IPC hoort niet in deze vergelijking thuis.
IPC is namelijk puur afhankelijk van de instructiemix die je naar de processor stuurt.
Doorlooptijd is het theoretische minimum van 1 instructie, niet van een mix.
In een groot deel van de pipeline is er helemaal geen kans op oponthoud... en verder zijn de execution units voor de meest gebruikte instructies op alle CPUs even snel, in het ideale geval: 1 cycle.
Nee, de kortere pipeline zal het niet makkelijker maken voorspellingen te doen. De kortere pipeline zorgt er echter wel voor dat de performance hit door een prediction miss kleiner zal zijn aangezien het herladen van de pipeline minder tijd/werk kost.
Wat dus weinig met de cache en het geheugen te maken heeft.
Waarvoor is de C2D precies minder gevoelig? De C2D is duidelijk minder gevoelig voor brute geheugen-transfer snelheid. Dat heeft alles te maken met wat er hiervoor geconstateerd is (kortere pipeline dus bij miss prediction minder data die uit de cache gegooid hoeft te worden).
Nogmaals... nee.
Je haalt gewoon de hele tijd branch prediction en prefetching door elkaar. Dat gebeurt niet op hetzelfde moment, niet op hetzelfde niveau, en de afhankelijkheden zijn vooral indirect en toevallig.
Let goed op deze link. Als je goed kijkt zul je zien dat de totale geheugen latency bij de Athlon64 zo'n 10ns onder de C2D ligt. Een verhoging van de latency op het geheugen zelf zal dus relatief meer performance kosten op een Ath64 dan op een C2D/P4.
Ja, maar dat is niet het hele verhaal. Want in de praktijk is de Athlon nergens sneller in, ook niet in geheugen-intensieve applicaties. Door de cache van de C2D is hij alsnog sneller, omdat hij minder vaak gebruik hoeft te maken van geheugen.
Verder zou je moeten opvallen dat een verschil van 'maar' 10 ns wel heel weinig is voor een geintegreerde controller tov een chipset.
Dit komt voor een groot deel doordat het gemaskeerd wordt door de voorspellende gaven van de cache. De Pentium 4 scoort veel trager in dezelfde test met dezelfde chipset.
Een andere test, die onvoorspelbaar is voor de C2D-cache, laat veel hogere latencies zien.
Hier zie je zelfs een test waarin de C2D sneller is dan de Athlon:
http://www.anandtech.com/...s/showdoc.aspx?i=2795&p=5
Fysiek onmogelijk, maar de cache maakt het mogelijk.
Zie ook het enorme verschil met de Pentium.