2010-04-30 45 views
6

我想知道NVIDIA的cuBLAS庫。有人有經驗嗎?例如,如果我使用BLAS編寫一個C程序,我將能夠用呼叫到cuBLAS來替換BLAS的呼叫嗎?或者甚至更好地實現讓用戶在運行時選擇的機制?BLAS和CUBLAS

如果我使用Boost和C++提供的BLAS庫,那麼怎麼辦?

回答

1

CUBLAS不包裹BLAS。 CUBLAS也以列主要順序訪問矩陣,例如一些Fortran代碼和BLAS。

我更習慣於用C編寫代碼,甚至是CUDA。 使用CBLAS編寫的代碼(這是BLAS的C包裝)可以很容易地變成CUDA代碼。 請注意,使用BLAS的Fortran代碼與使用CBLAS的C/C++代碼截然不同。 Fortran和BLAS通常按列主排序存儲矩陣或雙數組, ,但C/C++通常處理行主排序。 我通常處理這個問題寫入保存矩陣中一個一維數組, 和使用的#define寫一個宏TOA訪問的元素i,矩陣的J所示:

/* define macro to access Aij in the row-wise array A[M*N] */ 
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M */ 
/* define macro to access Aij in the col-wise array A[M*N] */ 
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

CBLAS庫具有良好組織的參數和約定(常量枚舉變量) 給每個函數矩陣的排序。 請注意,矩陣的存儲方式也會有所不同,行方向的帶狀矩陣與列方式的帶矩陣的存儲方式不同。

我不認爲有機制允許用戶選擇BLAS或CUBLAS, 而不寫兩次代碼。 CUBLAS在大多數函數調用中也有一個「句柄」變量,它沒有出現在BLAS上。 我雖然#define在每個函數調用改變名稱,但這可能無法正常工作。

0

我一直在將BLAS代碼移植到CUBLAS。我使用的BLAS庫是ATLAS,所以我說的可能是正確的,直到選擇BLAS庫。

ATLAS BLAS要求您指定是否使用列主要排序或行主要排序,並且我選擇了列主要排序,因爲我使用的是使用列主要排序的CLAPACK。另一方面,LAPACKE會使用行主排序。 CUBLAS是列主要訂購。您可能需要相應調整。

即使訂購不是一個問題,移植到CUBLAS絕不意味着替代品的下降。最大的問題是您必須將數據移入或移出GPU的內存空間。該內存使用cudaMalloc()進行設置,並與cudaFree()一起發佈,這可能是人們所期待的。使用cudaMemcpy()將數據移動到GPU內存中。如果從CPU轉向GPU是值得的,那麼做這件事的時間將是一個很大的決定因素。

然而,一旦完成,呼叫是非常相似。 CblasNoTrans變成CUBLAS_OP_N,CblasTrans變成CUBLAS_OP_T。如果您的BLAS庫(如ATLAS)允許您按值傳遞標量,則必須將其轉換爲引用傳遞(正如FORTRAN所示)。

鑑於此,任何允許選擇CPU/GPU的開關最容易處於比使用BLAS的功能更高的級別。在我的情況下,我有算法的CPU和GPU變體,並根據問題的大小選擇較高的級別。

5

janneb的回答不正確,cuBLAS是而不是是CPU BLAS的直接替代品。它假定數據已經在設備上,並且功能簽名有一個額外的參數來跟蹤一個cuBLAS上下文。

但是,進入CUDA 6.0是一個名爲NVBLAS的新庫,它提供了這種「插入式」功能。它攔截Level3 BLAS調用(GEMM,TRSV等)並自動將它們發送到GPU,從而有效地將PCIE傳輸與GPU上的計算進行平鋪。

這裏有一些信息:https://developer.nvidia.com/cublasxt,今天CUDA註冊的開發人員可以使用CUDA 6.0。

一旦CUDA 6.0發佈給大衆,完整文檔將在線。