Deel dit artikel

steeds nieuwe toepassingen verhogen de vraag naar steeds snellere computers. rekenen op grafische processors die ontwikkeld werden voor spelconsoles en het gebruik van servers met honderden eenvoudige en energie-efficiënte processors worden nu aangeprezen als de volgende computerrevolutie. maar wat zit hierachter? en is het meer dan louter een marketinghype? hoe ziet de situatie eruit vanuit het standpunt van pc- en servergebruikers?

Manycore computers: toekomst of hype?

Kurt Lust

Sinds de ontwikkeling van geïntegreerde schakelingen (IC’s) op het einde van de jaren 1960 hebben computers een enorme evolutie doorgemaakt. Sommige smartphones bundelen vandaag evenveel rekenkracht als een supercomputer dertig jaar geleden. Steeds nieuwe toepassingen verhoogden de vraag naar steeds snellere computers. Die groei werd mogelijk gemaakt dankzij de snelle evolutie van de micro-elektronica. Reeds in 1975 stelde Gordon Moore, medeoprichter van Intel, dat het aantal componenten dat op een chip kan worden geplaatst, gemiddeld elke twee jaar verdubbelt. Die voorspelling staat bekend als de (meestal fout geciteerde) wet van Moore en houdt nog steeds stand. Lange tijd werden die extra transistors gebruikt om steeds complexere processors te bouwen. Zo kon de drang naar meer snelheid worden bevredigd. Per klokcyclus – alle courante processors werken op het ritme van een klok – werd steeds meer werk verzet. Daar waar microprocessors uit de jaren 1970 programma’s instructie per instructie verwerkten, bevinden zich op moderne microprocessors op elk moment tientallen instructies tegelijk in verschillende uitvoeringsfasen.

Met de toenemende miniaturisatie werd ook de klokcyclus steeds korter. Die beide factoren leidden tot een effectieve verdubbeling van de snelheid van een chip iedere 18 tot 24 maanden. De 8088-processor, gelanceerd in 1979 en gebruikt in de eerste IBM-pc, bevatte 29.000 transistors en draaide aan een klokfrequentie van 4,77 tot 8 MHz. Vijfentwintig jaar later bevatte een Pentium 4-processor 125 miljoen transistors en werkte die aan een klokfrequentie tot 3,8 GHz. Met de Pentium 4 kwam er echter een abrupt einde aan die evolutie: de kloksnelheid nam niet verder toe. Er kwam ook een einde aan de groei van de complexiteit van de kern of ‘core’ van de processor, dit is het deel van de chip dat de instructies leest en uitvoert. Om aan de vraag naar steeds snellere computers te kunnen voldoen moesten er andere oplossingen worden gezocht. Het antwoord werd gevonden in processors met meerdere cores.

Voor deze hardwarecrisis kunnen meerdere oorzaken worden aangewezen. Er is een grens aan het aantal instructies dat een core tegelijkertijd kan uitvoeren in een normale instructiestroom. Nog complexere cores zijn bijgevolg zinloos. Ook het opdrijven van de kloksnelheid is begrensd. Het energieverbruik per transistor per klokcyclus nam geruime tijd snel af naarmate transistors kleiner werden. Sinds 2004 is die afname echter niet meer zo groot als voorheen. Het energieverbruik en dus ook de warmteproductie van een chip nam doorheen de jaren toe, van 2,5 watt voor de 8088 uit 1979 tot 115 watt voor de snelste Pentium 4-processors uit 2004. Nog problematischer dan de totale warmteproductie is het feit dat het grootste deel van die warmte in steeds kleinere zones op de chip geproduceerd werd, de zogenaamde ‘hot spots’. Dit leidt tot lokale oververhitting. Nog snellere processors bouwen kon na 2004 alleen nog door de integratie van meerdere cores op één chip. De cores delen daarbij de overige logische circuits (soms de ‘uncore’ genoemd). Vandaag kunnen gemakkelijk zes tot tien volwaardige complexe cores op één chip worden geïntegreerd. Dit aantal groeit gestaag, zij het dat we niet echt een verdubbeling krijgen per twee jaar, omdat de complexiteit van het ‘uncore’-gedeelte sneller toeneemt dan het aantal cores.

Vandaag kunnen gemakkelijk zes tot tien volwaardige complexe cores op één chip worden geïntegreerd

