Geheugenmanagement
Ook op het vlak van geheugenmanagement zijn er flinke verbeteringen. Een enigszins verborgen verbetering ten opzichte van Penryn die we kunnen zien in het blokschema van pagina 2 is een tweede TLB (Translation Lookaside Buffer). Zo'n TLB wordt gebruikt om eenvoudig een omrekening te kunnen maken tussen de geheugenadressen waar een programma mee werkt, naar daadwerkelijk fysieke adressen in het RAM-geheugen van de PC. Immers, een programma krijgt door het besturingssysteem gewoon een bepaalde hoeveelheid geheugen toegewezen, zeg 512 MB, waarbij het verder vanuit het programma niet duidelijk is (en ook niet nodig om te weten is) waar deze data zich daadwerkelijk bevindt op de geheugenmodules. De processor moet dus telkens als een programma een bepaald stuk geheugen opvraagt, berekenen op welk fysiek geheugenadres de data te vinden is. De TLB is, zoals de naam al aangeeft, een buffer waarin veelgebruikte geheugenadressen direct op te zoeken zijn.
De tweede laag TLB is nieuw in Nehalem. Deze is wat langzamer, maar daarentegen ook een stuk groter dan de primaire TLB. Wanneer een benodigd geheugenadres niet in de standaard TLB aanwezig is, is de kans bij Nehalem aanwezig de CPU deze wel snel in de tweede kan opvragen. Zodoende hoeft in minder gevallen een tijdrovende en daarmee prestaties beperkende berekening te worden uitgevoerd.
De tweede verbetering op het vlak van geheugenmanagement is wat complexer. Binnen x86 zijn er twee manieren om meerdere stukken data uit het geheugen op te vragen, aligned en non aligned. Aligned wil in dit geval kort door de bocht zeggen dat de gewenste data fysiek achter elkaar in het geheugen terug te vinden is.
Wanneer de compiler 100% zeker weet dat dit bij een bepaalde operatie altijd het geval is, kan er gebruik gemaakt worden van aligned load-operaties. Wanneer die zekerheid er niet is, moet er worden gekozen voor de unaligned variant, die een stuk langer duurt en daarna implicaties heeft op de prestaties. Het frustrerende is, dat zelfs wanneer de data uiteindelijk toch in de juiste volgorde in het geheugen blijkt te staan, deze unaligned functies toch meer tijd in beslag nemen. Dát is bij Nehalem verleden tijd; het gebruik van unaligned instructie op data die toch aligned is, duurt exact even lang als wanneer er van een aligned instructie gebruik werd gemaakt. Deze potentiële bottleneck is dus helemaal weggenomen.
Een van de eigenschappen die ervoor zorgden dat de Core 2 processors veel sneller zijn dan hun voorloper, is de implementatie van hardware prefetchers. Deze voorspellen welke data de processor in de nabije toekomst nodig heeft en kopiëren die alvast van het relatief langzame RAM-geheugen naar het cache geheugen van de processor. In sommige gevallen wist alleen deze verbetering al zo'n 20% tot 30% prestatieverbetering te bewerkstelligen bij software.
Een nadeel is echter dat de hardware prefetchers ook bij veel software falikant op hun bek gaan en telkens de verkeerde data naar de cache halen. In dergelijke gevallen hebben ze juist een negatieve invloed op de prestaties. Hoewel het om uitzonderingsgevallen gaat, is er aantal applicaties aan te wijzen, vooral op server vlak, waar de technologie roet in het eten gooit. Vandaar dat veel systeembeheerders bij hun servers de hardware prefetching juist uitzetten en ook overklokkers die bij sommige benchmarks de hoogste scores willen halen experimenteren daar vaak mee. Het uitzetten heeft echter weer als gevolg dat je ook de prestatiewinst mist bij software waar de techniek wél goed werkt.
Ook hier heeft Intel wat op bedacht. De vernieuwde prefetchers in de Nehalem architectuur controleren de hele tijd hoe goed de resultaten zijn die ze afleveren. Wanneer blijkt dat ze bij een bepaalde programmathread telkens de mist in gaan, wordt de werking van de prefetchers op een lager pitje gezet. Ofwel; de prefetchers zijn zelfreguleren en zitten zich dus in feite uit wanneer ze slecht werk afleveren. Op die manier heb je wel altijd de kans op flinke prestatieverbeteringen, maar hoef je nooit bang te zijn dat de prestaties worden beperkt.