Inleiding: heterogeen computeren
De Wet van Moore dicteert dat de dichtheid van het aantal transistors in een chip elke twee jaar verdubbelt. Deze wet ging decennialang op, maar er zitten grenzen aan de groei: vanaf 2013 zou elke verdubbeling wel eens een jaar of drie in beslag kunnen nemen. Bovendien nemen de prestaties van processors lang niet altijd evenredig met het aantal transistors toe.
Dus hoewel er nog wel wat rek in de transistordichtheid zit, zoeken Intel en AMD naar andere oplossingen om de prestaties van hun processors te verbeteren. Het vergroten van de transistordichtheid, en daarmee van het aantal transistors op een chip, is namelijk niet de enige manier om snellere chips te maken. Beide bedrijven gebruiken een steeds groter deel van hun chips voor de geïntegreerde gpu's, in plaats van voor de cpu. Met name AMD denkt dat de gpu meer kan dan alleen het renderen van 3d-beelden om spelletjes te kunnen spelen.
De cpu werd ooit ontworpen om een alleskunner te zijn, die een groot aantal verschillende - en complexe - instructies kan verwerken. Gpu's daarentegen zijn ontworpen om zoveel mogelijk data te kunnen verwerken. Als de data geschikt is voor parallelle verwerking, kunnen gpu's veel sneller werken dan de general purpose-cpu's, omdat ze over heel veel 'simpele' rekeneenheden beschikken.
Uiteraard zijn er meer zaken van invloed op de snelheid: zo is elke rekenkern tot op zekere hoogte afhankelijk van de beschikbaarheid van cachegeheugen en ook een branch predictor kan grote invloed op de snelheid hebben. Zulke onderdelen nemen echter weer veel transistors in beslag en kunnen dus niet onbeperkt aan de gpu-rekenkernen worden toegevoegd.
Beide typen processor hebben dus hun eigen specialisme, en de kunst is om een combinatie van beide zo goed mogelijk te benutten. Dat staat bekend als heterogeneous computing.
Cpu's kunnen wel overweg met parallelle code, aangezien ze tegenwoordig doorgaans twee tot zes rekenkernen aan boord hebben, die ook nog eens over hyperthreading beschikken. Het grote verschil zit hem in de efficientië. Een gpu maakt gebruik van het single instruction, multiple data-model, waarbij een control unit door meerdere rekeneenheden dezelfde instructie laat uitvoeren.
De verhouding van één control unit per 16 of 32 rekeneenheden blijkt zeer gunstig te zijn: met minder rekeneenheden wordt parallellisme onvoldoende benut, bij meer bestaat de kans dat er te veel rekeneenheden zonder werk komen te zitten als de data onvoldoende parallelliseerbaar is. En dat is zonde, want een gpu beschikt al snel over 1500 tot 2000 rekenkerntjes.
Vooralsnog wordt de rekenkracht van een gpu in veel gevallen nog onbenut gelaten. Zowel Intel als AMD wil daar verandering in brengen en sinds een jaar of wat zijn er processors op de markt die een cpu en een relatief krachtige gpu in dezelfde package bundelen. De integratie moet echter nog veel verder gaan: uiteindelijk is het de bedoeling dat programmatuur automatisch door de best geschikte processor wordt uitgevoerd.
/i/1343223976.png?f=imagenormal)
Cpu's: de rek lijkt eruit
De wet van Moore is al een jaar of veertig geldig gebleken, maar er zijn al diverse barrières geslecht om dat mogelijk te maken. Zo kun je denken aan de introductie van high-k metal gates, waardoor transistors kleiner werden en lekstromen werden verkleind in vergelijking met transistors met siliciumdioxide-gates. Hierdoor kon het stroomverbruik van cpu's binnen de perken worden gehouden en kon de transistor-dichtheid verder toenemen dan oorspronkelijk gedacht.
Het 'shrinken' van de transistors brengt veel voordelen met zich mee. Zo worden processors goedkoper als er meer uit een wafer gehaald kunnen worden. De benodigde spanning om de transistors te laten schakelen neemt ook af, wat per saldo een energiebesparing oplevert.
Maar misschien nog wel belangrijker is de prijs per transistor. Het huidige procedé, op basis van immersielithografie, kan gebruikt worden voor transistors met een minimale grootte van 14nm. Met grote investeringen in extreme ultraviolet-lithografie zou het mogelijk zijn om de featuregrootte tot rond de 4nm te verlagen. Bij nog kleinere features zouden siliciumdioxide-transistors te heet worden, ongeacht de koeling, en bovendien krijgen ze dan te veel last van electron tunneling. Deze grens zou nog dit decennium bereikt kunnen worden, en de kans is aanwezig dat - voor zover de wet van Moore dan nog kán opgaan - het domweg niet meer rendabel is om meer transistors op een chip te plaatsen.
/i/1334868257.jpeg?f=imagenormal)
Powerwall
Een andere manier om processors sneller te maken, is het verhogen van het aantal kloktikken per seconde. Vooralsnog zien we amper cpu's met een snelheid van boven de 4GHz, en lijkt het erop dat die snelheid niet veel hoger gaat worden. Dat heeft te maken met de zogeheten powerwall.
Om de kloksnelheid toe te laten nemen moet de spanning verhoudingsgewijs meer toenemen. Dat betekent dat de toename in energieverbruik uiteindelijk zo hoog wordt, dat het niet langer de marginaal hogere prestaties rechtvaardigt. Intel en AMD kunnen best een cpu produceren die op 5GHz of hoger is geklokt, maar de cpu zou dan heel veel hitte produceren. Met de huidige koelmethoden en de huidige featuregroottes zou het silicium te warm worden om nog met een conventionele luchtkoeler gekoeld te worden.
Er is geen processor die dit probleem beter illustreerde dan de 'Prescott'-Pentium 4, bijgenaamd 'de kachel'. Deze cpu, een van de eerste die boven de 3GHz werd geklokt, werd vaak zo warm dat hij zichzelf moest uitschakelen. Na het uitbrengen van deze chip hield Intel de kloksnelheid-race voor gezien om zich op dualcore- en quadcore-ontwerpen te richten. Overklokkers bewezen dat betere koeling wel hielp: kloksnelheden van meer dan 8GHz bleken mogelijk, maar daar was wel vloeibarestikstofkoeling voor nodig. Het bleek echter niet erg praktisch om cpu's constant op een temperatuur van -100 graden Celsius of nog minder te houden.
Een mogelijke oplossing is het gebruik van andere materialen om transistors te maken, zoals koolstof nanobuizen of grafeen. Door de hogere elektronmobiliteit van het materiaal in vergelijking met de huidige halfgeleiders, is er minder spanning nodig om de transistors te laten schakelen. Het lukte IBM al in 2010 om een transistor van grafeen te produceren die met een frequentie van 100GHz kon schakelen.
Memory Wall
We hebben al gezegd dat het een toename van het aantal transistors lang niet altijd een evenredige toename van de prestaties betekent. Een belangrijke oorzaak daarvan vinden we in het werkgeheugen.
Waar een singlecore-cpu nog de hele geheugenbus voor zichzelf heeft, moeten de rekenkernen van een multicore-cpu die geheugenbus delen. Hoe meer cores er worden gebruikt, des te belangrijker is dus de snelheid waarmee gegevens uitgelezen en weggeschreven kunnen worden. Intel probeert het gebruik van het werkgeheugen zoveel mogelijk te beperken door de cpu van grote hoeveelheden cache te voorzien. Dit geheugen kan tot wel honderd keer zo snel benaderd worden als het werkgeheugen. Bij sommige cpu's wordt meer dan de helft van het aantal transistors voor cache gebruikt.
De geheugenbus sneller of breder maken is ook een optie, maar dat kost weer te veel energie. William Dally van Nvidia stelt dat een simpele berekening door de cpu slechts 1 picojoule kost, terwijl het uitlezen van extern geheugen 2000 picojoule vergt. Het energieverbruik kan worden gereduceerd door het geheugen zo dicht mogelijk bij de cpu te plaatsen. Ook daarom geniet cachegeheugen de voorkeur - dichterbij gaat geheugen niet komen - maar ook cache gebruikt energie, en bovendien zorgt veel cache voor veel transistors op de die. En die transistors zijn dus niet onbeperkt voorradig.
Opvallend is overigens dat geheugenfabrikanten wel steeds snellere ram op de markt brengen, maar zowel AMD als Intel ondersteunen dat officieel niet. Wel zijn er de afgelopen jaren architecturele vorderingen gemaakt: zo vinden er per kloktik nu meer data-tranfers plaats in plaats van slechts één.
ILP Wall
Instruction-level parallelism is simpelweg het aantal instructies of delen van instructies die tegelijkertijd uitgevoerd kunnen worden. De aanname daarbij is dat de instructies niet van elkaar afhankelijk zijn, wat in veel gevallen natuurlijk wel degelijk zo is.
Tien jaar geleden wisten AMD en Intel daar nog flinke progressie mee te boeken, maar tegenwoording behalen de fabrikanten met elke volgende generatie slechts enkele procenten winst. Dat komt omdat met name Intel eigenlijk al het onderste uit de instructionlevelparallelismkan weet te halen.
Er zijn verschillende manieren om ilp te bewerkstelligen. Een bekend voorbeeld is out of order execution, waarbij instructies die niet afhankelijk van elkaar zijn maar door een programmeur in een bepaalde volgorde zijn gezet, toch tegelijkertijd worden uitgevoerd.
/i/1343858005.png?f=thumb)
Dat kan natuurlijk door de instructie naar een tweede core te sturen, maar het kan ook een niveau lager. Instructies in een processor worden namelijk afgehandeld door een zogeheten pipeline. Elk deel hiervan kan een bepaald onderdeel van een instructie uitvoeren, en als dat onderdeel is afgerond, kan hetzelfde deel van de pipeline aan hetzelfde onderdeel van een nieuwe instructie werken. Er wordt dan dus al aan een instructie gewerkt terwijl zijn voorganger nog niet klaar is.
Dat heeft opnieuw als nadeel dat de chip een grotere vermogensbehoefte heeft, omdat de pipeline langer en het chipontwerp dus complexer is. In het slechtste geval neemt het aantal instructies per kloktik zelfs af.
Ook hangt de lengte van de pipeline nauw samen met branch prediction. De branch predictor probeert te voorspellen wat er met een bepaalde instructie moet gebeuren, zodat de processor 'weet' welke instructie er als volgende moet worden uitgevoerd. Zoals de naam al zegt probeert de branch predictor - vrij vertaald: de aftakkingsvoorspeller - uit te rekenen of er wel of niet aan bepaalde condities voldaan wordt.
Intels branch predictor zou al erg goed zijn, en daar valt dus nog maar weinig winst te behalen. De reden dat er met ilp niet meer te winnen valt, is dat out-of-order execution, branch prediction en multithreading allemaal transistors kosten. Die verbruiken weer energie, en zoals gezegd is deze logica al heel goed: het toevoegen van nog meer transistors is niet rendabel meer.
Cpu versus gpu
De taken die we op onze pc's, laptops en tablets uitvoeren, veranderen. Een nieuwe en steeds populairdere tak van sport is patroonherkenning: het analyseren van de aanrakingen op een touchscreen, gezichtsherkenning - dat bij Windows 8 gebruikt kan worden om in te loggen - en voice control zoals bij Apples Siri en Google Now zullen in de komende jaren steeds meer toegepast worden. Zulke taken zijn erg data-intensief en de hoge throughput van parallelle verwerking kan daarbij van grote waarde zijn.
Bij de introductie van dualcore-cpu's werd echter al snel duidelijk dat veel programmatuur geen baat bij een tweede rekenkern had. Omdat de kloksnelheid bij de eerste multicores lager lag dan bij de ver doorontwikkelde singlecores, was de snelheidswinst bij veel programma's ver te zoeken. Nu programmeurs weten dat het gros van de pc's over meer dan een kern beschikt, worden multicore-cpu's steeds beter benut. Bijna alle benchmarks die we bij Tweakers.net draaien zijn bijvoorbeeld multithreaded en ook games zijn steeds vaker ingericht op het gebruik van meerdere kernen.
Een maat voor de prestaties van een processor is de task latency: de hoeveelheid tijd die nodig is om een taak van begin tot eind af te ronden. Een tweede maat is de hoeveelheid werk die een processor in een bepaalde hoeveelheid tijd kan uitvoeren: de task throughput. Cpu's zijn ontworpen op een zo laag mogelijke task latency; bij gpu's ligt de nadruk op task throughput. De cpu en de gpu zijn grofweg in staat om elke taak uit te voeren, maar het gaat om het rendement: cpu's zijn veel beter in seriële taken, terwijl een gpu is gespecialiseerd in parallelle workloads - soms zijn problemen zo onthutsend simpel te parallelliseren dat er wel wordt gesproken van embarrassingly parallel workloads. Op hun eigen terrein zijn de processors soms wel een factor honderd sneller.
Zo is er het programma Amber, waarmee aan molecuulmodellen worden gerekend. Met behulp van Nvidia's Cuda-api kunnen Nvidia's videokaarten ingezet worden om de simulaties veel sneller uit te voeren dan met een cpu, zo tonen benchmarks op de site van Amber aan.
Bij de simulatie van een molecuul van 304 atomen is een GTX 580 bijna drie keer zo snel als twee Intel E5462-quadcores. Wanneer er 2492 atomen in het spel zijn, is de GTX 580 ruim twintig keer zo snel. Naarmate het aantal atomen toeneemt naar 25.000 of zelfs 100.000 neemt het verschil iets af, maar de GTX 580 is nog steeds acht tot tien keer zo snel.
Onlangs werd in het Verenigd Koninkrijk een supercomputer met 372 M2090-kaarten en 168 hexacore Xeon-cpu's in gebruik genomen, die 114Tflops aan rekenkracht levert en daarmee nummer 159 in de top 500 van supercomputers bezet. Een supercomputer met gpu's is daarmee een stuk goedkoper dan eentje met alleen cpu's.
Daar staat echter tegenover dat programmeren voor gpu's een stuk moeilijker is. Nvidia werkt echter al jaren aan general purpose gpu-applicaties en met name in de onderzoekswereld en het bedrijfsleven heeft dat al behoorlijk wat vruchten afgeworpen. Het marktaandeel van supercomputers met gpu's is de afgelopen drie jaar dan ook flink toegenomen. In juni 2010 beschikten 2 van de 500 supercomputers over gpu's, in juni 2011 waren het er 14 en tegenwoordig zijn het er ruim 50.
Ook Intel is zich van de kracht van parallellisme bewust. Dit bedrijf presenteerde onlangs de Xeon Phi Co-processor, een 'videokaart' met ruim 50 kernen. Dat staat nog in schril contrast met de 1500 tot 2000 kernen waar de gpu's van Nvidia en AMD over beschikken, maar Intels rekeneenheden kunnen overweg met x86-code. Daardoor hoeven bestaande applicaties niet herschreven te worden met OpenCL of Cuda, maar kunnen ze bijna zonder aanpassingen op de Xeon Phi-processors worden uitgevoerd.
Intel kondigde ook meteen de eerste supercomputer op basis van de Xeon Phi aan. Naast 1225 Xeon E5-cpu's bevat dit systeem 613 van deze co-processors, waarmee een snelheid van 118Tflops wordt gehaald. Dat is iets meer de supercomputer in het Verenigd Koninkrijk, maar daar zijn wel het dubbele aantal 'gpu's' en zeven keer zoveel cpu's voor nodig. Opvallend is trouwens dat Intel beweert dat de Xeon Phi 1Tflops aan double-precisionberekeningen levert, maar dat cijfer wordt in een benchmark van Linpack bij lange na niet gehaald. Nog opvallender is dat Nvidia voor de M2090's een maximum van 'slechts' 0,665Tflops aan double-precision berekeningen claimt.
Alles op de gpu?
Het lijkt er dus op dat de gpu een zonnige toekomst tegemoet gaat, maar het gebruik van de gpu als gpgpu is niet eenvoudig. Met traditionele, seriële programmeertalen kan het parallellisme niet zomaar benut worden en bovendien lenen niet alle toepassingen zich voor het gebruik van de gpu. Als de te bewerken data niet goed geparallelliseerd kan worden, komen zwakheden als het ontbreken van veel cache namelijk genadeloos aan het licht. Er moet dan relatief vaak met het geheugen gecommuniceerd worden, en dat kost niet alleen tijd maar ook energie.
Op de AMD Fusion Developer Summit, die in juni van dit jaar werd georganiseerd, probeerde AMD developers warm te laten lopen voor heterogeneous computing. Uitgangspunt daarbij is dat er een combinatie van cpu en gpu wordt gebruikt. Tijdens de keynote van Phil Rogers, corporate fellow bij AMD, kwam onder andere gezichtsherkenning met behulp van het Haar-algorithme aan bod. Met name de eerste fase van dit algoritme leent zich uitstekend voor gpu's, maar volgende fases kunnen weer beter door een cpu worden uitgevoerd. Als de cpu en de gpu perfect samenwerken zou dat volgens Rogers een snelheidswinst van 250 procent moeten opleveren.
/i/1343138638.png?f=thumb)
Een ander voorbeeld is memcached, waar de combinatie van cpu en gpu de prestaties kan verdrievoudigen ten opzichte van enkel de cpu - maar ook als alleen de gpu wordt gebruikt, is het programma langzamer dan bij een heterogene aanpak.
/i/1343138955.png?f=imagenormal)
Er zijn ook al enkele consumentenapplicaties die gebruik kunnen maken van de gpu en daardoor significant sneller zijn dan wanneer enkel een cpu gebruikt wordt. De bekendste daarvan zijn Handbrake, Winzip, en Adobes Photoshop en Premiere. Maar hoewel Intel en AMD al miljoenen processors met een relatief snelle igp hebben verkocht en talloze pc's een losse videokaart aan boord hebben, is het aantal programma's dat ook daadwerkelijk de gpu gebruikt nog verwaarloosbaar klein - afgezien, uiteraard, van games.
Programmeren voor de gpu kost namelijk aanzienlijk meer tijd dan programmeurs gewend zijn. De onderstaande grafiek laat zien hoeveel code er met de diverse programmeermethoden nodig is, maar toont ook de prestatiewinst die er met een gpu te behalen is.
Met Intels C++-library Threaded Building Blocks nemen de prestaties fors toe, maar is ook meer dan twee keer zoveel code nodig. Worden er intrinsic functions gebruikt om de code meer parallel te maken, dan verdubbelt de benodigde hoeveelheid code nogmaals, maar dat loont wel: de prestaties verdrievoudigen. Gebruik van de open OpenCL-standaard weet de prestaties nog eens te verdubbelen, maar vergt ook weer wat meer code. In deze AMD-grafiek ontbreekt Nvidia's Cuda, maar omdat dat geen open standaard is, wordt deze library geen grote toekomst toegedicht.
/i/1343138639.png?f=imagenormal)
Tijdens de Fusion Developer Summit kondigde AMD de HSA Foundation aan. Dit is een samenwerkingsverband met bedrijven als ARM, TI en Imagination, dat gaat werken aan de zogeheten Heterogeneous System Architecture. Het doel is om programmeren, voor ongeacht welke processor, net zo eenvoudig te maken als programmeren voor een 'klassieke' cpu. Daarbij kan de gpu pc's sneller maken, maar een cpu blijft noodzakelijk. Een symbiose tussen beide heeft wat AMD betreft dus de toekomst.
Conclusie: developers, developers, developers
Gpu's bieden enorme mogelijkheden. Supercomputers worden ingezet voor de analyse van grote hoeveelheden data, zoals met de molecuul-simulaties van Amber maar ook voor het vinden van olie- en gasvelden. Er zijn echter nog geen toepassingen die niet met cpu's kunnen worden uitgevoerd, en het is ook nog eens een behoorlijke verandering voor programmeurs.
Met parallelle verwerking kunnen veel problemen echter wel sneller worden opgelost, en, nog belangrijker, het rendement van gpu's ligt hoger. De voornaamste reden dat cpu-cores niet veel sneller meer zullen worden, is dat ze anders te veel energie verbruiken. Een gpu kan per watt meer berekeningen uitvoeren dan een cpu, waarvan grote delen bij het verwerken van parallelle data onbenut blijven - maar wel energie verbruiken. Datacenters verbruiken bijna net zoveel energie voor het afvoeren van warmte als voor de voeding van processors, maar ook bij smartphones en laptops is energieverbruik een zeer zwaarwegend criterium. Elke winst op dit terrein is dus meegenomen.
Intel bracht zoals gezegd de Xeon Phi uit, maar ook de consumentenchips van dit bedrijf beschikken tegenwoordig over een degelijke gpu, met DirectX 11-ondersteuning en daarmee ook met ondersteuning voor OpenCL en DirectCompute. De Haswell-cpu's die volgend jaar verschijnen, zouden opnieuw een snellere gpu aan boord hebben.
Ook AMD's Fusion-apu's herbergen zowel een cpu als een gpu. De Llano-apu's zijn onlangs opgevolgd door de Trinity-chips, maar op de Fusion Developer Summit werd de volgende generatie alweer aangekondigd. De Steamroller-apu's, die volgend jaar moeten verschijnen, zijn vooral interessant omdat cpu en gpu het geheugen volledig kunnen delen. Daarmee wordt het makkelijker om voor een bepaalde bewerking de cpu of juist de gpu te gebruiken, terwijl de resultaten van een berekening voor beide componenten toegankelijk zijn.
Hoewel we het vooral over desktops en laptops hebben gehad, bewijst de deelname van Imagination en ARM aan de HSA-foundation dat heteregeneous computing ook op smartphones en tablets toekomst heeft. De razendsnelle maar specialistische en niet erg flexibele fixed-functionhardware, zoals Intels QuickSync, laten we maar even buiten beschouwing: gpu's zijn immers alomtegenwoordig. Het leeuwendeel van alle toekomstige cpu's zal een gpu aan boord hebben, er is een installed base van honderden miljoenen videokaarten en ook smartphones krijgen steeds krachtiger gpu's in hun soc's.
De vraag is dus met welke applicaties de consument tot aanschaf zal worden verleid. Volgens Microsoft gaan aanraakgevoelige schermen, gezichtsherkenning en 3d-beelden een grote rol spelen, zo liet het bedrijf op AMD's conferentie weten, en uiteraard zijn dat allemaal toepassingen die uitermate geschikt zijn voor throughput-processors - oftewel gpu's. Andere velden waar de extra rekenkracht van pas kan komen zijn augmented reality en biometrische herkenning. Zo kan je denken aan het sorteren van homevideo's aan de hand van de gezichten en stemmen die erin voorkomen, of aan Googles Project Glass, dat bijvoorbeeld naadloze graphics over afbeeldingen van een gebouw kan projecteren, zodat je kan zien hoe iets er vroeger uitzag of hoe iets eruit zou kunnen zien. Al deze toepassingen zullen zich echter nog in de praktijk moeten bewijzen.
Voor een echte doorbraak zal vermoedelijk toch het programmeren voor de gpu gemakkelijker moeten worden. Intel denkt dat gpu's met x86-ondersteuning een goede oplossing zijn, AMD werkt aan Fusion-apu's waarbij gpu en cpu hetzelfde geheugen gebruiken, en Nvidia is met zijn Cuda-platform in elk geval ervaring aan het opdoen. Er zijn dus in elk geval een aantal bruikbare mogelijkheden, en daarmee komt het lot van general purpose-gpu's nu in handen van de ontwikkelaars te liggen. Als zij het heterogene programmeren omarmen, kunnen we in de komende jaren een grote vlucht voor de geparallelliseerde toepassingen verwachten.