BLAS和CUBLAS

Nil*_*ils 6 boost cuda blas cublas

我想知道NVIDIA的cuBLAS库.有人有经验吗?例如,如果我使用BLAS编写C程序,我是否可以通过调用cuBLAS替换对BLAS的调用?或者甚至更好地实现一个让用户在运行时选择的机制?

如果我使用Boost with C++提供的BLAS库怎么样?

小智 5

janneb的答案是不正确的,cuBLAS 不是 CPU BLAS的直接替代品.它假设数据已经在设备上,并且功能签名有一个额外的参数来跟踪cuBLAS上下文.

然而,进入CUDA 6.0是一个名为NVBLAS的新库,它提供了这种"插入式"功能.它拦截Level3 BLAS调用(GEMM,TRSV等)并自动将它们发送到GPU,通过GPU计算有效地平铺PCIE传输.

这里有一些信息:https://developer.nvidia.com/cublasxt,今天CUDA注册开发人员可以使用CUDA 6.0.

一旦CUDA 6.0向公众发布,完整的文档将在线.


小智 2

CUBLAS 不环绕 BLAS。CUBLAS 还以列优先顺序访问矩阵,例如某些 Fortran 代码和 BLAS。

我更习惯用 C 编写代码,即使是 CUDA。使用 CBLAS(BLAS 的 C 封装)编写的代码可以轻松更改为 CUDA 代码。请注意,使用 BLAS 的 Fortran 代码与使用 CBLAS 的 C/C++ 代码有很大不同。Fortran 和 BLAS 通常以列优先顺序存储矩阵或双精度数组,但 C/C++ 通常处理行优先顺序。我通常通过将矩阵保存在一维数组中来处理这个问题,并使用 #define 编写一个宏来访问矩阵的元素 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 
Run Code Online (Sandbox Code Playgroud)

CBLAS 库具有组织良好的参数和约定(常量枚举变量),为每个函数提供矩阵的排序。请注意,矩阵的存储方式也有所不同,行式带状矩阵的存储方式与列式带状矩阵不同。

我认为没有机制可以让用户在不编写代码两次的情况下在使用 BLAS 或 CUBLAS 之间进行选择。CUBLAS 在大多数函数调用中还具有 BLAS 上未出现的“句柄”变量。我想用 #define 在每个函数调用时更改名称,但这可能行不通。