Parallellprogrammering i C++ 17 EDT621 Datorarkitekturer med Operativsystem Viktor Lindgren

Relevanta dokument
Hyper-Threading i Intelprocessorer

PARALLELLISERING AV ALGORITMER PROCESSORER FÖR FLERKÄRNIGA

Hyper Threading Intels implementation av SMT. Datorarkitekturer med operativsystem - EITF60. Felix Danielsson IDA2

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

Datorarkitekturer med operativsystem ERIK LARSSON

Parallellism i NVIDIAs Fermi GPU

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

Öka prestanda i Shared-Cache multi-core processorer

Pipelining: Software Optimeringar Av: Gustaf Lagerblad

Hantering av hazards i pipelines

Parallellism i CDC 7600, pipelinens ursprung

Tentamen den 14 januari 2016 Datorarkitektur med operativsystem, EDT621

Software Technology. Josef Svenningsson

Prestandapåverkan på databashanterare av flertrådiga processorer. Jesper Dahlgren

SIMD i Intel s P5- baserade Pentium MMX

Tentamen den 18 mars svar Datorteknik, EIT070

Föreläsning 2. Operativsystem och programmering

Schemaläggnings metoderna AMP & SMP i en Multiprocessor

KUNDCASE. Inovia gjorde sin AI-utveckling 10 gånger snabbare med Power-plattformen

Hur det går att minska effektutvecklingen i en processor genom att ändra pipeline

CDC en jämförelse mellan superskalära processorer. EDT621 Campus Helsingborg av: Marcus Karlsson IDA

Forskning och utveckling inom språkteknologi Uppgift 3: Projektförslag Parallelliserad dependensparsning i CUDA

Cacheminne i en Intel Core 2 Duo-processor

Cacheprobe: programbibliotek för extrahering av cacheminnesparametrar

Datorarkitekturer med operativsystem ERIK LARSSON

HF0010. Introduktionskurs i datateknik 1,5 hp

Emil Kristiansson Kurs: EDT621 Delmoment: Rapport. En introduktion till Smart cache

Datorarkitekturer med operativsystem ERIK LARSSON

Objektorienterad programmering

Tentamen den 14 januari 2015 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Introduktion till programmering. Programspråk och paradigmer

Tentamen den 12 januari 2017 Datorarkitektur med operativsystem, EDT621

MESI i Intel Core 2 Duo

Pipeline hos ARM Cortex-A53 och ARM Cortex-A73

Anujan Balasingam IDA14 NAND flashminnen

Pipelining i Intel Pentium II

Strategier för att utnytja parallella system. Peter Kjellström NSC Upplysning

Prestanda och skalbarhet

Designmönster, introduktion. Vad är det? Varför skall man använda mönster?

Grafikkort till parallella beräkningar

Schemaläggningsmetodik för multi-core inom Windows 7 OS Vad är scheduling och hur schemalägger Windows OS sina processer?

What Is Hyper-Threading and How Does It Improve Performance

Superscalar Bra: Hårdvaran löser allt: Hårdvara detekterar poten6ell parallellism av instruk6oner Hårdvara försöker starta exekvering (issue) av så

Multi-ported cache En rapport om några lösningar till att få flera minnesaccesser simultant.

Cacheminne i en AMD Opteron Processor

Datorteknik ERIK LARSSON

SVAR TILL TENTAMEN I DATORSYSTEM, VT2013

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Trådar. Aktiva objekt

Bank Switching. Att nå multipla adressrymder. Av: Drazen Mijatovic

Inledande programmering med C# (1DV402) Introduktion till C#

Datorteknik ERIK LARSSON

Intro till standardbiblioteket. Eric Elfving

TDDD78 Objektorientering: Lagring och livstid

En Von Neumann-arkitektur ( Von Neumann-principen i föreläsning 1) innebär:

Operativsystem. Hierarkin för hårdvara läses nerifrån

32 Bitar Blir 64 Sammanfattning

JavaRats. Kravspecifikation. Version 1.1. Gustav Skoglund Marcus Widblom Senast ändrad: 13 / 05 / 08

Distribuerade affärssystem

IT för personligt arbete F5

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Sammansatta datatyper Generics: Parametrisk polymorfism