Die onvermijdelijke evolutie heeft ook een belangrijke implicatie voor het softwareontwerp. Willen we toepassingssoftware die sneller werkt of grotere problemen kan aanpakken, dan moet die worden herwerkt om alle cores te kunnen gebruiken. Dit proces kennen we als parallelliseren. De tweede core in een pc levert vanzelf al enige snelheidswinst op omdat er altijd wel wat achtergrondwerk is dat op de tweede processor kan worden uitgevoerd. Een derde of vierde core kan echter zelden nuttig worden gebruikt zonder aanpassingen aan de toepassingssoftware. Voor servertoepassingen is het vaak niet moeilijk om parallellisme te vinden. Aanvragen van verschillende gebruikers (bijvoorbeeld de vraag naar een pagina op een webserver, een bestand op een bestandenserver of gegevens in een database) kunnen bijna onafhankelijk van elkaar en dus in principe gelijktijdig (of ‘in parallel’) worden behandeld. Dit wordt taakparallellisme genoemd. Bij vele servertoepassingen vraagt iedere taak op zich maar vrij weinig rekenkracht, maar een server kan overbelast raken door het grote aantal taken. Ook in grote numerieke simulaties is parallellisme geen nieuw gegeven. Supercomputers bevatten al tientallen jaren meerdere processors en dus meerdere cores. In vele supercomputertoepassingen moet dikwijls eenzelfde bewerking op een groot aantal getallen worden uitgevoerd. Eenzelfde patroon vinden we ook terug bij beeld- en videoverwerking, wat nog steeds een tijdrovende toepassing is op een pc: op alle beeldpunten wordt eenzelfde eenvoudige bewerking uitgevoerd. Dit noemen we dataparallellisme. Het herwerken van de software vraagt veel tijd en inspanning. Omdat vooral desktoptoepassingen nog onvoldoende aangepast zijn, vinden we tegenwoordig in de meeste pc’s nog steeds chips met maar twee tot vier cores. Nochtans is er technologisch al meer mogelijk en worden er in servers en werkstations al meer cores gebruikt.

Bij een manycore processor is het aantal cores zo groot geworden dat die op een voor de software minder transparante manier met elkaar verbonden moeten worden

Nu we tot de conclusie zijn gekomen dat parallellisatie van de toepassingssoftware onvermijdelijk is, kunnen we ons nog een vraag stellen. De eerste Pentium-processors bevatten minder dan 5 miljoen transistors, terwijl we op een moderne chip 1 miljard transistors kunnen plaatsen. Zou een chip met honderd of meer eenvoudige Pentium-cores niet sneller kunnen zijn dan één met zes of acht complexe cores? In theorie wel, maar zo eenvoudig liggen de zaken toch ook weer niet. Vooreerst moeten die honderd cores op een chip met elkaar worden verbonden, wat niet kan op dezelfde, voor toepassingen transparante manier als op chips met slechts enkele cores. Het programmeren wordt dus een nog grotere opgave. Hier ligt ook het onderscheid tussen een multicore en manycore processor. Bij een manycore processor is het aantal cores zo groot geworden dat die op een voor de software minder transparante manier met elkaar verbonden moeten worden. De grens tussen beide begrippen is echter niet strikt gedefinieerd en is evenveel een kwestie van marketing als van technologie. Ten tweede kan een intrinsiek snelle chip ook maar snel werken als je alle data tijdig kunt aan- en afvoeren. Nu is het aantal verbindingen dat op een economisch verantwoorde manier van een chip naar de buitenwereld gemaakt kan worden beperkt (op een hedendaagse pc-processor een duizendtal, maar het merendeel daarvan wordt voor de energievoorziening gebruikt). Ook de bandbreedte van een verbinding is beperkt. Als de data niet snel genoeg kunnen worden aangeleverd, zal zelfs een goed parallelliseerbare toepassing trager draaien dan je zou verwachten op basis van de pieksnelheid van de processor. En er is nog een derde probleem: wanneer een core gegevens uit het geheugen van de computer nodig heeft, moet die daar even op wachten. Nu is die wachttijd niet in dezelfde mate afgenomen als de rekensnelheid van een core is toegenomen. Een flink deel van de complexiteit van de cores van moderne pc-processors dient om die wachttijd zoveel mogelijk te camoufleren door op zoek te gaan naar instructies die in tussentijd kunnen worden uitgevoerd. Maar ook hiervoor is een oplossing gevonden: op iedere core worden verschillende instructiestromen of ‘threads’ uitgevoerd. Als de ene thread opgehouden wordt door het geheugen, wordt er overgeschakeld naar een andere thread. Dit kan met vrij weinig extra transistors en complexiteit worden geïmplementeerd. Dit betekent echter ook dat er nog meer naar parallellisme gezocht moet worden in de toepassingssoftware.

