Dit is de tweede post in de CUDA Refresher-serie, die tot doel heeft de belangrijkste concepten in CUDA, tools, en optimalisatie voor beginnende of intermediaire ontwikkelaars.

Vooruitgang in de wetenschap en het bedrijfsleven zorgen voor een onverzadigbare vraag naar meer computerresources en versnelling van de werkbelasting. Parallel programmeren is een diepgaande manier voor ontwikkelaars om hun applicaties te versnellen. Het heeft echter enkele gemeenschappelijke uitdagingen.

De eerste uitdaging is om parallel programmeren te vereenvoudigen om het programmeren gemakkelijker te maken. Eenvoudig programmeren trekt meer ontwikkelaars aan en motiveert hen om veel meer applicaties op parallelle processors te porten. De tweede uitdaging is het ontwikkelen van applicatiesoftware die het parallellisme transparant schaalt om het toenemende aantal processorcores met GPU's te benutten.

In dit bericht bespreek ik hoe CUDA deze uitdagingen aangaat. Ik leg ook uit hoe je aan de slag kunt gaan met het installeren van CUDA.

Introductie van CUDA

NVIDIA heeft het CUDA-programmeermodel uitgevonden en heeft deze uitdagingen aangepakt. CUDA is een parallel computerplatform en programmeermodel voor algemeen computergebruik op grafische verwerkingseenheden (GPU's). Met CUDA kun je applicaties versnellen door gebruik te maken van de kracht van GPU's.

NVIDIA bracht de eerste versie van CUDA uit in november 2006 en kwam met een softwareomgeving waarmee je C als programmeertaal op hoog niveau kon gebruiken. Er zijn duizenden applicaties die door CUDA worden versneld, inclusief de bibliotheken en frameworks die ten grondslag liggen aan de voortdurende revolutie in machine learning en deep learning.

Eenvoudig te programmeren

Voor eenvoudige acceptatie biedt CUDA een eenvoudige interface gebaseerd op C/C++. Een groot voordeel van het CUDA-programmeermodel is dat u een scalair programma kunt schrijven. De CUDA-compiler gebruikt programmeerabstracties om gebruik te maken van parallellisme dat is ingebouwd in het CUDA-programmeermodel. Dit verlicht de programmeerlast. Hier zijn enkele basisprincipes van het CUDA-programmeermodel.

Het CUDA-programmeermodel biedt programmeurs drie belangrijke taaluitbreidingen:

  • CUDA-blokken—Een verzameling of groep threads.
  • Gedeeld geheugen—Geheugen gedeeld binnen een blok tussen alle threads.
  • Synchronisatiebarrières— Schakel meerdere threads in om te wachten totdat alle threads een bepaald uitvoeringspunt hebben bereikt voordat een thread gaat verder.

Het volgende codevoorbeeld toont de CUDA-kernel die twee vectoren, A en B, toevoegt. De uitvoer is een andere vector, C. De kernelcode wordt uitgevoerd op de GPU en is scalair van aard omdat het twee vectoren toevoegt op een zodanige manier dat het eruitziet als twee scalaire getallen toevoegen.

Als deze code op GPU draait, wordt deze massaal parallel uitgevoerd. Dit komt omdat elk element van de vector wordt uitgevoerd door een thread in een CUDA-blok en alle threads parallel en onafhankelijk lopen. Dit vereenvoudigt de overhead voor parallel programmeren.

/** CUDA-kernelapparaatcode – CUDA-voorbeeldcodes
* Berekent de vectoroptelling van A en B in C. De drie vectoren hebben hetzelfde aantal elementen als aantalElementen.
*/
__global__ void vectorAdd( float *A, float *B, float *C, int numElements) {
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements) {
C[i] = A[i] + B [i];
}
}

Eenvoudig te schalen

Het CUDA-programmeermodel maakt het mogelijk software transparant te schalen met een toenemend aantal processorkernen in GPU's. U kunt toepassingen programmeren met behulp van CUDA-taalabstracties. Elk probleem of elke toepassing kan worden onderverdeeld in kleine onafhankelijke problemen en onafhankelijk worden opgelost tussen deze CUDA-blokken. Elk CUDA-blok biedt de mogelijkheid om een ​​subprobleem op te lossen in fijnere stukjes met parallelle draden die met elkaar samenwerken en samenwerken. De CUDA-runtime besluit deze CUDA-blokken op multiprocessors in een GPU in willekeurige volgorde in te plannen. Hierdoor kan het CUDA-programma worden geschaald en op een willekeurig aantal multiprocessors worden uitgevoerd.

Figuur 1 toont dit concept. Het gecompileerde CUDA-programma heeft acht CUDA-blokken. De CUDA-runtime kan kiezen hoe deze blokken aan multiprocessors worden toegewezen, zoals weergegeven bij streaming multiprocessors (SM's).

Voor een kleinere GPU met vier SM's krijgt elke SM twee CUDA-blokken. Voor een grotere GPU met acht SM's krijgt elke SM één CUDA-blok. Dit maakt schaalbaarheid van prestaties mogelijk voor applicaties met krachtigere GPU's zonder codewijzigingen.


Figuur 1. CUDA blokkeert schaalbaarheid over verschillende soorten GPU's.

CUDA installeren

Hier leest u hoe u een systeem klaar maakt voor CUDA-installatie. Nadat CUDA is geïnstalleerd, kunt u beginnen met het schrijven van parallelle toepassingen en profiteren van het enorme parallellisme dat beschikbaar is in GPU's.

Dit zijn de vereisten voor het uitvoeren van CUDA op uw systeem:

  • CUDA-compatibele GPU

U hebt een CUDA-compatibele GPU nodig om CUDA-programma's uit te voeren. CUDA-compatibele GPU's zijn beschikbaar op elke manier waarop u rekenkracht kunt gebruiken: notebooks, werkstations, datacenters of clouds. De meeste laptops worden geleverd met de optie van NVIDIA GPU's. NVIDIA enterprise-class GPU's Tesla en Quadro – veel gebruikt in datacenters en werkstations – zijn ook CUDA-compatibel. Elke grote cloudprovider heeft op GPU gebaseerde instanties waar u CUDA-programma's kunt uitvoeren.

  • Een ondersteunde versie van een besturingssysteem met een GCC-compiler en toolketen

Zie de CUDA-installatiehandleidingen voor de ondersteunde lijst met besturingssystemen, GCC-compilers en tools.

  • NVIDIA CUDA Toolkit

NVIDIA biedt de CUDA Toolkit gratis aan. kosten. De toolkit bevat GPU-versnelde bibliotheken, een compiler, ontwikkelingstools en de CUDA-runtime.

Zie de CUDA-programmeergids voor meer informatie.

Pradeep Gupta
Director , Solutions Architecture and Engineering Team, NVIDIA

0

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *