Hoofdcategorieën

Intel waarschuwt developers voor komst duizenden cores

Door Willem de Moor, woensdag 2 juli 2008 21:59, views: 37.211

Intel lijkt softwareontwikkelaars voor te bereiden op een verregaande uitbreiding van het aantal processorcores. Om een dergelijke strategie kans van slagen te geven, zouden programmeurs hun werkwijze drastisch moeten herzien.

Volgens één van Intels chipontwerpers, Anwar Ghuloum, zal de huidige trend van meer cores in processorontwerpen zich voortzetten: volgens hem zouden toekomstige cpu's over tientallen tot duizenden cores kunnen beschikken. Programmeurs zouden volgens Ghuloum met zo min mogelijk aanpassingen in hun algoritmes ternauwernood de mogelijkheden van dual- en quadcore-processors benutten: een strategie die op termijn ontoereikend zou zijn.

Ghuloum, hoofdontwikkelaar van Intel's Microprocessor Technology Lab, pleit dan ook voor programmeermethoden die rekening houden met meer cores dan zijn bedrijf momenteel in processors onderbrengt. Hij bepleit zijn stelling met het argument dat een dergelijke tactiek op termijn kosteneffectiever is dan het aanpassen van software naarmate meer cores per processor beschikbaar komen. Dat zou echter een fundamentele verandering in niet alleen de onderliggende algoritmes van software, maar ook de programmeertalen en libraries noodzakelijk kunnen maken. De daarmee gepaard gaande kosten die niet direct rendabel zullen zijn, zouden echter gecompenseerd worden door toekomstige voordelen voor schaalbaarheid.

Nehalem

Volgende 08:56
Vorige 21:12

Reacties

«  1  2  3  4  5  »

Klinkt alsof Intel graag wilt dat op het moment van het uitbrengen van een processors met " nog" meer cores, dat er software voor handen is die er gebruik van kan maken.

Maakt het wat makkelijker voor Intel of die markt te betreden en meer omzet te draaien.

Niet alleen voor Intel, AMD heeft er ook baat bij.

Zo dwingen ze mogelijk (met de hele industrie) mensen te upgraden naar multicores, omdat de software uiteindlijk (alleen) nog voor multi-cores wordt geschreven.
Net zoals je tegenwoordig je grafische kaart moet upgraden, om een spel te spelen, dat er qua grapics niet echt op vooruit lijkt te gaan.

Ik denk eerder dat Intel erop wil wijzen dat niet alle huidige software het voordeel van meerdere cores benut. Het is natuurlijk wel zo, dat als de consument het nut van meerdere cores niet inziet, omdat ze toch niet optimaal benut worden door de software, diezelfde consument niet zo snel een multicore processor zal aanschaffen.

Tegenwoordig heeft bijna iedereen al een multicore processor. Probeer maar een doorsnee pc te kopen Zonder een dualcore. Bij budget laptops wil dat misschien nog wel lukken. Zelf mobiele telefoons krijgen al multicore processors. Kortom multicores hebben de toekomst, dus waarom zou men dat niet een beetje gaan pushen.

Daarnaast kan ik mij heel goed voorstellen dat toekomstige software gewoon op een singlecore kan draaien, zei het dan niet optimaal.
Maar wat Intel wilt bereiken is dat men de software zo gaat schrijven dat het met minimale of helemaal geen aanpassingen kan werken met een X aantal cores. Kortom software dat optimaal gebruik maakt van het aantal cores wat je hebt. Of dat er nou 2 zijn, wat nu meestal het geval is, of dat het er 500 zijn.

Het leuke van software geschreven voor multi-cores is dat het ook gewoon gaat werken op een singlecore. De twee systemen zijn onderling uitwisselbaar etc. Het punt is alleen dat wanneer een programma geschreven is voor multi-core processors, het veel sneller kan gaan dan wanneer het op een singlecore gedraaid wordt.

Bedenk bijvoorbeeld eens een programma die de inhoud van een X-aantal webpagina's binnenhaalt, en die verwerkt (heb ik eens gedaan). De singlecore-variant roept de pagina op, downloadt hem, en verwerkt het.

Het probleem daarmee is dat er maar een webpagina tegelijk gedownload wordt, het proces dat de zooi moet downloaden is dus 95% van z'n tijd bezig met het wachten op informatie. Als je nu 10 processen hebt die tegelijk uitgevoerd worden, heb je 10 die asynchroon downloaden en verwerken, waardoor er totaal veel meer gebeurt. Ik heb zelf zo'n programma eens gemaakt, en de snelheidswinst is enorm.

Net zoals er developers zijn die niet weten hoe je een multi-threaded app bouwt, zijn er dus ook developers die niet weten hoe je een single-threaded app bouwt. Je hebt echt geen threads nodig om webpaginas asynchroon binnen te halen. En dat is nog simpel ook: in plaats van wachten op 1 request stuur je 10 requests, en wacht je op het eerste antwoord. Dat verwerk je, en vervolgens wacht je op het tweede antwoord, etcterera. Maar omdat je de requests allemaal al vooraf hebt gestuurd hoef je daar niet lang op te wachten.

Dat is programmeertechnisch nogal omslachtig zeker als je requests voor verschillende webservers hebt. Veel simpeler is het om een workerthread the maken die een request stuurt en de gegevens ontvangt en opslaat. Vervolgens maak je een overkoepelende thread die workerthreads start. Iedere worker die klaar is levert je misschien weer nieuw in te dienen requests op. Die zet je achteraan in de queue, etc. Zo kun je gemakkelijk het aantal workerthreads bepalen of load balancing over meerdere servers doen door bijvoorbeeld maximaal 10 workerthreads toe te staan en mocht er een request komen voor een server die al een request heeft ontvangen dan zet je die request achteraan de queue.

Affijn, hoe dan ook. Deze toepassing heeft eigenlijk niets met multi-core te maken. Threading is dan gewoon een handig model om je programma overzichtelijk te houden, maar met 10 threads kan je dat ook gemakkelijk met je single-core af. Het wordt pas echt interessant als je gecombineerd wiskundig rekenwerk over meerdere cores moet verspreiden. Dan is het niet meer triviaal en daar wil intel alvast voor waarschuwen.

[Reactie gewijzigd door Mr_Atheist]


En als het tweede antwoord al binnenkomt terwijl je het eerste nog aan het verwerken bent? Juist ja, die mis je dan.

