Déjà Vu allt om igen Parallell beräkning har alltid varit ett sätt att tillfredsställa vår eviga hunger efter allt snabbare och allt billigare beräkningar. 4 Under 1960- och 1970-talen undersöktes parallella beräkningar i stor utsträckning som ett medel för högpresterande databehandling. Men den kommersiella världen fastnade med en strävan efter snabbare processorer och, med hjälp av Moores lag, tog sig till 2000-talet utan att allvarligt behöva engagera sig i parallell beräkning utom för superdatorer. Den parallella arkitekturforskningen på 1960- och 1970-talen löste många problem som man stöter på i dag. Vårt mål i denna spalt är att påminna oss det viktigaste av dessa resultat och uppmana dem att uppväckas. Den allra första multiprocessorarkitekturen var Burroughs B5000, designad från 1961 av ett team lett av Robert Barton. Den följdes av B5500 och B6700, tillsammans med en försvarsversion, D850. Arkitekturen överlever idag i den omvända polska notation HP räknare och i UniSys ClearPath MCP maskiner. Dessa maskiner använde delade minne multiprocessorer där en crossbar switch anslutna grupper av fyra processorer och minneslådor. Operativsystemet, som kallas Automatic Scheduling and Operating Program (ASOP), innehöll många innovationer. Dess arbetslagring var organiserad som en stack maskin. Alla dess kod var "reent", vilket innebär att flera processorer kunde köra samma kod samtidigt medan du dator på separata stackar. Instruktionsuppsättningen, som var anpassad till det algoliska språket, var mycket enkel och effektiv även med dagens RISC-standarder. En nyutvecklad process stack var kopplad till sin förälders stack, vilket ger upphov till en runtime struktur som kallas "kaktus stack." Dataminnet utanför stackarna lades ut i segment; ett segment var en sammanhängande sekvens av platser med bas och bundna av en deskriptor. Segment flyttades automatiskt upp och ner i minneshierarkin, en tidig form av virtuellt minne som inte baserades på personsökning. Elliot Organik's mästerliga beskrivningar av dessa maskiner gör för uppfriskande och givande läsning idag. Burroughs-systemen var ett viktigt inflytande på forskning som sökte effektiva och tillförlitliga parallella programstrukturer. En grupp forskare vid Brown University och General Electric Research Laboratories utarbetade en uppsättning rapporter om en "konturmodell" av inbäddade multitaskberäkningar 1971. 12 Dessa rapporter ger en anmärkningsvärt tydlig bild av en parallell programplanering runtime miljö som skulle passa dagens språk väl och skulle lösa många samtida problem som betraktas som "forskning utmaningar". Det är en tragedi att dessa idéer har försvunnit från läroplanen. Burroughs maskiner försvann inte på grund av någon defekt i sin arkitektur, utan på grund av IBM: s enorma framgång i marknadsföring 360-serien system. Dessutom, i en process som påminner om Clayton Christensens Innovator's Dilemma, låg-end monteringsspråk minidatorer, ursprungligen utformad för att köra laboratorieinstrument, växte upp i minidatorn och sedan microdator marknaden, utan några föreställningar om parallell programmering. Med införandet av RISC arkitekturer i början av 1980-talet, mycket av forskningen för högpresterande datorer omkanaliserades mot att utnyttja RISC för snabba marker. Den tittade på tiden som sofistikerade kompilatorer kunde kompensera för saknade funktioner i chipsen. Med två anmärkningsvärda undantag upphörde de flesta projekt som undersökte alternativ till "von Neumann-arkitekturen" att gälla och ersattes inte av nya projekt eller andra initiativ. Ett undantag var Arvinds Monsoon-projekt vid MIT, 10 som visade att massiv parallellism lätt identifieras i det funktionella programmeringsspråket Haskell, och sedan lätt kartläggs till en delad minnesmultiprocessor. (Functionala språk genererar alla sina värden genom att utvärdera funktioner utan biverkningar.) Det andra projektet involverade en grupp vid Lawrence Livermore National Laboratory som studerade vetenskapliga koder i det funktionella språket Sisal, ett derivat av MIT: s Val språk; Sisal program var lika effektiva som Fortran program och kunde enkelt sammanställas till massivt parallella delade minnes superdatorer. De nuvarande generationerna av superdatorer (och datalager) är baserade på tusentals CPU-chips som körs parallellt. Till skillnad från Burroughs-systemens innovativa konstruktion överensstämmer deras maskinvaruarkitekturer med den konventionella von Neumann-maskinen. Deras operativsystem är inte mycket mer än enkla schemaläggare och protokoll för meddelandepassering, med komplexa funktioner delegerade till applikationer som körs på separata värdmaskiner. Poängen är tydlig: idéer om att arrangera flera processorer för att arbeta tillsammans i ett integrerat system har funnits hos oss i 50 år. Vad är nytt? En av de heliga graalerna av forskning i parallella beräkningar på 1960- och 1970-talen kallades "determinacy". 7 Determinacy kräver att ett nätverk av parallella uppgifter i delat minne alltid producerar samma utdata för given inmatning oavsett hastigheten på uppgifterna. Det bör inte förväxlas med ett liknande ord, "deterministiskt", som skulle kräva att uppgifterna ordnas i samma sekvens varje gång systemet körs. Ett viktigt resultat av denna forskning var "determinacy theorem". En uppgift är en grundläggande beräkning som implementerar en funktion från dess ingångar till utgångar. Två uppgifter sägs vara i konflikt om någon av dem skriver in minnesceller som används av den andra. I ett system av samtidiga uppgifter, rasförhållanden kan vara närvarande som gör den slutliga utgången beror på de relativa hastigheter eller order av uppgiften utförande. Bestämning säkerställs om systemet är begränsat så att varje par av motstridiga uppgifter utförs i samma ordning i varje körning av systemet. Då är inga datatävlingar möjliga. Observera att atomism och ömsesidig uteslutning inte är tillräckliga för determinitet: de säkerställer bara att motstridiga uppgifter inte är samtidiga, men inte att de alltid utförs i samma ordning. En följd av determinatets teorem är att hela sekvensen av värden som skrivs in i varje minnescell under varje körning av systemet är densamma för den givna inmatningen. Den här följdtexten talar också om för oss att alla system för att blockera uppgifter som kommunicerar via meddelanden med FIFO-köer (i stället för delat minne) automatiskt är avgörande eftersom meddelandeköerna alltid presenterar dataobjekten i samma ordning till de uppgifter som tar emot dem. En annan följd är att en implementering av ett funktionellt programmeringsspråk med samtidiga uppgifter är avgörande eftersom funktionerna ger sina data privat till sina efterträdare när de skjuter. Det finns ingen störning mellan de minnesceller som används för att överföra data mellan funktioner. Bestämning är verkligen viktigt vid parallell beräkning. Det säger oss att vi kan släppa loss full parallellism av en beräkningsmetod utan att oroa om några timing fel eller rasförhållanden kommer att påverka resultaten negativt. En annan helig graal för parallella system har varit modulär kompatibilitet. Detta skulle innebära att alla parallella program kan användas, utan förändring, som en del av ett större parallellt program. Tre principer behövs för att möjliggöra parallell programkomposabilitet. David Parnas skrev om två: information som döljer sig och sammanhangsoberoende. Information som döljer sig innebär att en uppgifts interna minne inte kan läsas eller skrivas av någon annan uppgift. Sammanhangsoberoende innebär att ingen del av en uppgift kan bero på värden utanför aktivitetens interna minne eller inputoutputminne. Den tredje principen är argument utan inblandning; den säger att ett dataobjekt som presenteras som indata till två samtidiga moduler inte kan ändras av heller. Funktionella programmeringsspråk uppfyller automatiskt dessa tre principer; deras moduler är således kompatibla. Det är en öppen fråga hur man strukturerar jämförbara parallella programmoduler från olika ramverk när modulerna implementerar icke-determinate beteende. Transaktionssystem är ett extremt fall. Eftersom deras parallella uppgifter kan störa de register de får tillgång till, använder de låsprotokoll för att garantera ömsesidig uteslutning. Transaktionsuppgifter kan inte beställas av en fast ordning-deras icke-determinitet är integrerad i deras funktion. Till exempel går en flygplansstol till vilken uppgift som helst först. Den parallella arkitekturforskningen på 1960- och 1970-talen löste många problem som man stöter på i dag. 32 meddelanden från e c m e t 2 0 1 0 0  på v e l. 5 3 n o. 6 synsätt problem är att hitta ett sätt att dra nytta av fördelarna med kombosability för system som nödvändigtvis är obestämda. Det finns uppenbara fördelar om det delade minnet av en parallell multiprocessor kan vara ett virtuellt minne. Parametrar kan skickas som pekare (virtuella adresser) utan att kopiera (potentiellt stora) objekt. Kompilering och programmering förenklas avsevärt eftersom varken kompilatorer eller programmerare behöver hantera placeringen av delade objekt i systemets minneshierarki; det görs automatiskt av det virtuella minnessystemet. Virtuellt minne är viktigt för modulär kompatibilitet när moduler kan dela objekt. Varje modul som hanterar placeringen av ett delat objekt i minnet bryter mot principen om att informationen ska döljas eftersom andra moduler måste konsultera den innan de använder ett delat objekt. Genom att dölja objekt platser från moduler, möjliggör virtuellt minne kompatibilitet av parallella programmoduler. Det finns två farhågor om stora virtuella minnen. En är att de virtuella adresserna måste vara stora så att de omfattar hela adressutrymmet där de stora beräkningarna fortsätter. Multics-systemet visade att ett mycket stort virtuellt adressutrymme som kan omfatta hela filsystemet skulle kunna genomföras effektivt. 8 Capability-baserad adressering 5, 6 kan användas för att genomföra ett mycket stort adressutrymme. Den andra oron för stort virtuellt minne gäller prestanda. Lokalitetsprincipen försäkrar oss om att varje uppgift har tillgång till en begränsad men dynamiskt föränderlig uppsättning av dataobjekt. 3 Arbetsuppsättningen är lätt att upptäcka-det är de objekt som används i en nyligen bakåtblickande fönster och laddas i en processors cache. Det finns ingen anledning att oroa sig för prestandaförlust på grund av en oförmåga att ladda varje uppgifts arbetssätt i dess cache. Hur är det med cachekonsistens? En kopia av ett delat objekt kommer att finnas i varje delningsuppgifts cache. Hur överförs de förändringar som görs av den ena till den andra? Det verkar som om detta problem förvärras i ett mycket parallellt system på grund av det stora antalet processorer och gömmor. Även här ger den forskning som genomfördes under 1970-talet ett svar. Vi kan helt undvika problemet med cachekonsistens genom att aldrig skriva till delade data. Det kan åstadkommas genom att bygga minnet som ett skriva-en gång minne: när en process skriver in i ett delat objekt, systemet skapar automatiskt en kopia och märker det som den nuvarande versionen. Dessa värdesekvenser är unika i ett bestämt system. Determinera system ger därför ett sätt att helt undvika problemet med cachekonsistens och framgångsrikt köra ett mycket stort virtuellt minne. Funktionella programmeringsspråk (t.ex. Haskell och Sisal) stöder för närvarande uttrycket av stora klasser av tillämpningskoder. De garanterar determinacy och stödja kombosability. Att utvidga dessa språk till att omfatta strömdatatyper skulle medföra riskfria uttryck för beräkningar som inbegriper intermodulrörledningar och signalbehandling. Vi behöver verkligen en ytterligare utvidgning för att stödja programmering i den populära objektorienterade stilen, samtidigt som vi garanterar beslutsamhet och kompatibilitet. Vi har möjlighet att uttrycka obestämbara beräkningar i självförsörjande miljöer som interaktiva redaktörer, versionskontrollsystem och transaktionssystem. Vi behöver i högsta grad strategier som kan kombinera determinerade och icke-determinerade komponenter till välstrukturerade större moduler. De fulla fördelarna med funktionell programmering och kompatibilitet kan inte förverkligas fullt ut om inte minneshantering och trådschemaläggning hanteras fritt i körtid. I det långa loppet kommer detta att kräva sammanslagning av dataminne och filsystem till ett enda, globalt virtuellt minne. Vi kan nu besvara våra ursprungliga frågor. Parallellismen är inte ny; insikten att den är nödvändig för fortsatta framsteg i högpresterande datorsystem är. Parallellism är ännu inte ett paradigm, men kan bli så om tillräckligt många människor antar det som standard praxis och standard sätt att tänka om beräkning. Den nya eran av forskning i parallellbehandling kan dra nytta av resultaten av den omfattande forskningen på 1960- och 1970-talen, för att undvika omdiscovery av idéer som redan dokumenterats i litteraturen: delat minne multiprocessing, determinacy, funktionell programmering och virtuellt minne. Parallellismen är inte ny; insikten att den är nödvändig för fortsatta framsteg i högpresterande datorsystem är.
Parallell beräkning är den eviga önskan om mycket snabbare och mycket billigare beräkning av nivån på superdatorer samt stordator REF.
The resurgence of parallelism
{'venue': 'CACM', 'journal': None, 'mag_field_of_study': ['Computer Science']}