小智 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 在每个函数调用时更改名称,但这可能行不通。
| 归档时间: |
|
| 查看次数: |
3989 次 |
| 最近记录: |