DYNAMISKT MEDIANFILTER I REALTIDSSPEL

Programmering B med Visual C

Fetch-Execute. Datorteknik. Pipelining. Pipeline diagram (vid en viss tidpunkt)

Cacheminne Intel Core i7

Aktivitetsschemaläggning för flerkärninga processorer

Effektivitetsmätning av multitrådning på ARM Cortex-A53 mikroarkitektur

1.1 Runnable och Thread

Kursplanering Objektorienterad programmering

Configuration testing Why? Vad det är tänkt att koden ska göra. Performance testing Kommentarer Skriva om koden som kommentar

Tentamen den 9 januari 2018 Datorarkitekturer med operativsystem (EITF60)

Operativsystem (IS1350) :00-12:00

Introduktion till migrering till molnet. PART 4: Plattformar för molntjänster

Föreläsning 3: Händelsestyrda program och användargränssnitt

Svar till tentamen den 16 december 2013 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Viktiga begrepp. Algoritm. Array. Binärkod. Blockprogrammering. Bugg / fel och felsökning. Dataspel. Dator

F5: Högnivåprogrammering

F5: Högnivåprogrammering

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Programmeringsteknik I. Föreläsning 3: Klasser och arrayer

Universe Engine Rapport

Information Coding / Computer Graphics, ISY, LiTH. Minnesaccess. Vitalt för prestanda! Minnestyper. Coalescing

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

MESI-protokollets funktion i multiprocessorer

Introduktion till programmering

Datorteknik ERIK LARSSON

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Filöverföring i Windowsmiljö

Processor pipelining genom historien (Intel i9-intel i7)

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Tentamen i Realtidsprogrammering

Operative system. LRU-algoritm (2 p) Svar: 7 fel. c) Optimal algoritm (2 p) Svar: 6 fel

Grundläggande datavetenskap, 4p

Arm Cortex-A8 Pipeline

Teoretisk del. Facit Tentamen TDDC (6)

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

+Överskådlighet Normalt sätt blir ett program skrivet i det procedurella paradigmet överskådligt. Modifikationer på delproblem kan ske med lätthet.

VI SI CLOSETALK AB SYSTEMKRAV

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Transkript:

Parallellprogrammering i C++ 17 EDT621 Datorarkitekturer med Operativsystem Viktor Lindgren 2016-12-05 Sammanfattning I följande rapport introduceras de tillägg som planeras genomföras i kommande C++ 17 för att stödja parallell exekvering av existerande algoritmer och vad de kan innebära för de som skriver kod till C++. De tillägg till standarden som specificerats beskrivs, med en förklaring av vad olika Execution Policies innebär, och vad det är för typ av algoritmer som kommer påverkas av ändringarna. Därefter följer en kortfattad översikt över några av de alternativ som funnits tidigare för det som nu läggs till, och slutligen görs en enkel analys av vad det är tilläggen kan tillföra, och vad för begränsningar som finns. Introduktion Flerkärniga processorer finns idag i de flesta datorer som används. Förutom de större serverkluster som använder sig av flera separata processorer använder både hemdatorer och mobiltelefoner flerkärniga processorer för att öka prestandan utan att effektförbrukning eller klockfrekvens ska påverkas för mycket. Kostnaden för detta är att mjukvaran behöver anpassas för att arkitekturen ska kunna utnyttjas maximalt. En del av detta går att göra med hjälp av operativsystem som kan hjälpa till med att fördela belastningen mellan processorkärnor. Om programmet inte anpassas för parallelism när det skrivs är dock den möjliga prestandavinsten av detta begränsad då schemaläggaren inte alltid kan veta att en del av ett program är parallelliserbar och följaktligen inte kan utnyttja processorns fulla kapacitet. Satish et al. (2012, 84) visar till exempel på en prestandaökning på i snitt 3,5 gånger för algoritmer som behandlar stora datamängder om koden optimeras för multi-core. När det kommer till högnivåspråk så bygger de nästan alltid på en sekventiell arbetsprocess, och det finns ofta begränsat stöd inbyggt för att parallellisera processer. I den här rapporten ligger fokus på C++ som tidigare har varit beroende av tillägg och modifierade kompilatorer 1