Ik denk ook niet dat het dit soort zaken zijn die herschreven moeten worden. Alle (?) server applicaties zijn multi-threaded, met een goed OS zijn die automatisch ook multi-core. Ik denk dat het meer bedoeld is voor taken zoals een JPEG rendereren. Met een of een paar cores is het sneller om dat in 1 thread te doen. Als je een paar duizend cores hebt dan kun je opsplitsen zodanig dat elke core bijvoorbeeld een cell decompressed (en dat dus een JPEG in een x aantal micro seconden gedecodeerd is. Dit soort zaken vereist een complete herstructurering van software.

Intel hoeft de markt van multi cores niet meer te betreden. Dit is al enige tijd geleden gebeurd.

Veel software (met name games) houdt nog geen rekening met dual cores, of quad cores, terwijl al enige tijd duidelijk is dat de de snelheid van de cores beperkt is. Dit in tegenstelling tot het aantal kernen.

Software ontwikkeling voor meerdere kernen zal dus een boost moeten krijgen en, gezien de huidige moeilijkheidgraad van parallel processing, lijkt het me logisch dat dit inhoudt dat we op een andere manier moeten gaan programmeren.

En aangezien programmeren volgens een bepaald denkpatroon gaat (vrij vertaald : een algortithme) zullen we in de nabije toekomst andere algorithmes moeten gebruiken.

algortithme
Was dat een freudiaanse verspreking? :P
In het Nederlands schrijven we het overigens gewoon zonder h.

Ontopic: een algoritme bepaalt over het algemeen niet hoeveel processen er simultaan kunnen draaien om dat algoritme uit te voeren. Het probleem is echter dat een algoritme doorgaans een serie van stappen is, en dan is het het makkelijkst om dat dan ook in serie te implementeren, oftewel singlethreaded. Dat is echter niet het probleem van het algoritme zelf! Om precies datzelfde algoritme op te delen in subtaken die parallel kunnen plaatsvinden, moet je bepalen welke delen afhankelijk zijn van andere delen (als in, de uitvoer van het ene deel vormt de invoer van het andere deel). Het is idd waar dat sommige algoritmes idd niet anders dan singlethreaded te implementeren zijn, omdat elke volgende stap afhankelijk is van de vorige stap. Maar dat is lang niet altijd het geval.

Hoezo freudiaans ;-)

Ik ken het verschil tussen algoritme en denkpatroon.

Op dit moment zijn de algoritmes gebaseerd op het serieel doorlopen van een aantal stappen.

Maar aangezien we steeds meer te maken krijgen met meerdere kernen moeten we onze algoritmes aanpassen. Niet mer serieel, maar parallel.

Dat betekent dus dat we onze denkwijze moeten aanpassen. In feite dezelfde ontwikkeling als de er op hardware niveau is gebeurd; we kunnen niet sneller in kloksnelheid, dan maar in aantal cores.

Was het maar zo makkelijk: mensen zijn vrij slecht in het parallel denken en het paralleliseren van een gemiddeld algoritme is vreselijk moeilijk (deadlocks, race-condities etc.). In kan het me werkelijk niet voorstellen dat alles ineens parallel gaat worden. Tuurlijk, sorteren of een spell-checker lukt vrij aardig want de data is te partioneren. Zodra de data/berekening dependencies kent is het wellicht niet eens moeite waard om het te paralleliseren naar 1000'en cores. Neem de print-functie in je tekstverwerker: het maakt de gebruiker vrij weinig uit of deze op 1 of 10 cores loopt als het maar in de achtergrond gebeurt (en dit kan dus al met 1 core). Ik denk dat Intel het graag wil omdat men de performance verdubbeling iedere zoveel tijd wil volhouden. Helaas kan dit niet meer met hogere kloksnelheden, dus gaat men meer cores toepassen en dan vervolgens de programmeurs de schuld geven dat de software de hardware niet volledig benut.

Vroeger dacht men dat de aarde plat was.
Daarna dat de wereld analoog was.

Nu dat de wereld digitaal en serieel is.

Wie zegt me dat er geen parallelle oplossing gevonden kan worden.

Ik zeg niet dat het eenvoudig is. Maar wel logisch gezien de huidige ontwikkeling naar multi-cores.

We kunnen niet meer (veel) harder, maar wel naar meer.

@Het.Draakje:

Ik weet niet waar jij woont, maar hier is de wereld nog steeds analoog hoor. En gelukkig maar zou ik daar aan toe willen voegen.

[Reactie gewijzigd door 7.01D]


Volgens mij is het momenteel 12:09.

Als we het net zoals 'altijd' ongeveer 12 uur zouden blijven noemen, dan hadden we in de ICT technology toch een leuke uitdaging gehad.

Beide tijden worden nu normaal beschouwd. Beide situatie's : analoog en digitaal zijn geldig.

Ik kan dus gewoon stellen dat ik in een digitale wereld leef ;-) Gelukkig maar, dan kan ik mijn computer gewoon gebruiken ;-)

Ik denk dat er genoeg taken zijn die partitionneerbaar zijn. Denk maar aan het renderen van teksten in een bepaalde layout en lettertype: laat elke thread zijn stuk renderen. Vele rekenmodellen vertrekken ook vanuit individueel partionneerbare deelberekeningen die dan samengevoegd worden. De meeste databases zijn thread georiënteerd, photoshop kan ook een afbeelding partitionneren, etc.

Wat ze bij Intel willen wijsmaken is dat de programmeur zijn code veel meer in threads moet opdelen en niet serieel gaan programmeren. Bij de introductie van OS/2 promotte IBM een dergelijke programmeermethode omdat het een nieuwe feature was op micro pc gebied. Maar met de machtsgreep van Windows, waarbij NT een doorontwikkeling was van de OS/2 concepten, is deze methode fors in onbruik geraakt. Nochtans is het een heel mooie manier van werken.

Stel dat je 100 plaatjes dient te converteren, ergens een 12 Mpixel à 5 Mb per stuk in fine jpeg. Dan kun je bv. 10 threads lanceren de elke netjes verdeeld worden over de beschikbare cores en waar de batch over loopt.

Het idee van de threads werd trouwens ontwikkeld met SMP in het achterhoofd. Het is dus echt wel anders programmeren. Daarom is het nog niet de schuld van die of die, de methode verandert.

Voor een tekstverwerker zal het dan ook weinig nut hebben om parallel te rekenen.
Voor games des te meer, geef elke AI z'n eigen core, en het optekenen van pixels kan vast ook prima parallel.

Wellicht is het in de toekomst ook bruikbaar voor het lezen van data van snelle media: niet serieel zoals nu maar parallel honderden bits tegelijk.