Vandaag zijn er al verschillende soorten manycore processors op de markt. Het taakparallellisme in servertoepassingen vraagt om cores die volledig onafhankelijk van elkaar complexe programma’s kunnen uitvoeren. Enkele voorbeelden van processors die voor deze markt ontwikkeld zijn, zijn de SUN UltraSparc T3-processor en de Tilera-chips. Die laatste kunnen tot honderd cores bevatten. De cores zijn weliswaar eenvoudiger en langzamer dan bijvoorbeeld een Pentium 4-core, maar kunnen toch probleemloos een modern besturingssysteem draaien en alle taken van een klassieke processor overnemen. Processors die specifiek ontwikkeld zijn voor dataparallelle toepassingen, gaan nog een stap verder. Omdat vaak dezelfde reeks elementaire bewerkingen moet worden uitgevoerd voor een groot aantal getallen, hoeven de cores niet volledig onafhankelijk van elkaar te werken. Het deel van de core dat instaat voor het lezen van de instructies kan worden gedeeld (al moeten we daarvoor eigenlijk onze definitie van core wat rekken). Die strategie wordt toegepast in de grafische processors van AMD/ATI en nVidia. De krachtigste versies bevatten vele honderden relatief eenvoudige cores. Een hybride vorm is de recent geïntroduceerde Intel MIC-architectuur: één chip integreert 32 cores die qua complexiteit lijken op die van de Pentium (en ook min of meer dezelfde instructieset gebruiken) en onafhankelijk van elkaar werken. Iedere core heeft echter ook een vectorrekeneenheid die eenzelfde bewerking op een hele rij getallen (een vector) kan uitvoeren om dataparallellisme uit te buiten. Processors die ontwikkeld werden voor dataparallellisme missen vaak de veelzijdigheid die nodig is om als enige processor te kunnen dienen en worden daarom in de regel als coprocessor naast een klassieke processor gebruikt. We vinden ze veelal op uitbreidingskaarten terug. De heterogeniteit van dergelijke systemen maakt het programmeren er echter niet eenvoudiger op.

Er is nog een andere belangrijke reden waarom we niet zonder minstens één complexe, snelle core verder kunnen voor heel wat toepassingen. Nagenoeg iedere toepassing bevat wel een deel dat niet kan worden geparallelliseerd, dat met andere woorden serieel is. Als een toepassing een vierde van de tijd besteedt in een niet-parallelliseerbaar deel, zal je de uitvoeringstijd nooit tot minder dan een vierde kunnen reduceren, ongeacht het aantal cores. Dit staat bekend als de wet van Amdahl. Daarnaast is er ook efficiëntieverlies door overhead. Telkens je overschakelt tussen een serieel en een parallel deel van de code gaat er wat tijd verloren omdat alle cores gestart moeten worden of omdat er gewacht moet worden tot ze allemaal klaar zijn. Bij de huidige generatie coprocessors moeten de gegevens ook heen en weer worden gekopieerd tussen het geheugen van de hoofd- en van de coprocessors. Om de overhead van het kopiëren te reduceren zullen in de komende jaren hoofd- en coprocessors worden geïntegreerd op één chip en zal de architectuur van de coprocessor ook moeten worden uitgebreid om te kunnen omgaan met de virtuele geheugenarchitectuur van hedendaagse computers. De eerste tekenen van die evolutie zijn reeds merkbaar. AMD staat klaar met een reeks processors waarbij op één chip een krachtige manycore processor voor dataparallel rekenwerk en enkele klassieke complexe cores geïntegreerd worden. De Intel MIC-architectuur heeft iets complexere cores met ondersteuning voor het virtuele geheugen van de klassieke Intel Pentium en Core-processorlijnen. En eigenlijk kunnen we de Cell-processor van de Playstation 3 zien als het prototype van een heterogene, sterk geïntegreerde manycore processor.

Welke architecturen zullen overleven, zal niet zozeer worden bepaald door de kwaliteiten van de hardware of de marketingafdeling van de fabrikant, maar door de software

