Knihovny pro CUDA J. Sloup a I. Šimeček xsimecek@fit.cvut.cz Katedra počítačových systémů FIT České vysoké učení technické v Praze Ivan Šimeček, 2011 MI-PRC, LS2010/11, Predn.10 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti
CUDA SDK Compiler (frontend k existujícímu C/C++ kompilátoru) Debugger Profiler Libraries: Cublas Cufft Cudpp (Data Parallel Primitives Library) Curand Cusparse Velký balík ukázkových příkladů Hlavní podporované jazyky: C/C++ Fortran
CUBLAS Implementace standardní knihovny BLAS pro GPU Stejné rozhraní jako původní BLAS, minimální změny kódu při převodu z CPU na GPU
CUBLAS příklad I #include <stdio.h> #include <stdlib.h> #include <math.h> #include <cublas.h> #define M 6 #define N 5 // rozměry matice #define IDX2C(i,j,ld) (((j)*(ld))+(i)) //mapovací funkce void modify (float *m, int ldm, int n, int p, int q, float alpha,float beta) { cublassscal (n-p, alpha, &m[idx2c(p,q,ldm)], ldm); cublassscal (ldm-p, beta, &m[idx2c(p,q,ldm)], 1); }
CUBLAS příklad II int main(int argc, char *argv[]) { int i, j; cublasstatus stat; float* devptra; float* a = 0; a = (float *)malloc (M * N * sizeof (*a)); for (j = 0; j < N; j++) { for (i = 0; i < M; i++) { a[idx2c(i,j,m)] = i * M + j + 1; } } // naplnění matice
CUBLAS příklad III // inicializace knihovny cublasinit(); // alokace místa pro matici stat = cublasalloc (M*N, sizeof(*a), (void**)&devptra); if (stat!= CUBLAS_STATUS_SUCCESS) { printf ("device memory allocation failed"); return 1; } //nahrání matice z CPU na GPU cublassetmatrix (M, N, sizeof(*a), a, M, devptra, M); //vlastní lineární operace na GPU modify (devptra, M, N, 1, 2, 16.0f, 12.0f);
CUBLAS příklad IV //nahrání matice z GPU na CPU cublasgetmatrix (M, N, sizeof(*a), devptra, M, a, M); //uvolnění matice cublasfree (devptra); cublasshutdown(); for (j = 0; j < N; j++) { for (i = 0; i < M; i++) { printf ("%7.0f", a[idx2c(i,j,m)]); } printf ("\n"); } return 0; }
CUFFT Knihovna pro provedení FFT (efektivní algoritmus pro spočtení diskrétní Fourierovy transformace=dft a její inverze) na GPU K dispozici různé verze výpočtu
CUFFT příklad I cuffthandle plan; cufftcomplex *devptr; cufftcomplex data[nx*batch]; int i; // vytvoření zdrojových dat for(i= 0 ; i < NX*BATCH ; i++){ data[i].x = 1.0f; data[i].y = 1.0f; } // alokace paměti na GPU cudamalloc((void**)&devptr,sizeof(cufftcomplex)*nx*ba TCH);
CUFFT příklad II // zkopírování do GPU cudamemcpy(devptr, data, sizeof(cufftcomplex)*nx*batch, cudamemcpyhosttodevice); // spočítá 1D FFT plan cufftplan1d(&plan, NX, CUFFT_C2C, BATCH); // vlastní dopřednou FFT cufftexecc2c(plan, devptr, devptr, CUFFT_FORWARD); // zpětná FFT cufftexecc2c(plan, devptr, devptr, CUFFT_INVERSE); // zkopírování z GPU cudamemcpy(data, devptr, sizeof(cufftcomplex)*nx*batch, cudamemcpydevicetohost); // dealokace všeho cufftdestroy(plan); cudafree(devptr);
CUDPP CUDPP = CUDA Data Parallel Primitives Library. Knihovna primitivních funkcí, vhodných jako základ složitějších paralelních algoritmů Obsahuje: paralelní prefix-sum operaci, paralelní řazení paralelní redukci. Atd.
CURAND Knihovna pro generování náhodných čísel K dispozici ruzné typy generátorů
CUSPARSE Podmnožina BLAS pro řídké matice Současná verze 4.0 obsahuje: Operace typu řídký vektor x hustý vektor Operace typu řídká matice x hustý vektor Operace typu řídká matice x sada hustých vektorů Podpora formátů hustý, COO, CSR, CSC Navíc i řešič pro troúhelníkové řídké matice
THRUST Knihovna paralelních algoritmů pro GPU Objektově orientovaný přístup Rozhraní obdobné the C++ Standard Template Library (STL).
THRUST příklad I #include <thrust/device_vector.h> #include <thrust/host_vector.h> #include <thrust/transform_reduce.h> #include <thrust/functional.h> #include <thrust/extrema.h> // Během jedné redukce spočtu minimum i maximum // minmax_pair obsahuje minimum a maximum template <typename T>struct minmax_pair{ T min_val; T max_val;}; // fce, která minmax_pair je inicializován na hodnotu x.
THRUST příklad II template <typename T>struct minmax_unary_op : public thrust::unary_function<t,t>{ host device minmax_pair<t> operator()(const T& x) const { minmax_pair<t> result; result.min_val = x; result.max_val = x; return result; }}; // minmax_binary_op je fce,která vybere min a max // ze dvou párů hodnot
THRUST příklad III template <typename T>struct minmax_binary_op : public thrust::binary_function<t,t,t>{ host device minmax_pair<t> operator()(const minmax_pair<t>& x, const minmax_pair<t>& y) const { minmax_pair<t> result; result.min_val = thrust::min(x.min_val, y.min_val); result.max_val = thrust::max(x.max_val, y.max_val); return result; }};
THRUST příklad IV int main(void){ // initializace pole int x[7] = {-1, 2, 7, -3, -4, 5}; // zkopírování do GPU thrust::device_vector<int> d_x(x, x + 7); minmax_unary_op<int> unary_op; minmax_binary_op<int> binary_op; // initializace prvním prvkem minmax_pair<int> init = unary_op(d_x[0]); // spočítání minima a maxima minmax_pair<int> result = thrust::transform_reduce(d_x.begin(), d_x.end(), unary_op, init, binary_op); // tisk std::cout << result.min_val << std::endl; std::cout << result.max_val << std::endl; }
Knihovny pro LA MAGMA (Matrix Algebra on GPU and Multicore Architectures). http://icl.cs.utk.edu/magma/index.html Obdoba ScalaPacku ale pro hybridní výpočty (kombinace CPU a GPU)
Knihovny pro LA The SpeedIT Tools library. Řešiče soustav lineárních rovnic pro různé typy matic http://speedit.vratis.com/
Knihovny pro LA Jacket (pro Matlab),LibJacket (pro C/C++). http://www.accelereyes.com/products/libjack et Knihovna rutin pro numerickou lineární algebru