Ik ken het verschil tussen algoritme en denkpatroon
Serieus? Volgens mij is dat er niet echt namelijk, dus wat is dan het verschil? :)
Op dit moment zijn de algoritmes gebaseerd op het serieel doorlopen van een aantal stappen
Dat is niet waar. Dat de stappen onder elkaar staan wil niet zeggen dat ze alleen maar serieel uitgevoerd kunnen worden, dat was een beetje de strekking van mijn verhaal. De moeilijkheid is het vinden van de dependencies tussen de stappen op een dusdanige manier dat alles zo parallel mogelijk loopt en er zo min mogelijk delen op elkaar zitten te wachten. Je hebt helemaal gelijk als je zegt dat sommige algoritmes niet geschikt zijn om parallel te implementeren. Maar nu zeg je dat alle algoritmes die momenteel gebruikt worden dat probleem hebben - dat is helemaal niet zo.

@7.01D: De quantummechanica leert anders dat dingen best discreet blijken te zijn, en dat er een eindigheid zit aan de resolutie die we kunnen meten ;)

[Reactie gewijzigd door .oisyn]


Op dit moment zijn de algoritmes gebaseerd op het serieel doorlopen van een aantal stappen
Dat is niet waar. Dat de stappen onder elkaar staan wil niet zeggen dat ze alleen maar serieel uitgevoerd kunnen worden
hij bedoeld niet serieel, maar sequentieel.

Daanaast, het verschil tussen analoog en digitaal :
...analoog is een signaal dat in principe traploos waarden kan aannemen in een continuüm. Praktisch zijn de waarden van een analoog signaal ook beperkt tot een eindig aantal. Analoog staat in tegenstelling tot digitaal, waarbij principieel slechts een beperkt aantal discrete niveaus mogelijk zijn (0 1)

Wat een heerlijk misbruik van termen in deze topic :+

Het punt hier is dat Software ontwikkelaars 'n fix tread aantallen gebruikt wat dus niet meeschaald als er CPU komen met steeds meer cores.
Het probleem licht hier.
Van single treaded is men naar dual threaded gaan programeren en later naar quad threads.
Hou in dat al die 3 typen software totaal niet schalen op multi CPU.

Software moet het aantal cores detecteren en dan treads genereren aan de hand van het aantal cores dat beschikbaar is.

Voordeel is je hoefd geen nieuwe versie van je software te kopen of patch om voledig gebruik te maken van 'n nieuwe generatie CPU met nog meer cores.

Valve geeft hier 'n voorbeeld aan met fine treading in Hybrid threading. wat meeschaald op nieuwe CPU met nog meer cores. Als 'n game engine aan task heeft.
Aangezien task ook verdeeld kunnen worden in multiple thread.

Sorry, maar je kan veel meer threads gebruiken dan dat je cores hebben, alleen zal er op iedere core slechts één thread tegelijkertijd actief zijn. De scheduler van je OS zorgt er echter voor dat al die threads schijnbaar tegelijkertijd actief zijn. Dus op dit moment ben je met een dual core helemaal niet beperkt tot twee threads!

Het enige nadeel van veel threads op minder cores is dat de overhead van de scheduling groter wordt (wat echter altijd weer een afweging is tegen het nu van het gebruik van meerder threads).

Je kan wel heel veel threads draaien op iedere willekeurige processor, maar de maximale rekenkracht haal je uit je processor als je precies evenveel threads draait als cores, aangezien iedere thread meer een stuk overhead met zich meebrengt.

Vreemd genoeg verzoekt Intel programmeurs dus te programeren voor de toekomst in plaats van het heden, omdat dit efficiënter zou zijn ipv. in de toekomst het werk van de toekomst te doen (het aanpassen van programmatuur). En het helpt natuurlijk ook de nieuwe wereld orde volgens Intel te versoepelen.

Ik wil er alleen wel even op wijzen, dat mochten er onderweg naar morgen toch nog technologische ontwikkelingen voordoen waarop het op een andere manier toch niet nodig blijkt om uw software aan te passen, dan kunt u in de toekomst uw software wijzigingen weer sneller ongedaan maken omdat de CPU's dan weer een stuk sneller zijn geworden.

Dat heet voor-investeren.
En daar zijn bedrijven nooit zo happig op... zeker niet in een 'vluchtige' business als de ICT.

Dit komt dus ook echt van een technische man vandaan, iemand die puur naar de technologie kijkt en daarbij het kosten plaatje buiten beschouwing houdt.

Opzich denk ik dat die gelijk heeft, maar voor bedrijven is het nog niet heel erg intressant tenzij je software ontwikkeld voor de lange termijn. Daarnaast is het natuurlijk intressanter om eerst een pakket voor 1 of 2 core's te verkopen en vervolgens op nieuw voor 2 tot 8 cores enzo verder. Of om licenties per core (of veelvouden ervan) te verkopen.

Een aantal grote jongens zou hier erg van kunnen profiteren. Adobe kan nu investeren in betere parallelle verwerking om in de toekomst voorop te blijven lopen met snelheid (en daarmee een stukje gebruikerservaring).

Intel kan waarschuwen wat het wil, maar de huidige generatie van programmeurs wil er gewoon amper aan. Zie hiervoor ook het vrij uitgebreide topic op got: [alg] Gebruik maken van multiple cores

Mijn hoop ligt bij een nieuwe generatie programmeurs die gewoon opgroeien met het idee dat parallel programmeren bij het ontwikkelwerk hoort.

Laten we eerlijk wezen, voor een programmeur die opgroeide met een single 68000 op 7Mhz en zijn hele leven sequentieel geprogrammeerd heeft blijft multi core iets raars. Iets waar je van weg moet blijven. Iets wat je alleen nodig hebt bij extreme scientific algorithms. Dat krijg je er gewoon niet uit. Ik probeer het bij collega's, maar stuk voor stuk... ze denken allemaal dat b.v. Java het volledig automatisch voor ze gaat doen...

Veel programmeurs willen best ontwikkelen voor multi-cores. Hellas is het (nog) veel te moeilijk.

De kunst is dus om het simpeler te maken.


Vroeger moest je nadenken over het vrijgeven van het geheugen na je programma. Tegenwoordig heb je automatic garbage collection (bijv. in Java). Hetzelfde moet je zien te bereiken met parallel computing.

De oproep van Intel is zo gek nog niet.

