標籤:

碼字的cuSolver學習(一)

碼字的cuSolver學習(一)

記錄下新的庫函數

https://docs.nvidia.com/cuda/cusolver/index.html?

docs.nvidia.com

cuSolver庫是一個以cuBLAS&cuSPARSE庫為基礎的高級包,將三個庫囊括在一起,可以獨立使用或配合使用。cuSolver,可以實現類似lapack的功能,如j普通矩陣的分解,稠密矩陣的三角解法,稀疏矩陣的最小二乘解法,本徵值解法。

1.cuSolverDN

2.cuSolverSP

3.cuSolverRF

介紹和使用規則可以參考官方網站。

這裡羅列下其特別之處,

<matrix data format> csr(壓縮稀疏行格式)

<operation>,lq,lsq,eig,eigs(線性,最小二乘,特徵值,一個盒子中特徵值)

<output matrix data format>,v(向量)& m(矩陣)

接下來,主要關注下cuSolverDN.

1。TYPES 數據類型,float&double(標準c),cuComplex&cuDoubleComplex(get from cuComplex.h),且使用一些cuBlas里常見的類型

1.1 cusolverDnhandle_t,指向該環境的指針類型

1.2 cublasFillMode_t, 表明密集(dense習慣性地翻譯成這個)矩陣的上/下部分被填充

1.3 cublasOperation_t, 表明密集矩陣所執行的操作,轉置/共軛轉置/無操作

1.4 cusolverEigType_t, 表明所選本徵值solver的類型,Fortran integer (A*x = lambda*B*x), (A*B*x = lambda*x), (B*A*x = lambda*x)

1.5 cusolverEigenMode_t,表明是否計算特徵值及特徵向量。N (only eigenvalues are computed), V (both eigenvalues and eigenvectors are computed)

1.6 cusolverStatus_t, 與其在sparse LAPACK部分相同。返回類型。

2。cuSolverDN:密集lapack函數

一些helper function: cusolverDnCreate(),cusolverDnDestroy(),cusolverDnSetStream(),etc.

一些密集線性解法:

cusolverDn<t>potrf()計算了Hermitian正定矩陣的Cholesky分解, n*n Hermitian matrix

cusolverDn<t>potrs()求解了一個線性方程組,n*n Hermitian matrix

cusolverDn<t>getrf()求解了LU分解

cusolverDn<t>getrs()求解了一個多右手邊線性系統 multiple right-handed sides(???)

cusolverDn<t>geqrf()求解了QR分解 m*n矩陣=m*n *(n*n上三角矩陣)

其他略

例子:cuda c的線性方程的QR分解

思路:第一geqrf,第二ormqr, 第三trsm。

運行命令:nvcc -arch=sm_20 -lcublas -lcudart -lcusolver -o cusolver cusolver1.cu

分析下代碼中重要函數:

1. geqrf()與ormqr()都屬於cusolver旗下函數,且配合使用,

1.1使用前使用*_buffersize()分配內存,返回lwork參數當作函數中參數

1.2句柄非指針類型引用

1.3d_A即設備中A矩陣,在QR分解中,變換了矩陣數據,其上三角是R,下三角可以指向Q

1.4在兩個函數使用後,使用cudaDecviceSynchronize()顯式地同步流,該方法將停止CPU端線程的執行,直到GPU端完成之前CUDA的任務,包括kernel函數、數據拷貝等。

3.trsm()是cublas旗下函數


推薦閱讀:

CentOS 7 安裝 Cuda 的經歷
國內首屆OpenACC GPU Hackathon開始報名啦
小白的tensorflow+CUDA編程踩坑記錄
Numba, Julia的GPU編程(也許會再寫點XLA)
Ubuntu16.04下Nvidia+Cuda8.0+Dynet安裝教程

TAG:數學 | CUDA |