LUNDS UNIVERSITET Parallell exekvering av Float32 och INT32 operationer Samuel Molin Kursansvarig: Erik Larsson Datum 2018-12-05 Referat Grafikkort utför många liknande instruktioner parallellt då typiska program exekveras på dem. Uppgifterna som utförs har en förutsägbar distribution heltal samt flyttalsoperationer vilket utgör en flaskhals då flyttalsoperationer blockeras då exekvering av heltalsoperationer sker. Texten hanterar en metod utvecklad av Nvidia till sin nya Turing mikroarkitektur för att låta heltal samt flyttalsoperationer exekvera parallellt.
Innehållsförteckning Introduktion 2 Teori 3 ALU och FPU 3 CUDA 3 Relevansen av parallell exekvering i GPUn 4 Diskussion 5 Avslutning 6 Referenser 7 Introduktion Komponenterna som används för att bygga upp en processor utvecklas hela tiden och när prestanda och precision ökar ger detta industrin nya möjligheter att utveckla och förbättra sina produkter. Den elektroniska strukturen av en processor kallas för en mikroarkitektur(ma); en MA byggs för att kunna exekvera ett instruktionsset som behövs för att uträtta de uppgifter processorn är byggd för på ett så effektivt sätt som möjligt. För att öka effektiviteten försöker man hitta flaskhalsar i dagens design som kan lösas med hjälp av ny elektronik eller metodik. Texten hanterar en effektivisering Nvidia gjort i sin grafikkorts-ma Turing som introducerades augusti 2018. Den nya tekniken är parallell exekvering av INT32 och FP32 operationer. Vad detta innebär är att operationer som utnyttjar den aritmetiska enheten för heltalsoperationer kan arbeta simultant med enheten som hanterar flyttalsoperationer. Det leder till att instruktioner i pipelinen inte behöver vänta lika länge eftersom båda enheterna kan utnyttjas samtidigt.[1]
Teori Till skillnad från processorer som byggs för att utföra ett brett instruktionsset utvecklas grafikkort för att utföra en specifik typ av uppgift bestående av ett mindre instruktionsset. Grafikkortets uppgift kan brytas ner i tre steg; Applikation, Geometri och Rastrering.[2] Första steget Applikation utförs i huvudsak av processorn och kan utföras parallellt med de övriga stegen som utnyttjar GPUn. Geometri steget kan brytas ned i flera uppgifter men i stora drag ansvarar det för att bestämma vertex eller punkters position samt kopplingen mellan dessa samt deras färg. Rastrering innebär att informationen från tidigare steg kvantiseras och bryts ned till individuella pixlar som ska målas upp på skärmen. Eftersom uppgifterna en GPU används till inte skiljer sig så mycket från varandra öppnar detta upp möjligheter till attackera flaskhalsar utan att detta har en negativ effekt på övriga uppgifter en vanlig flexibel processor hade behövt utföra.[2] ALU och FPU Program som körs på datorer använder heltal och flyttal för att utföra sina uppgifter och beräkningarna av dessa sker med hjälp av aritmetiska enheter(alu). För att utföra operationer med heltal och flyttal används olika enheter; flyttal använder en floating-point-unit eller (FPU) som till skillnad från ALUn kan utföra operationer som resulterar i flyttal eller vars input är flyttal såsom kvadratrötter eller trigonometriska beräkningar.[3] CUDA Turing använder sig av Nvidias Compute Unified Device Architecture(CUDA); CUDA är ett API som är skapat för att utveckla system som exekverar många operationer parallellt. CUDA implementeras i form av hundratals och ibland tusentals Streaming Multiprocessors(SM) som alla kan exekvera operationer parallellt. Varje SM kan jämföras med en mycket långsam processorkärna och de som används i Turing kallas för CUDA-kärnor.[4]
I en CUDA-kärna utförs alla operationer med hjälp av en exekveringsenhet även kallad den funktionella enheten(fu). Turing MAn lägger till en extra FU som kan exekvera heltalsoperationer samtidigt som CUDA-kärnan utför en flyttalsoperation.[1] Instruktionerna använder olika bussar för att exekvera instruktionerna parallellt eftersom det inte går att utföra dem samtidigt i samma pipeline.[1] Relevansen av parallell exekvering i GPUn Anledningen till att det är viktigt att kunna köra parallella INT32 och FLOAT32 operationer är att programmen som i huvudsak är krävande för en GPU består av en mix mellan heltalsoperationer och flyttalsoperationer. Grafikkort används i störst utsträckning för att spela
spel och Nvidia har genom att mäta den genomsnittliga distributionen operationer bland populära spel kommit fram till att det per 100 flyttalsinstruktioner är i genomsnitt 36 heltalsoperationer.[1] Genom att öppna upp möjligheten för dessa att exekvera parallellt betyder detta att flyttalsoperationer inte blockeras vilket gör att man kan köra 36% fler flyttalsoperationer per tidsenhet än vad man hade kunnat utan parallellism.[1] Diskussion Metoden är effektiv när den appliceras på GPUn. Hade samma metod kunnat användas för att strömlinjeforma den huvudsakliga processorns uppgift? Eftersom man har en god bild av uppgifterna en GPU uträttar kan man utveckla metoder som är skräddarsydda för dess funktion; om man försöker applicera samma lösning på en processor skulle det vara svårt att få det att leda till en ökning av prestanda. Processorer har mycket färre kärnor än vad en GPU har vilket gör att man inte kan utföra lika många parallella operationer. Detta i kombination med att en CPU har ett jämförelsevis komplext instruktionsset samt att distributionen heltal och flyttalsoperationer inte är lika uniform mellan uppgifter leder till att man inte kan förutsäga vilken distribution mikroarkitekturen ska byggas för.[1][5] En implementation som hade kunnat ha effekt skulle vara att använda CUDA-kärnor för att exekvera kod som upprepar sig såsom en while loop. Om loopen har både flyttal och heltalsoperationer hade parallell exekvering av dessa snabbat på processen.
Avslutning CUDA-kärnor lanserades 2007 och sedan dess har Nvidia implementerat dem i sina mikroarkitekturer. För varje iteration av GPU-serie hittas nya tekniker som utnyttjar dem på nya sätt; det är idag omöjligt att säga om metoden som Turing använder kommer bytas ut eller undergå förändring i senare arkitekturer men dagens implementation har en mätbar positiv inverkan på effektiviteten hos uppgiften GPUn utför.
Referenser [1] https://www.nvidia.com/content/dam/en-zz/solutions/design-visualization/technolo gies/turing-architecture/nvidia-turing-architecture-whitepaper.pdf [2] https://docs.microsoft.com/sv-se/windows/desktop/direct3d11/overviews-direct3d- 11-graphics-pipeline [3] Computer Organization And Design 5th Edition 2014; David A. Patterson, John L. Hennessy; Appendix B [4] https://devblogs.nvidia.com/cuda-turing-new-gpu-compute-possibilities/ [5] https://www.kjell.com/se/fraga-kjell/hur-funkar-det/dator/datorns-huvudkomponenter/pro cessorn