Vroeger moest je nadenken over het vrijgeven van het geheugen na je programma. Tegenwoordig heb je automatic garbage collection (bijv. in Java).
Een grove misconceptie als je het mij vraagt (sowieso bedoel je tijdens je programma, daarna boeit het eigenlijk niet meer zo ;)). Geheugen is een resource, net als een file op disk, een netwerkverbinding, etc.. Dat je in Java niet meer na hoeft te denken over het physiek vrijgeven van geheugen wil nog niet zeggen dat je in z'n geheel niet meer na hoeft te denken over de lifetime van je resources. Veel Java applicaties, vooral van de beginnende programmeurs, zitten nog vol met resource leaks en gebruiken veel meer geheugen dan nodig, "omdat je er toch niet over na hoeft te denken".

Diezelfde fout moet met parallel programmeren ook niet gemaakt worden, en flowerp stipte het zelf al aan: "dat lost de compiler wel voor me op". Het zou mooi zijn als dat altijd zou werken, maar de praktijk heeft bewezen dat dat gewoon niet het geval is. Code moet ervoor ontworpen zijn. Als ik de volgende implementatie van een faculteit-functie maak:
f(n) := n * f(n - 1)
f(0) := 1
Dan is er geen compiler die dat kan parallelliseren, omdat elke stap afhankelijk is van de vorige (en dus inherent sequentieel en dus singlethreaded).

Je mist het punt.

Vroeger moest je nadenken over garbage collection, nu gaat dit ' automatisch'

Nu moet je nadenken over multithreading, later gaat het automatisch.

Maar of jij nu na moet denken over parallel processing of de ontwerper van de compiler, maakt dat wat uit ?

Een van de twee moet anders gaan denken. En dus moeten er andere technieken komen. En over enkele jaren snap je niet eens meer hoe je het met slecht een processor op kon lossen.

Mwah, het is een kwestie van een soort van template hiervoor. Is in mijn ogen net zoiets als undo/redo ondersteunen. Kwestie van een aantal basisklassen en daarna is het niet veel extra werk. In die zelfde lijn kan je de "acties" die je programma doet ook parallel maken met een standaard setje klassen die er voor zorgen dat dat geregeld wordt. Een soort van scheduler dus. Hangt wel af van het soort programma natuurlijk. Het heeft geen nut te proberen en enkele faculteitsberekening proberen parallel te maken. Wel kan je 100 (onafhankelijke) faculteitsberekeningen naar de scheduler sturen. Of beeldbewerkingen per blok van 64x64 pixels. Etc. Kwestie van het werk iets verder opdelen.

Kijk, dit vind ik dus irritant: kereltjes die komen roepen dat garbage collection de oplossing is, en denken dat men tegenwoordig niet meer hoeft na te denken over geheugen efficiëntie. Vreemd genoeg zijn het diezelfde kereltes die komen klagend dat bv hun PC Crysis niet kan draaien, en het de schuld is van de programmeurs die niet efficiënt genoeg programmeren...

wake-up call: efficiënt programmeren en automatische garbage collection (en Java in zn geheel als je het mij vraagt) gaan NIET samen.

Jouw geloof dat men nu niet meer nadenkt over geheugenallocatie, en later niet meer over multithreading, is dus een bizar naïeve droom.

Wake- up call : niet iedereen die een voorbeeld geeft over garbage collection is een kereltje.

Het zelf (moeten) vrijgeven van overbodige resources heeft niets te maken met efficient programmeren.

Ik laat het aan jouw discretie over of het in Java goed geimplementeerd is, maar in principe maakt het niets uit of je dit vrijgeven zelf goed doet of een ander het goed doet.

Tenzij je op het standpunt staat dat het alleen maar goed is als je alles (dus inclusief de compiler) zelf geschreven hebt.

Mijn geloof is niet dat men niet meer na hoeft te denken over geheugenallocatie of multithreading. Mijn geloof is wel dat beide (tzt) beter geimplementeerd zullen zijn zodat in 80/90 procent van de gevallen dit redelijk simpel te implementeren is.

Goed en efficient programmeren zal (uiteraard) altijd een kunst blijven.

persoonlijk vind ik het juist heerlijk om precies te weten in mijn programma's wanneer welk geheugen 'weg' is en wanneer er wat in staat. Ik denk er dus wel degelijk over na als ik calloc/malloc/free. Daarmee programmeer ik efficienter, en niet als een of andere garbage collecter zomaar mijn geheugen wist/vrijgeeft.

Tja, ik vind programmeren in Assembler ook heel fijn. Het neemt wel veel meer tijd in beslag, en over het algemeen zal de code meer bugs bevatten dan geschreven in een hogere programmeertaal (bij gelijke complexiteit van het programma natuurlijk). Waarschijnlijk werk je aan Opera die na een paar uurtjes draaien 500Mb intern geheugen nodig heeft (ben even de bron vergeten, maar het kwam hier niet zo lang geleden nog voorbij)?
Enne, een gc geeft geheugen niet "zomaar" vrij. Dat doet ie alleen als er geen referenties meer naar zijn, maw. als je er zelf ook niet meer bij kunt.

Het maakt wel degelijk uit of je hetzelf doet of de Garbage collector en waar het uitmaakt is performance.
De garbage collector kan beslissen om tijdens een zeer CPU intensieve operatie te gaan garbage collecten. In een time critical applicatie is dit niet wenselijk en zeer storend.
Als je zelf je geheugen los laat kun je garanderen dat de CPU niks aan het doen is in deze situatie.
Een van de redenen waarom de meeste AAA games nog steeds in C++ worden gedaan en niet in een GC taal is performance.
En zoals hieronder ook al wordt aangegeven is het bijhouden van referenties nog steeds noodzakelijk ook in GC talen.

[Reactie gewijzigd door NC83]


Vroeger moest je nadenken over garbage collection, nu gaat dit ' automatisch'
Blijkbaar mis jij het punt, want mijn punt is dat je "garbage" (lees: resources) nog steeds niet goed wordt opgeruimd. Je weet alleen dat het "uiteindelijk weleens een keer gebeurt". Maar dat wist je toen ook al, namelijk als je je applicatie afsloot. Als jij een reference naar een nogal heavy-weight object laat rondslingeren terwijl je hem eigenlijk niet meer nodig hebt, gaat de GC niet voor jou beslissen dat hij maar opgeruimd kan worden. Denken dat een GC al je resourceproblemen voor je oplost is een misconceptie en een uthopie. Zo ook bij denken dat een compiler jouw code fatsoenlijk gaat parallelliseren zonder dat jij daar expliciete hints voor gaat geven over hoe het moet gebeuren.

[Reactie gewijzigd door .oisyn]


Ik zeg niet dat een compiler parallel computing even gaat oplossen. Ik zeg niet dat garbage collection een perfecte oplossing is.

