碼字的cuSolver學習(一)
記錄下新的庫函數
https://docs.nvidia.com/cuda/cusolver/index.htmlcuSolver庫是一個以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安裝教程