Beregn enhetlig enhetsarkitektur
Beregn enhetlig enhetsarkitektur
CUDA (i utgangspunktet forkortelsen for Compute Unified Device Architecture ) er en teknologi for GPGPU ( General Purpose Computing on Graphics Processing Units ), det vil si å bruke en grafikkprosessor (GPU) for å utføre generelle beregninger i stedet for prosessorkjernen (CPU). Faktisk består disse prosessorene ofte i størrelsesorden tusen datakretser som vanligvis fungerer ved 1 GHz , noe som representerer et mye større potensial enn en sentral prosessor ved 4 GHz , selv om den er flerkjernet og flertrådet , hvis og bare hvis beregningen som skal utføres kan parallelliseres .
CUDA tillater programmering GPU C . Den er utviklet av Nvidia , opprinnelig for GeForce 8-serie grafikkort , og bruker en enhetlig driver ved hjelp av en streamingteknikk .
Det første utviklingssettet for CUDA utgitt den15. februar 2007.
applikasjoner
Alt som krever intensiv beregning som kan maskes i to eller tre dimensjoner, så vel som det som kan brytes ned i uavhengige beregninger på hovedfaktorer, som kodebryting, strukturelle beregninger, væskesimulering, simulerte glødningsalgoritmer, kan gjøres i CUDA . , økonometriske beregninger på veldig store matriser (teknikker for å dele disse matrisene i blokker gjør at produktet i stor grad kan parallelliseres) kan dra nytte av CUDA. Den passordknekking er intet unntak.
Arkitekturer anerkjent av CUDA
Tesla Architecture
Tesla- arkitekturen , som ifølge NVidia tilbyr datakraften til en superdatamaskin (4 teraflops i én presisjon, 80 gigaflops i dobbel presisjon) for en sum på 10.000 dollar, er bygget på CUDA.
Pascal arkitektur
Pascal- arkitekturen , introdusert i 2016 med GTX1080- og GTX1070-kortene med 2560 kjerner (16 nm gravering) og som bruker overklokkbar GDDR5X ved 2,1 GHz, kan også brukes med CUDA. NVidia kunngjør 11 teraflops i en enkelt presisjon.
Fermi-arkitektur (foreldet)
Fermi- arkitekturen , introdusert i 2010 med GF100, er nå avviklet, med CUDA-versjoner senere enn 8.0.x som ikke støtter den.
Programmering
CUDA har flere særegenheter sammenlignet med C-programmering, ved å tilby å utføre generiske beregninger på GPUer:
- Eksplisitt hierarkisering av minneområder (private, lokale, globale) som gjør det mulig å fint organisere overføringene mellom dem.
- Gruppering av tråder i rutenett av rutenett: lokalt 1D, 2D eller 3D rutenett av tråder som raskt kan dele lokalt minne. De lokale nettene bestilles i et globalt rutenett som gir tilgang til det globale minnet.
Noen realiseringer kombinerer bruken av Go- språket , veldig orientert om programmering av samtidige prosesser og styring av minne uten lekkasjer, med CUDA.
fordeler
- Relativt standardisert tilgang til datakraft.
- Et program laget med CUDA kan fortsatt brukes på mer enn en generasjon maskinvare.
Grenser
- Overføringshastigheter mellom vert og klient kan være en flaskehals; det kan unngås ved asynkrone kopier.
- Gruppering av tråder i grupper på trettito av ytelsesgrunner ( warps ). Avvik i en warp , på grunn av betingede henrettelser, kan i stor grad påvirke ytelsen. Dette er en begrensning på grunn av SIMD-modellen. Derfor har ikke alle algoritmer nytte av å bli portet til CUDA, og mer generelt til en SIMD-modell.
- Gyldig C-kode kan avvises på grunn av maskinvarebegrensninger, for eksempel lite minne eller antall tråder .
- Tidlige versjoner (1.x) av CUDA støttet ikke rekursjon , funksjonspekere og andre begrensninger som har en tendens til å forsvinne.
- Presisjonen til beregningene: dobbel presisjon er bare tilgjengelig siden versjon 1.3. I tillegg IEEE 754 standarden er bare delvis oppnådd: i dobbel presisjon, den eneste avrunding modus er runde til nærmeste-even . I enkel presisjon blir ikke tallene denormalisert, NaN- signalet er fraværende, og de eneste to avrundingsmodusene er hogge og runde til nærmeste .
Eksempler
Eksempel med kortemulering
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <cuda_runtime.h>
__global__
void mykernel(float *A1, float *A2, float *R)
{
int p = threadIdx.x;
R[p] = A1[p] + A2[p];
}
int main()
{
float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
float R[9];
// 9 additions, aucune boucle !
mykernel<<<1 ,9>>>(A1, A2, R);
// sortie à l'ecran
for (int i = 0; i < 9; i++) {
printf("%f\n", R[i]);
}
}
Dette eksemplet fungerer bare hvis vi etterligner grafikkortet fordi vi ikke kopierer dataene på kortet.
Sammensatt av:
nvcc -deviceemu -o run prog.cu
Eksempel med et NVidia-grafikkort
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <cuda_runtime.h>
__global__
void mykernel(float *A1, float *A2, float *R)
{
int p = threadIdx.x;
R[p] = A1[p] + A2[p];
}
int main()
{
float A1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
float A2[] = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
float R[9];
int taille_mem = sizeof(float) * 9;
// on alloue de la memoire sur la carte graphique
float *a1_device;
float *a2_device;
float *r_device;
cudaMalloc((void**) &a1_device, taille_mem);
cudaMalloc((void**) &a2_device, taille_mem);
cudaMalloc((void**) &r_device, taille_mem);
// on copie les donnees sur la carte
cudaMemcpy(a1_device, A1, taille_mem, cudaMemcpyHostToDevice);
cudaMemcpy(a2_device, A2, taille_mem, cudaMemcpyHostToDevice);
//9 additions, aucune boucle !
mykernel<<<1, 9>>>(a1_device, a2_device, r_device);
// on recupere le resultat
cudaMemcpy(R, r_device, taille_mem, cudaMemcpyDeviceToHost);
// sortie à l'ecran
for(int i = 0; i < 9; i++) {
printf("%f\n", R[i]);
}
}
Sammensatt av:
nvcc -o add_cuda add_cuda.cu
Merknader og referanser
-
" https://docs.nvidia.com/cuda/ "
-
" https://developer.nvidia.com/cuda-toolkit-archive "
-
(in) Anand Lal Shimpi og Wilson, Derek, " Nvidias GeForce 8800 (G80) GPUer som er arkitektert for DirectX 10 " , AnandTech,8. november 2006(åpnet 16. mai 2015 ) .
-
(in) " http://news.developer.nvidia.com/2007/02/cuda_for_gpu_co.html " ( Arkiv • Wikiwix • Archive.is • Google • Hva skal jeg gjøre? ) , On Nvidia .
-
" Cryptohaze " , på SourceForge (åpnes 13 august 2020 ) .
-
https://hpcugent.github.io/easybuild/files/FOSDEM14/FOSDEM14_HPC_devroom_14_GoCUDA.pdf
Se også
Relaterte artikler
Konkurrentprodukter
Eksterne linker
Installasjon av CUDA i henhold til operativsystemer
CUDA-arkitektur