Ik zeg dat garbage collection inmiddels redelijk werkt, in tegenstelling tot de jaren 80, toen moest ik nog echt nadenken omdat ik maar 1K had.

Ja, als je niet nadenkt, gaat het nog steeds mis. Maar het is stukken verbeterd. Uiteindelijk zal je nog steeds moeten nadenken als je gaat programmeren, maar er zal in de nabije toekomst een situatie ontstaan waarbij we rekening mogen/moeten houden dat er multi-cores zijn en daar kunnen we maar beter rekening mee houden, want voorlopig zie je echt geen verbetering in het aantal Ghz.

Als jij een reference naar een nogal heavy-weight object laat rondslingeren terwijl je hem eigenlijk niet meer nodig hebt, gaat de GC niet voor jou beslissen dat hij maar opgeruimd kan worden.
Als ik een kist met rottend fruit op mijn eettafel laat staatn wordt deze ook niet automatisch opgehaald door de afvaldienst. Kortom als jij iets niet bestempeld als zijnde afval zal niemand het komen ophalen. Er kunnen inderdaad 'leaks' ontstaan in je programma door rondslingerende referenties. Dat wil niet zeggen dat een Garbage Collector zoals Java kent het de programmeur wel een stuk gemakkelijker heeft gemaakt. Zoals jezelf ook al aangeeft hints in een programmeertaal kunnen veel helpen.

@jvo
Om je commentaar kan ik zowel lachen als ook huilen. Een paar templatjes bouwen is echt niet voldoende om zaken goed te paralleliseren net zo min als het ervan uitgaan dat een bepaalde bibliotheek dergelijke zaken voor je oplost. Naar mijn idee heb je nog weinig kaas gegeten van multithreaded programeren

Een garbage collector moet je eigenlijk zelf aansturen. Ik werk zelf vaak in Java. (Niet voor games.) Je moet weten wanneer er ruimte is om op de ruimen, de referenties weghalen en de GC aanroepen. Scheelt eigenlijk niet veel van een situatie waarbij direct geheugen vrijmaakt.

@DikkeDouwe
Ik wil niet zeggen dat een paar templates voldoende zijn. Ik wil zeggen dat een basissysteem voor het gelijktijdig laten draaien van taken herbruikbaar is. Je zal uiteindelijk zelf moeten bepalen wat parallel te draaien is of parallel te maken is. Oh, en ik doe het regelmatig, maar dan moet ik het wel in het ontwerp meenemen natuurlijk. Dat is het belangrijkste. Achteraf voeg je het niet even toe.

Op compiler niveau mutithreaden zal er zeker komen of is er al. Bepaalde code blokjes die goed herkenbaar zijn, en easy op te splitsen kan de compile zelf doen. Complexe taken nog niet. Dus op hele fijne low level manier, doe je toch al aan multi threaden. De winst is natuurlijk niet veel aangezien alleen 'n deel(tje) van de code geparaleliseerd wordt. Wat neer komt op 'n specifiek code blokje even een boost krijgt. Om het veel beter en grootschaliger te doen, moet je taken die geschikt zijn voor parralelisatie zelf mutithreaded maken. En taken die dat oorspronkelijk niet zijn zodanig ombouwen dat meer parralelisatie mogelijk wordt.

Dus met het oplossen van 'n software probleem houd je al rekening hoe je dit Multithreaden kan doen. Dat zal niet altijd gaan en soms heel moeizaam. Of niet zo optimaal.

Uiteindelijk krijg je een target market waar single dual en quad oude chips geworden zijn en mainstream is zoiets als 16 of 32 als budged 48 en 64 als midrange en high-end 128 256 cores.

In die situatie zal de mainstream vraag naar adoptive multitasken aan de hand van aantal cores zeer gewenst zijn. En dan moet het meer. De software engeneers die dan uit de IT opleidingen ondertussen lopen zouden al Multithreaded zijn opgevoed. Tenzij studie weer eens mijlen ver achter loop op bedrijfs leven in de IT software enginering. En vetereanen moeten er ook aangeloven om er intesiever mee bezig te zijn. En mutitasken op 'n Core detecting manier wordt eerder 'n standaard software enginering requierment.

Over die garbage collector.
Als performance belangrijk is. Kan dan eventuel de programeur de tijd aangeven wanneer de garbage frequenter geleegd wordt in minder critische tijd stippen. Dus niet automatisch een grote collectie even vrijgeven. Maar in kleine frequente stappen.
Of instances her gebruiken.
Door 'n object manager die objecten met 'n bool bfree; hergebruikt en opnieuw initialiseerd en dus 'n herboren object wordt. waardoor je de garbage collecting minimaliseerd. En ermee ook geheugen fragmentatie tegen gaat.
Geheugen pool zal vaker bij PC geen probleem zijn genoeg reserve.
Bij consoles met hun 512. niet zo.

@ .oisyn

Uiteraard geldt bij parallel processors aansturen dat je binnen de door jou gestelde functie geen / slecht meerdere processors zou kunnen gebruiken ter optimalisatie van de snelheid. (als meerdere processors serieel geplaatst zouden zijn zou dit voor jou situatie bijvoorbeeld ook een hogere doorvoer kunnen opleveren; het nadeel van jou voorbeeld is alleen in deze dat het aantal keren van het doorlopen van de functie variabel is)

Bij parallelle coding moet het echter uit parallel af te handelen onderdelen bestaan.
Als je de door jou genoemde functie met meerdere n waarden zou willen uitvoeren zou je iedere uitvoering door een andere core kunnen laten afhandelen, hetgeen sneller het resultaat kan opleveren..
Een toepassing van een goeie vorm van caching zou je daarnaast versneld het antwoord kunnen geven van een functie die al eerder is uitgevoerd.
(Eerst n=99 en daarna n=100 berekenen zou met een goede caching voor 99% snelheidswinst moeten zorgen bij het ophalen van het n=100 resultaat)

Het probleem zit hem vaak echter in het garanderen van de serialiseerbaarheid van de parallelle verwerkingen.
Vergelijkbare problemen komen voor binnen database systemen en worden d.m.v. transacties gewaarborgd.
Het nadeel van transacties is echter een flinke beperking in je mogelijkheden om te parallelliseren.
Je zal naar een vergelijkbaar systeem toe moeten wil je goed met meerdere cores om kunnen gaan.

Situaties waarin parallellisatie eenvoudig en goed benut kan worden zijn bijvoorbeeld image rendering (Video bewerking / In game berekeningen uitvoeren die bepalend zijn voor de weer te geven beelden)

