rocSOLVER -- ROCm-ov linear algebra SOLVER - GASERI


U nastavku koristimo kod iz repozitorija rocSOLVER (službena dokumentacija)



Onion Details



Page Clicks: 1

First Seen: 03/15/2024

Last Indexed: 10/23/2024

Domain Index Total: 397



Onion Content



Preskoči na sadržaj rocSOLVER: ROCm-ov linear algebra SOLVER U nastavku koristimo kod iz repozitorija rocSOLVER ( službena dokumentacija ). rocSOLVER je implementacija podskupa funkcija iz LAPACK (Linear Algebra PACKage) biblioteke, te je i dalje u stanju usavršavanja. Potrebno je instalirati i rocBLAS da bi funkcije bile uspješno odrađene. Kao primjer, koristiti ćemo kod koji pokazuje kako izračunati QR faktorizaciju od matrice m*n u double-precision. Primjer korištenja Razmotrimo službeni primjer samples/example_basic.cpp ( poveznica na kod ). Kod je oblika: void get_example_matrix ( std :: vector & hA , rocblas_int & M , rocblas_int & N , rocblas_int & lda ) { const double A [ 3 ][ 3 ] = { 12 , -51 , 4 }, { 6 , 167 , -68 }, { -4 , 24 , -41 } }; M = 3 ; N = 3 ; lda = 3 ; hA . resize ( size_t ( lda ) * N ); for ( size_t i = 0 ; i hA ; get_example_matrix ( hA , M , N , lda ); printf ( "A = [ \n " ); for ( size_t i = 0 ; i hIpiv ( size_piv ); hipMemcpy ( hA . data (), dA , sizeof ( double ) * size_A , hipMemcpyDeviceToHost ); hipMemcpy ( hIpiv . data (), dIpiv , sizeof ( double ) * size_piv , hipMemcpyDeviceToHost ); printf ( "R = [ \n " ); for ( size_t i = 0 ; i hA ; get_example_matrix ( hA , M , N , lda ); printf ( "A = [ \n " ); for ( size_t i = 0 ; i hIpiv ( size_piv ); hipMemcpy ( hA . data (), dA , sizeof ( double ) * size_A , hipMemcpyDeviceToHost ); hipMemcpy ( hIpiv . data (), dIpiv , sizeof ( double ) * size_piv , hipMemcpyDeviceToHost ); printf ( "R = [ \n " ); for ( size_t i = 0 ; i hA ; get_example_matrix ( hA , M , N , lda ); Slijedi ispis matrice koristeći printf i dvije for petlje, koje vrte petlju do broja redaka i broja stupaca. printf ( "A = [ \n " ); for ( size_t i = 0 ; i hIpiv(size_piv); hipMemcpy(hA.data(), dA, sizeof(double)*size_A, hipMemcpyDeviceToHost); hipMemcpy(hIpiv.data(), dIpiv, sizeof(double)*size_piv, hipMemcpyDeviceToHost); Nakon svih ovih koraka rezultati su pohranjeni u hA i hIpiv . Ispis ovih rezultata izvršiti ćemo na ovaj način: printf("R = [\n"); for (size_t i = 0; i & hA, rocblas_int& M, rocblas_int& N, rocblas_int& lda) { const double A[3][3] = { { 12, -51, 4}, { 6, 167, -68}, { -4, 24, -41} }; M = 3; N = 3; lda = 3; hA.resize(size_t(lda) * N); for (size_t i = 0; i < M; ++i) { for (size_t j = 0; j < N; ++j) { hA[i + j*lda] = A[i][j]; } Kao početak, postavljamo konstantne vrijednosti matrice, te broj redaka, stupaca i vodeću dimenziju. const double A[3][3] = { { 12, -51, 4}, { 6, 167, -68}, { -4, 24, -41} }; M = 3; N = 3; lda = 3; Po pravilu, rocSOLVER matrice moraju biti pohranjene u formatu stupac po stupac (engl. column-major ), o kojemu možete više pročitati u odjeljku Eigenove dokumentacije Column-major and row-major storage . Taj format ćemo, u ovom slučaju, postići tako da nećemo koristiti klasičnu metodu za dohvaćanje vrijednosti matrice na mjestu (i, j) , već ćemo vodeću dimenziju pomnožiti sa brojem stupaca, i zbrojiti taj iznos sa brojem redaka. Time kopiramo 2D polje (matricu A ) u hA , 1D polje, postavljeno u formatu stupac po stupac. hA.resize(size_t(lda) * N); for (size_t i = 0; i < M; ++i) { for (size_t j = 0; j < N; ++j) { hA[i + j*lda] = A[i][j]; } Kraj programa. Author: Mia Doričić, Vedran Miletić