Dit is de eerste post in de CUDA Refresher-serie, die tot doel heeft de belangrijkste concepten in CUDA, tools, en optimalisatie voor beginnende of halfgevorderde ontwikkelaars.
Wetenschappelijke ontdekkingen en bedrijfsanalyses zorgen voor een onverzadigbare vraag naar meer computerbronnen. Veel toepassingen – weersvoorspellingen, simulaties van computationele vloeistofdynamica en meer recentelijk machine learning en deep learning – hebben een orde van grootte meer rekenkracht nodig dan momenteel beschikbaar is, met complexere algoritmen die meer rekenkracht nodig hebben om te kunnen draaien.
De computerindustrie heeft op verschillende manieren vertrouwd om de benodigde prestaties te leveren, zoals hogere transistordichtheid, parallellisme op instructieniveau, Dennard-schaling, enzovoort
- Verhoogde transistordichtheid voedde de vraag naar computers en zorgde ervoor dat de verdubbeling van de chiptransistordichtheid elke 18 maanden, zoals voorspeld door de wet van Moore.
- Technieken zoals parallellisme op instructieniveau hielpen ook om de prestaties te verbeteren, maar het rendement begon rond 2001 af te nemen.
- De schaalvergroting van Dennard leverde ook voordelen op in combinatie met de wet van Moore tot 2005, toen de schaalvergroting eindigde.
Rond 2005 begon de historische schaalvergroting van computers af te nemen en had de industrie alternatieven nodig om aan de computerbehoeften te voldoen. Het werd duidelijk dat toekomstige prestaties gepaard gaan met parallellisme.
Andere belangrijke factoren waren macht en communicatie. Studies toonden aan dat energie voornamelijk werd besteed aan communicatie, dus meer communicatie betekende meer vermogen en het beperken van de hoeveelheid rekenkracht die in een machine kan worden gestopt. Dit houdt in dat toekomstig computergebruik energiezuinig moet zijn en dat locatie de voorkeur heeft.
GPGPU-tijdperk
In de jaren 90 en 2000 werd grafische hardware ontworpen om tegemoet te komen aan specifieke behoeften, vooral voor werkdruk in de grafische industrie. Maar grafische workloads vereisten steeds meer rekenkracht. Als gevolg hiervan namen de prestaties toe met ongeveer ~ 2,4x/jaar in vergelijking met wat de verdubbeling van de transistor had kunnen opleveren (~ 1,8x/jaar). Afbeelding 1 toont het beroemde grafische prestatietraject van Prof. John Poulton van de Universiteit van North Carolina (UNC).
Figuur 1: Grafisch prestatietraject circa 2001 (Bron: Prof. John Poulton, UNC)
Met behulp van de metriek driehoeken per seconde verbeterde grafische hardware de prestaties met meer dan 2,4 keer per jaar, sneller dan de wet van Moore voorspelde. Dit was te wijten aan het enorme parallellisme dat beschikbaar was in de berekeningen van computergraphics, waarvan hardware gebruik kon maken. In 2001 luidden pc-graphics al het einde in van enorme systemen die zijn ontworpen voor graphics.
Voor de ontwikkelaarsgemeenschap was dit de motivatie om gebruik te maken van verbazingwekkende rekenkracht van grafische hardware en wetenschappelijke werklasten zoals medische beeldvorming te versnellen , elektromagnetisme en nog veel meer.
NVIDIA grafische verwerkingseenheden (GPU's) zijn oorspronkelijk ontworpen voor het uitvoeren van games en grafische workloads die zeer parallel van aard waren. Vanwege de grote vraag naar FLOPS en geheugenbandbreedte in de gaming- en grafische industrie, evolueerden GPU's naar een zeer parallelle, multithreaded, Manycore-processor met enorme rekenkracht en een hoge geheugenbandbreedte. Dit begon het tijdperk van GPGPU: computing voor algemeen gebruik op GPU's die oorspronkelijk waren ontworpen om alleen specifieke workloads zoals gaming en graphics te versnellen.
Hybride computermodel
GPU's zijn ontworpen voor zeer parallelle berekeningen en werden ook wel doorvoerprocessors genoemd. Veel wetenschappelijke en AI-workloads hebben inherent enorm parallellisme in hun algoritmen en kunnen erg langzaam werken op CPU's.
GPU-versnelde apps ontlasten deze tijdrovende routines en functies (ook wel hotspots genoemd) om op GPU's te draaien en profiteren van enorm parallellisme. De rest van de applicatie draait nog steeds op de CPU. U verplaatst rekenintensieve en tijdrovende delen van uw code naar GPU's om uw applicatie te versnellen zonder uw applicatie volledig naar GPU's te verplaatsen. Dit wordt ook wel een hybride computermodel genoemd.
Met de opkomst van hybride computergebruik bestonden beide processors naast elkaar, maar ze waren nog steeds fundamenteel verschillend. Afbeelding 2 toont het fundamentele verschil tussen CPU's en GPU's.
Figuur 2: GPU's besteden meer transistors aan gegevensverwerking.
GPU's gebruiken de meeste van hun transistors voor gegevensverwerking, terwijl CPU's ook die ruimte moeten reserveren voor grote caches, besturingseenheden, enzovoort. CPU-processors werken volgens het principe van het minimaliseren van de latentie binnen elke thread, terwijl GPU's de instructie- en geheugenlatenties verbergen met berekeningen. Afbeelding 3 toont het verschil in berekeningsthreads.
Figuur 3: Lage latentie of hoge doorvoer.
Zoals blijkt uit figuur 3, moeten CPU-architecturen de latentie binnen elke thread minimaliseren. Op CPU's minimaliseert elke thread de datatoegangstijd (witte balken). Tijdens een enkele tijdschijf krijgt de draad zoveel mogelijk werk gedaan (groene balk). Om dit te bereiken, hebben CPU's een lage latentie nodig, wat grote caches en complexe besturingslogica vereist. Caches werken het beste met slechts een paar threads per core, omdat het wisselen van context tussen threads duur is.
GPU-architectuur verbergt instructie en geheugenlatentie bij berekeningen. In GPU's zijn threads licht van gewicht, dus een GPU kan zo vaak als elke klokcyclus kosteloos overschakelen van vastgelopen threads naar andere threads.
Zoals weergegeven in figuur 3, toen thread T1 vastliep voor gegevens, een andere thread T2 begon met verwerken, enzovoort met T3 en T4. In de tussentijd krijgt T1 uiteindelijk de gegevens om te verwerken. Op deze manier wordt latentie verborgen door over te schakelen naar ander, beschikbaar werk. Dit betekent dat GPU's veel overlappende gelijktijdige threads nodig hebben om de latentie te verbergen. Als gevolg hiervan wilt u duizenden threads op GPU's uitvoeren.
Zie de CUDA Programming Guide voor meer informatie.
Pradeep Gupta
Director, Solutions Architecture and Engineering Team, NVIDIA