Situaties waarin dit slecht te realiseren is zijn o.a. faculteit functies (een goede caching zal daarvoor beter kunnen werken; bijvoorbeeld via opslag van variabelen en resultaat in databases); andere functies waarbij het resultaat afhankelijk is van het resultaat van zijn voorganger.
In de meeste lussen zal het gebruik van parallellisatie "gewenst" worden en zal dit weinig problemen opleveren wanneer gegarandeerde seriële afhandeling niet nodig is; is dit nl. wel het geval dan is een soort transactie manager een vereiste.

Heeft niks met de huidige generatie van programmeurs te maken. Multi-process programmeren is lastiger dan SP, en zal altijd zo blijven. Als het aan software developers lag zou het gewoon SP blijven, want zij hebben er absoluut geen baat bij. Hardware developers lopen gewoon tegen natuurwetten op (zal ze leren om voor een minder puur wetenschapsgebied te kiezen.).

Heeft niks met de huidige generatie van programmeurs te maken. Multi-process programmeren is lastiger dan SP, en zal altijd zo blijven
Ik ben oud genoeg om nog net de kreten van de vorige generatie programmeurs te kunnen herinneren. Die zeiden grofweg hetzelfde: "OO programmeren is lastiger dan procedureel, en zal altijd zo blijven".

Parallel programmeren hoeft absoluut niet moeilijker te zijn. Net zoals objecten aan kunnen sluiten bij een natuurlijke gedachte gang, zo kunnen parallelle processen dat ook. Het kan eenvoudiger zijn als iets in een aparte thread draait, omdat dat process dan ook echt geïsoleerd is van de andere dingen die er binnen je applicatie gebeuren.

Zo heb ik b.v. een applicatie waar een thread op de achtergrond periodiek een andere server checked voor bepaalde events (polling) en bij veranderingen een globale structuur update. Andere threads die deze data willen benaderen doen dat via -1- guarded method die een (thread safe) copy teug geeft.

Dit update process via een thread laten lopen is werkelijk makkelijker dat het niet via een thread te doen. De access methods regelen eenvoudig, maar strak de toegang. Dit is sowieso een goede practice, zelfs in een single threaded applicatie.

Zodra locks, barriers, blocking queues, etc een 2de natuur voor je zijn geworden is het echt niet bijzonder moeilijk om te programmeren. Je moet je afhankelijkheden en data stromen strak kunnen definiëren. Kun je dat niet dan val je waarschijnlijk af als je parallel moet gaan programmeren, maar eigenlijk was je dan waarschijnlijk ook al niet zo geschikt voor single threaded programmeren. Ook daar is lukraak allemaal variabelen van waarde veranderen niet al te best voor de onderhoudbaarheid van je code.

Probeer nu maar eens deze applicatie efficient over >100 cores te verdelen... Quasi onmogelijk om dat manueel voor het merendeel van de applicaties te doen.

Volgens mij denk je verkeerd

i..p.v. 'hoe kan ik het proces verdelen over 1000 cores?'

zou je je moeten afvragen

'hoe kan ik het proces verdelen over zoveel mogelijk (als zinvol is) treads?'


Het is onnozel om je proces onnodig op te delen, de applicatie wordt zelfs langzamer, en aan de andere kant, als je teveel treads hebt wordt de boel vanzelf gecued.

Het is maar net wat nuttig is :D

<edit>
het beste is om je app een thread te laten spawnen wanneer nodig is (of forken)

[Reactie gewijzigd door j0nathan]


Dit was gewoon een voorbeeld om aan te geven dat manueel je applicatie over threads verdelen niet meer opgaat voor het merendeel van de applicaties eens je over xtallen cores begint te spreken.
En nu kan je inderdaad nog makkelijk weg komen met een single thread applicatie, maar als je een cpu hebt met honderden cores die elk individueel maar de performantie hebben van een oude celeron cpu dan wil je dat je applicatie op een of andere manier (liefst zo simpel / automatisch mogelijk, tijd is geld) toch verdeelt kan worden over zoveel mogelijk cores ==> paradigm shift.

Een thread safe copy maken is niet in alle situaties geschikt.. Neem een IDE zoals NetBeans of Eclipse, deze compileren een tekst die aan veranderingen onderhevig is. Snel een kopie maken van de ingevoerde tekst is leuk bij een tekst van enkele kilobytes, bij een megabyte wordt het al minder leuk ... nog leuker wordt het als de resultaten van de parser (die dus in een andere thread loopt) gemerged moeten worden met de geedite tekst. Voor dit laatste moet de geedite tekst geblokkeerd worden.

Ik heb zelf een vrij eenvoudige variant geschreven van een tekst-editor die op de achtergrond parsed ... en eenvoudig een 100% kopie maken van de tekst is inefficient. Een goede combinatie van welke data thread-safe is (geshared kan worden over alle threads) en welke data een read/write lock mechanisme nodig heeft is zeer belangrijk. En ik ben van mening dat de taal cq de compiler hier enorm kan helpen (en synchronized in Java is niet voldoende). En ik ben ook van mening dat MP programmeren 1 dimensie (en misschien wel 2) extra toevoegd aan SP programmeren.

Ik ben oud genoeg om nog net de kreten van de vorige generatie programmeurs te kunnen herinneren. Die zeiden grofweg hetzelfde: "OO programmeren is lastiger dan procedureel, en zal altijd zo blijven".
Jou leeftijd boeit me niet veel. Maar OOP is in veel opzichten lastiger dan procedureel. Programma structurering is opeens veel belangrijker geworden, en dat is best lastig. OOP heeft veel problemen van procedureel programeren opgelost, maar het heeft er ook een hele boel niet geintroduceerd. Met AOP kunnen veel van de OOP problemen opgelost worden. AOP is lastiger dan OOP, want het introduceerd weer een nieuwe abstractie laag.

1 belangrijke eisen van echt MP is dat er _geen_ global state is. Als je een global state introduceerd is je software een heel stuk minder schaalbaar. Zeker als je naar duizenden cores gaat. Tenzij je 1 super krachtige core hebt die je global state kan beheren. Je kan wel met copies werken, maar dat introcueerd weer enorm veel overhead en de standaard concurrency issues as meerdere copies gecommit worden.

read-only MP is makkelijk

Twee belangrijke dingen zijn gaande: 1) De chipbakkers hebben moeite om 1 hele snelle kern te maken, dus maken we er -tig minder snel. 2) Huidige programmeertalen en hun compilers zijn niet gebouwd met multicore systemen in het achterhoofd.

