2010-04-30 39 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发布给大众,完整文档将在线。