till exempel PPL (Parallel Patterns Library) och OpenMP (Open Multi-Processing) för att uppnå detta. I och med uppdateringen till C++ 17 som är planerad att släppas 2017 ska visst stöd för parallellprogrammering komma att läggas in i standardbiblioteken, med fokus på paralleliserade versioner av existerande algoritmer. Denna denna rapport syftar till att ge en översikt av de tillägg som kommer samt hur de fungerar jämfört med ett urval av de alternativ som finns tillgängliga idag. Tillägg i C++ 17 Parallelliserade algoritmer föreslogs att bli del av C++ redan 2012 av två grupper, en hos NVIDIA (Hoberock et al. 2012) samt en med grupp med medlemmar från Microsoft och Intel (Laksberg et al. 2012), som därefter slog ihop sina förslag till ett gemensamt (Hoberock et al., 2013). Detta gemensamma förslag utvecklades sedan till det som nu är på väg in i standardbiblioteket (Hoberock 2016). Det som är planerat att läggas till i C++ 17 består i huvudsak av två kategorier: Execution Policies, som definierar på vilket sätt en algoritm kan parallelliseras, samt algoritmer som kan dra nytta av parallellisering. Av algoritmerna i biblioteket är merparten redan existerade algoritmer som fått ytterligare överlagrade konstruktorer och anpassats för att kunna paralleliseras, medans ett fåtal är helt nya algoritmer. Execution Policies Execution Policies skickas med som en parameter till en parallelliserad funktion eller metod, och avgör till vilken grad parallellisering kan ske vid exekvering. De tre varianterna som kommer introduceras i C++ 17 är enligt specifikationen (Hoberock 2016, 1006-1007): Parallel policy (std::execution::parallel_policy) som specificerar att exekveringen ska ske parallellt och oberoende av ordning, och tillåter därmed skapandet av separata trådar för olika delar av algoritmen. Varje separat tråd kommer däremot exekveras sekventiellt. Sequenced policy (std::execution::sequenced_policy) säger att algoritmen inte ska gå att parallellisera utan kräver sekventiell exekvering. Algoritmer som anropas med denna policy kommer dock fortfarande att exekveras i obestämd ordning i samma tråd som anropade den det ställer alltså fortfarande krav på att till exempel flera iterationer av en loop inte ändrar 2

samma data då detta kan skapa Race Conditions och resultatet blir oförutsägbart då det inte går att veta vilken iteration som ändrade den i vilken ordning. Parallel unsequenced policy (std::execution::parallel_unsequenced_policy) är den med störst potential för multipla processorer av de tre, eftersom de element som behandlas med den här policyn får inte bara godtyckligt separeras i olika trådar, utan det finns inte heller några på att innehållet i varje tråd behöver exekveras sekventiellt. Detta innebär bland annat att trådarna generellt sett inte kan allokera minne eller använda sig av mutex (lås på variabler) då det inte finns någon säkerhet att två delar inte ändrar samma del av minnet. Algoritmer En stor mängd algoritmer blir i C++ 17 anpassade för parallell exekvering. Totalt är det 69 existerande algoritmer som får en överlagrad konstruktor, och nio stycken nya algoritmer tillkommer. De som utökas är bland annat algoritmer för kopiering, sökning, sortering och omorganisering av data. Av de som tillkommer är for_each som applicerar en funktion på varje medlem av en mängd (Smith 2016, 1009) troligtvis den mest intressanta då användningsområdet är väldigt brett. (CPPreference, 2016) Gemensamt för samtliga är att det precis som för for_each handlar om algoritmer som itererar över en mängd objekt och utför något arbete på varje objekt. Detta är föga förvånande då denna typ av operationer lämpar sig särskilt väl för parallelisering, i synnerhet om varje iteration också är helt oberoende av övriga iterationer. Samtliga är också syntaxmässigt snarlika de sekventiella versionerna vilket underlättar användning. Nedan är två exempel på en loop som applicerar en funktion foo() på varje element i en vector v. Den första är sekventiell och den andra parallel: for_each(v.begin(), v.end(), foo()); for_each(std::execution::parallel, v.begin(), v.end(), foo()); Tidigare implementationer av parallellism Även om inget officiellt stöd för parallellism existerat i standardbiblioteket för C++ tidigare har det funnits ett flertal lösningar för att använda sig av det. Den version som är på väg in i standardbiblioteket för C++ 17 bygger på ett flertal olika experimentella implementationer som gjordes av bland annat Microsoft och NVIDIA. Utgångspunkterna från vilka de har implementerat parallelism skiljer sig en del, Microsofts lösning var till exempel Windows- 3