Programmeurs gaan vermoeien met het drama dat multithreading heet is onzin. Geen enkele serieuze software toko die daar in zal investeren. Voor maar wenige applicaties is multicore-support werkelijk interessant, omdat het ook prima kan lopen op een single-core.

Dus op naar betere comilers en wat aanpassingen aan huidige talen, daar zal het grootste verschil gemaakt kunnen worden.

Erg kort door de bocht geredeneerd. Single-threaded werken is een gevolg van het feit dat men zulke ingewikkelde CPUs vroeger niet kon maken. Dus moest je allerlei truuks uithalen om ervoor te zorgen dat je toch dingen semi-parallel kunt doen.

Taken verdelen is in veel gevallen gewoon slimmer (wat denk je dat sneller klaar is: een muur van 100 meter waar 100 man serieel - d.w.z. meter voor meter - aan werkt of een muur van 100 meter waar 100 man parallel aan werkt - d.w.z. iedereen doet tegelijkertijd een meter).

Ja, je moet je van een aantal zaken bewust zijn die feitelijke allemaal neerkomen op één simpel principe: zaken kunnen ineens asynchroon gebeuren (d.w.z. buiten een simpele sequentie van opdrachten).

Tot op zekere hoogte zul je dat met betere compilers kunnen oplossen, maar naast het feit dat die ook geschreven moeten worden, moet je als programmeur ook gewoon snappen wat er gebeurt.

Nee IOrien heeft helemaal gelijk. De klok snelheid van micro processoren lopen te limit van de golflengte op. Plus optimaal gebruik maken van het aantal transistoren, wat nog steeds toeneemt, wordt ook steeds complexer.
Oplossing: maak een kleine core en stop er heel veel van in een IC.

Nieuwe probleem: hoe programeer ik dat ding?
de huidige programeertalen zijn allemaal sequentieel van opzet. C C++ VB Java.
b.v. C is niet thread safe.

Dat de compiler even de code parallel maakt is wel een hele simpele veronderstelling.
Ook de veronderstelling dat als je 100 processoren hebt het 100 keer sneller gaat dan een processor is fout.
Zie http://en.wikipedia.org/wiki/Amdahl%27s_law
Parallel processen is niet iets van de laatste tijd al tientale jaren wordt er onderzoek na gedaan en er is maar een conclusie: HET IS MOEILIJK!!!!

Ik vind dat dat gewoon een taak van het OS of de box waarin de applicatie draait (dotnet/java) is. Dat moet maar zorgen dat de applicatie 500 miljoen cores kan gebruiken. Tegenwoordig distantieren we ons zo ver mogelijk van geheugenverbruik en dat soort zaken: daar moet de CLR van dotnet maar mooi voor zorgen.
Hetzelfde voor cores: ze doen maar!

En hoe ga jij het OS in godsnaam laten beslissen hoe hij jouw algoritme kan verdelen over verschillende threads?
een algoritme is sequentieel, en in veel gevallen kan het niet anders, dus het OS dit late analyseren is een quasi onmogelijke taak.

Dat "Java" het allemaal voor hen gaat doen is geen "raar idee" Dit is namelijk al mogelijk. Het gaat echter wel ten kosten van de performance ten opzichten van zelf geoptimaliseerd programmeren. ( Dit geld niet alleen voor JAVA )

Deels ben ik het met je eens en deels niet
Het ligt er maar heel erg aan waarvoor je programmeerd

Ik maak bijvoorbeeld web-systemen (PHP). Ik zou bij god niet weten hoe ik dat paralel zou moeten doen, als PHP het al ondersteunde. Bij webpagina's zit je de hele tijd op de IO te wachten. De data van files die je moet hebben, de data van de database,etc

Je kan niet paralel omdat je vervolgstappen afhankelijk zijn van die data waar je op zit te wachten.

Wanneer komen die mainstream processors met tientallen cores dan?
Laten ze daar eerst maar een uitspraak over doen.

Er zijn al proccessors met honderden cores.

Graphics processors :+

En de trend is om GPUs meer en verschillende taken uit te laten voeren (CUDA, Folding@Home, Physics, etc.)


Het lijkt niet onwaarschijnlijk dat ook CPU's deze richting uit gaan

Buiten het feit dan dat de cores van een CPU nagenoeg oneindig veel verschillende soorten berekeningen kunnen uitvoeren, terwijl die van een GPU enkel zeer snel parallel dezelfde berekeningen op grote hoeveelheden data kan uitvoeren (bv. een AA 4x over elk frame).

Je laatste zin vind ik wel iets hebben, maar je moet beseffen dat dat niet zo snel zal gaan als bij de GPU's, aangezien één enkele CPU-core veel meer is dan één enkele GPU-core.

Je ziet de zaken toch wel verkeerd...

Met de huidige GPU's kan een GPU in weze hetzelfde als een CPU. Met het verschil dat een CPU volkomen is geoptimaliseerd voor een enkele thread, en een GPU voor vele threads, waardoor ze zeer verschillende prestaties laten zien voor bepaalde toepassingen. Maar ze kunnen dezelfde berekeningen uitvoeren. .

Die "beperkingen" dat de GPU dezelfde taak parrallel uitvoert, is een hele praktische, en zal ook in zekere mate waarschijnlijk ook voor CPU's gaan gelden mocht men inderdaad duizenden cores op een chip zetten. Want wat denk je nu? Dat als een CPU duizenden heeft, dan die dan allemaal volkomen andere dingen doen? Natuurlijk niet! Uiteindelijk zijn er op een desktop toch maar enkele taken actief. Het zal er dus op neer komen, dan een CPU een probleem, bijvoorbeeld een matrix berekening, gaat opsplitsen over al zijn cores, en veel cores dus nog steeds min of meer dezelfde dingen doen.

Er zijn al proccessors met honderden cores.
Dat zouden NVIDIA en AMD willen. GT200 heeft 30 SIMD 'cores', RV770 heeft er 5. Dat NVIDIA's marketing praat over 128 of 240 'cores' wil niet zeggen dat ze dat ook daadwerkelijk zijn.

Nehalem draait acht threads, op vier cores. Da's al een behoorlijke uitdaging om die allemaal te benutten. Bovendien gaat vermoedelijk na de overgang op 32 nm een versie met acht cores (twee dies in één verpakking) verschijnen, da's al 16 threads, amper een jaar later. De opvolger, Sandy Bridge, zou mogelijks nog meer threads per core kunnen draaien...