Momenteel verkeren we duidelijk in een fase van experimenten. Hardwareontwerpers en technologiefreaks dromen de meest fantastische architecturen bij elkaar. Prototypes worden met wisselend succes getest. Elk klein succes wordt opgehemeld door marketeers die er ook niet voor terugschrikken de werkelijkheid een beetje te verdraaien. Maar van de vele experimentele architecturen zullen er uiteindelijk maar hooguit een drietal commercieel succesvol worden in de pc- en servermarkt. Een rijk en divers software-ecosysteem zoals dat bestaat in deze markt, is immers alleen op een economisch verantwoorde wijze mogelijk als de hardware- en de softwareomgeving voldoende gestandaardiseerd zijn. Welke architecturen zullen overleven, zal daarbij niet zozeer worden bepaald door de kwaliteiten van de hardware of de marketingafdeling van de fabrikant, maar in de eerste plaats door de software. Software evolueert veel trager dan de hardware. Mede daarom (maar ook voor het programmeergemak) maakt men voor bijna alle toepassingen gebruik van programmeermodellen en hogere programmeertalen die wat verder van de hardware afstaan, zodat de code voor meerdere hardwaregeneraties kan dienen. De fabrikant of het consortium dat er als eerste in slaagt om een goede omgeving voor softwareontwikkeling op te bouwen die een eenvoudig aanpassen van bestaande toepassingen mogelijk maakt, en complementair daaraan een voldoende presterend stuk hardware weet te ontwerpen, heeft een winnaar in huis. Niet het succes voor enkele heel specifieke (supercomputer)toepassingen, maar de inzetbaarheid voor het dagelijkse werk op pc’s en servers zal uiteindelijk bepalen welke architecturen op een economisch rendabele manier verder kunnen worden ontwikkeld. De markt heeft daarbij in het verleden al vaker gekozen voor de technologisch inferieure oplossing met een uitgebreider software-ecosysteem.

Dat processors met tientallen cores de toekomst zijn, staat vast. Hoe die processors eruit zullen zien is minder zeker. Uit het verleden kunnen we echter veel leren over de toekomst. Er is al vaker geëxperimenteerd met architecturen die de complexiteit van de hardware naar de software verschoven. Die beloofden een behoorlijke snelheidswinst, maar daarvoor moest de toepassingssoftware zwaar worden herwerkt of moest er een beroep worden gedaan op nieuwe compilertechnologieën om de bestaande programmacode om te zetten naar efficiënte machinecode voor de nieuwe architectuur. Compilers evolueerden echter altijd langzamer dan verwacht en het aanpassen van software was dikwijls te duur, zodat dergelijke architecturen nooit langdurig succesvol geweest zijn in de server- en pc-markt. Daarnaast werd de centrale processor altijd aangepast om de functies van succesvolle coprocessors over te nemen wanneer dat technologisch mogelijk werd. De functies van de mathematische coprocessors uit de beginjaren van de pc werden geïntegreerd in nagenoeg elke CPU-architectuur. Geluidskaarten met DSP’s – dit zijn processors speciaal ontworpen voor de verwerking van gedigitaliseerde signalen – werden uit de markt gedrukt nadat Intel en AMD DSP-achtige instructies toevoegden aan de processors voor pc’s. Extra instructies voor cryptografie in nieuwe processors hollen nu de markt van cryptografische coprocessors al uit voor die goed en wel op gang is gekomen.

De geschiedenis lijkt zich te herhalen. De voorgestelde heterogene systemen met coprocessors voor dataparallelle toepassingen wekken weliswaar heel wat interesse op bij een aantal groepen computergebruikers, maar vereisen grote aanpassingen aan de toepassingssoftware. Opnieuw steunt men op toekomstige evoluties in compilertechnologie om die aanpassingen eenvoudiger of zelfs overbodig te maken. Maar een homogene processor met een relatief beperkt aantal complexe cores (enkele tientallen, niet enkele honderden) uitgebreid met een vectorrekeneenheid gelijkaardig aan die van de Intel MIC-architectuur om dataparallel rekenen te versnellen, is waarschijnlijk al goed genoeg voor de meeste pc- en servertoepassingen. Daarnaast is zo een processor zeker veelzijdiger in gebruik en eenvoudiger te programmeren dan de heterogene oplossingen die nu voorgesteld worden. Toepassingssoftware moet minder zwaar worden herwerkt en het is ook eenvoudiger om compilers te bouwen die veel van dit werk overbodig maken. En of we die processor dan multicore of manycore moeten noemen, is dan vooral een marketingprobleem.

Herb Sutter, ‘Design for Manycore Systems’, in: Dr.Dobb’s, augustus 2009. http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=219200099

John Shalf, Joe Bashor, Dave Patterson, Kste Asanovic, Katherine Yelick, Kurt Kreuzer, Tim Mattson, ‘The manycore revolution: Will HPC lead or follow?’, in: SciDAC Review, 2009, 14, 40-49.

Kurt Lust is als ingenieur computerwetenschappen verbonden aan de KU Leuven.

Deel dit artikel
Gerelateerde artikelen