specifik, medans NVIDIA baserade sin implementation på Thrust, ett bibliotek gjort för deras CUDA-GPUer (Hoberock 2016). Utöver dessa finns det ett flertal andra implementationer så som MPI (Message Passing Interface) som riktar sig mot större kluster med separat minne per processor, PPL som nämndes tidigare som ingår i Microsofts Visual Studio IDE, och OpenMP som är ett bibliotek som stöder flertalet programmeringsspråk och plattformar. Gemensamt för alla är att de ger stora möjligheter till bättre utnyttjande av flerkärniga processorer. En enkel jämförelse av en iterativ algoritm i C++ 11 mellan OpenMP och PPL visar en förbättring med en faktor 4,5 respektive 6 (Wong, 2016), så skillnaden mellan de olika implementationerna är liten i relation till den vinst som görs av parallelliseringen. Slutsats Sammanfattningsvis är tilläggen för parallelism i C++ 17 inget banbrytande, då det redan finns en uppsjö av olika lösningar av samma problem sedan tidigare. Vad som talar för denna implementation är att den innebär ett minimalt behov av förändring i programkodens struktur för att kunna utnyttja parallelism vilket gör det enkelt att utnyttja. Dessutom är kanske den största vinsten just det faktum att det kommer existera stöd för detta i standardbilioteket och inte bara i tillägg, något som innebär en mycket större spridning. Den potentiella nackdelen är ju att även om stödet finns där så innebär en enkel och användarvänlig implementation också ett långt avstånd från användare till hårdvara vilket kan försvåra förståelsen för hur potentialen utnyttjas bäst. Hur de nya algoritmerna kommer prestera jämfört med existerande alternativ eller teoretiska bästa fall är också oklart då standarden inte är helt definierad än, och det saknas en färdigställd implementation att testa. Slutgiltigen ska det tas i åtanke att även om C++ 17 planeras färdigställas inom en snar framtid är alla specifikationer utkast, och ändringar kan komma att ske innan det färdigställs (Smith 2016, 1). 4

Referenser CPPreference. 2016. Extensions for Parallelism http://en.cppreference.com/w/cpp/experimental/parallelism (Hämtad 2016-05-12) Hoberock, J., Garland, M., Giroux, O., Grover, V., Marathe, J., Laksberg, A., Sutter, H. och Robinson, A. 2013. A Parallel Algorithms Library N3554 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3554.pdf (Hämtad 2016-05-12). Hoberock, J., Garland, M., Giroux, O., Grover, V., Kapasi, U. och Marathe, J. 2012. Parallelizing the Standard Algorithms Library N3408=12-0098. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3408.pdf (Hämtad 2016-05-12). Hoberock, Jared. 2016. The Parallelism TS Should be Standardized https://isocpp.org/files/papers/p0024r2.html (Hämtad 2016-05-12) Laksberg, A., Mithani, S., Sutter, H. och Robinson, A. 2012 A C++ Library Solution to Parallelism http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3429.pdf (Hämtad 2016-05-12). Satish, N., Kim, C., Chhugani, J., Saito, H., Krishnaiyer, R., Smelyanskiy, M., &... Dubey, P. 2015. Can Traditional Programming Bridge the Ninja Performance Gap for Parallel Computing Applications? Communications Of The ACM, 58(5), 77-86. doi:10.1145/2742910 Shao Voon Wong. 2016. Visual C++ 11 Beta Benchmark of Parallel Loops. https://www.codeproject.com/articles/373305/visual-cplusplus-beta-benchmark-of-parallel-loo#serial (Hämtad 2016-05-12) Smith, Richard. 2016. Working Draft, Standard for Programming Language C++ http://open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf (Hämtad 2016-05-12) 5