Wil je dus meeblijven dan moet je nú al serieus nadenken over hoe je software naar zoveel threads zal schalen.

Of een Niagara met 256 threads? Zeker op server doeleinde zal het steeds interessanter zijn om fatsoenlijk meerdere cores te ondersteunen daarintegen lijkt het op de gewone desktop vaak achter te blijven. Echter ik vraag me af wat er nou zoveel cpu kracht nodig heeft. Veel thuis gebruikers komen niet voorbij Outlook/IE/Office en dan zou een cpu met 3 a 4 threads al voldoende zijn. Hooguit voor gamers zou het interessanter zijn als hier fatsoenlijke support zou komen wat er ook langzaam aan lijkt te komen met de PS3 die ligt te lurken. En prof software zoals Acad/3dsmax die hebben al jaren support.
Dus tenzij die duizenden cores op zich zelf zwakker worden is er niet echt veel behoefte de komende jaren voor meer ondersteuning. Tevens zou het ook wel zo charmant zijn om minder intensief te coden. Ik als niet ICT'er heb misschien makkelijk praten maar als ik optisch kijk naar of Ubuntu of XP dan vraag ik me ten sterkste af of al dat fraais daadwerkelijk zoveel cpu kracht nodig heeft.

voorbeeldje voor thuisgebruiker:
fotobewerkingsfiltertje proberen, hmm er moet een keuze worden ingeven van, zeg, de hoeveelheid smoothing die ik wil tja, geen idee, dus hij/zij voert willekeurig getal in, bekijkt resultaat, verandert het getal,bekijkt nieuw resultaat, etc, dat is dus nu.
in toekomst:
fotobewerkingsfiltertje proberen, meteen wordt een hele reeks van waardes doorgerekend en de gebruiker kan door de resultaten heen bladeren zonder zich er van bewust te zijn dat aan elk resultaat een smoothing waarde zit.

Das idd een leuke toepassing! :)

Nou nou dat is goed nieuws. Op zich maakt het niet al te veel uit. In dit soort situaties maak je over het algemeen alleen onderscheid tussen 1 en n cores (als het goed is opgezet).

Dat is zeker niet altijd zo!

Recursieve problemen doen het meestal inderdaad meestal voor n cores.

Functionele (architectische) opdeling, wat ook absoluut een logische opdeling is, geldt zeker niet automatisch voor 1 of n cores! Denk b.v. aan een thread voor de user interface, 1'tje voor de audio en 1'tje voor de constraint checker en 1'tje voor het background netwerk verkeer.

Een functionele opdeling in threads maak je dan ook niet om snelheidswinst te halen; het levert namelijk absoluut geen merkbare snelheidswinst op. Er zijn goede redenen om een programma functioneel in threads op te delen (blokkerende componenten, programmeergemak), maar snelheid is er niet een van.

Klopt, maar dat is in dit geval wel exponentieel complexer! Het is al lastig met twee cores. Wat als core 2 moet wachten op core 1 of core 1 nog met data bezig is die core 2 ook nodig heeft (maar die dus een moment later niet meer klopt), dat is al ingewikkeld, zoals nu ook al met threads. Maar trek nu core 7 er eens bij, die op core 2 wacht die op core 1 wacht die met dingen bezig is waar core 4 ook wat mee doet en core 5 tegelijkertijd. Voor je het weet ligt je hele software plat, of in sommige gevallen - nog gevaarlijker - krijg je niet correcte/betrouwbare resultaten!

Heb je gelijk in, maar als je dat eenmaal voor 8 cores hebt opgelost dan zou het in principe ook voor 1000 cores moeten werken.
Net als bijvoorbeeld het systeem van google maakt het niet uit of er nu 1000 of 1001 cores / pc's aanhangen.
Nu moeten dus alleen programeurs / compilers deze uitdaging aan gaan pakken.

Google zijn software is dan ook een schoolvoorbeeld van makkelijk paraleliseerbare software. Miljoenen klanten die elk relatief simpele operaties uitvoeren. Probeer hetzelfde maar eens met iets zoals Crysis of VMware, zelfs de genien bij google lopen weg als ze zulke dingen efficient op 100'en cores moeten laten lopen.

Toch zie ik liever dat de CPU de zaken afhandelt alsof deze één core heeft. Zijn we meteen van dit programmeer probleem af. Hoe simpler, hoe beter.

De zaken afhandelen alsof het één core heeft, is nu juist het hele probleem. Dat is precies wat men de afgelopen 20 jaar gedaan is. Men heeft intern uiterst ingewikkelde slimme CPU's gemaakt, die naar buiten toe heel simpel lijken. Maar er zijn limieten over hoe ver je daar meer door kan gaan. Het wordt steeds inefficienter om dat te doen.

Een paar jaar geleden is mijn tot de conclusie gekomen dat dat een heilloze weg is. De limiet van die methode is gewoon bereikt, en het is gewoon noodzakelijk dat de software specifiek voor multicore geschreven wordt. De huidige CPU's zijn multi-core, omdat het pure verspilling van transistoren zou zijn om nog single core te bouwen.

Chip Multi-Processor Scalability for Single-Threaded Applications (2005)

Zelfs al gooide men alles in de strijd om de single-threaded prestaties te verbeteren, dan zou men na 3-5 jaar tegen de absolute limiet aanlopen.

We kunnen er dus absoluut niet omheen om multi-threaded te gaan. Dat men het nu al doet in plaats van over 3-5 jaar is omdat de totale prestaties hoger kunnen zijn dan op een complexe single-core, mits wat inspanning van de programmeur.

[Reactie gewijzigd door c0d1f1ed]


Het probleem is dat CPU's dit al jaren doen. En alles wat er daarmee aan performance uitgeperst kon worden is er al uitgeperst.

iets in de trant van 128 bits processing voor een quadcore oid.. en dan alle programma's native 128 bits geven.. etc..
gewoon grotere instructies tegelijk kunnen uitvoeren, ipv vele kleine tegelijk.

32 bits gaat er sowiso uit, net als 16 bits, 13 jaar geleden.

Complete onzin, helaas. Je hebt net VLIW beschreven. Dat is hoe de Itanic werkt, 128 bits instructies & speculatieve uitvoering. En kijk eens hoeveel tweakers nu een Itanic PCtje hebben.
16 bits ging eruit omdat het al snel niet meer simpel was. 16 bits is 64KB, voor 640KB had je al 16+16 bits nodig (8086). De stap van 16+16 naar 32 bits is logisch, dat maakte zaken een stuk simpeler. Het aantal apps wat meer dan 4GB nodig heeft is erg klein; daarn