cublas库实现矩阵乘法(任意维数)

原创 2015年11月17日 21:59:35

话不多说,直接进入主题

cublas是CUDA上矩阵运算的库,可以在gpu上实现很高的效率。然而关于它的使用,并没有详细的中文资料

笔者,经过多次调试成功,分享一点儿心得

#include <iostream>
#include <cstdlib>
#include <cublas_v2.h>
// Multiply the arrays A and B on GPU and save the result in C
// C(m,n) = A(m,k) * B(k,n)
//计算过程
void gpu_blas_mmul(const float *A, const float *B, float *C, const int m, const int k, const int n) {
int lda=m,ldb=k,ldc=m;
const float alf = 1;
const float bet = 0;
const float *alpha = &alf;
const float *beta = &bet;


// Create a handle for CUBLAS
cublasHandle_t handle;
cublasCreate(&handle);


// Do the actual multiplication
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);


// Destroy the handle
cublasDestroy(handle);
}


int main(){
int row1=5;
int column1 = 10;
int row2 = 10;
int column2 = 5;


int result[5][5];
//内存中分配内存空间
float *h_A = (float *)malloc(row1 * column1 * sizeof(float));
float *h_B = (float *)malloc(row2 * column2 * sizeof(float));
float *h_C = (float *)malloc(row1 * column2 * sizeof(float));
//实现内存中数组的复制
for(int i = 0; i < row1; i++){
for(int j = 0; j < column1; j++)
h_A[i*column1 + j]=i;


}


for(int i = 0; i < row2; i++){
for(int j = 0; j < column2; j++)
h_B[i*column2 + j]=j;


}


//打印数组
for(int i=0;i<row1;i++)
{for(int j=0;j<column1;j++)
printf("%.3f ",h_A[i*column1+j]);
printf("\n");
}


//打印数组
for(int i=0;i<row2;i++)
{for(int j=0;j<column2;j++)
printf("%.3f ",h_B[i*column2+j]);
printf("\n");
}
// Allocate 3 arrays on GPU
float *d_A, *d_B, *d_C;
cudaMalloc(&d_A,row1 * column1 * sizeof(float));
cudaMalloc(&d_B,row2 * column2 * sizeof(float));
cudaMalloc(&d_C,row1 * column2 * sizeof(float));




// If you already have useful values in A and B you can copy them in GPU:
cudaMemcpy(d_A,h_A,row1 * column1 * sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy(d_B,h_B,row2 * column2 * sizeof(float),cudaMemcpyHostToDevice);


gpu_blas_mmul(d_B, d_A, d_C, row1, row2, column2);


// Copy (and print) the result on host memory
cudaMemcpy(h_C,d_C,row1 * column2 * sizeof(float),cudaMemcpyDeviceToHost);
for(int i = 0; i < row1; i++){
for(int j = 0; j < column2; j++)
result[i][j] = (int)h_C[j * row1 + i];


}


//打印数组
for(int i=0;i<row1;i++)
{for(int j=0;j<column2;j++)
printf("%d ",result[i][j]);
printf("\n");
}


//Free GPU memory
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);


// Free CPU memory
free(h_A);
free(h_B);
free(h_C);
getchar();
return 0;
}


我是想用cublas实现任意维矩阵乘法运算。

cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc);

cublasHandle_t handle用来分配句柄

第二个参数和第三个参数,用来说明,矩阵是否转置

在cuda中二维数组是按照列存储的,在c中二维数组按照行存储,在c语言中的一个矩阵(二维数组)A = M X K, B = N X K, C = A * Bt = M x N


对于cuda而言(列存储),看到的A矩阵是K x M, B 是 K x N, 计算的C = Bt * A = N x M

计算结果C矩阵在c语言看来就是按照行存储的 M x N

A(m x k)B(k x n)

至于lda,ldb,ldc代表什么呢,leading dimension a的缩写,分表代表,A,B,C的leading维,也就是他们的行数


另一个需要注意的地方,

 gpu_blas_mmul(d_B, d_A, d_C, row1, row2, column2);

要把d_B写在前边,因为cublas按列来存数数据,相当于对它转置了,最后得到的结果也是转置的,

切记,切记!

cublasSgemm实现矩阵的相乘

今天想调用cuda的库函数实现矩阵的相乘,但是发现在cublasSgemm中矩阵是按照列主元素进行存储的,也就是一列列的存储的。这和c中一般按照行存储完全相反,后面看了一个帖子http://cudaz...

利用cuda的cublas库实现任意矩阵的乘法

使用cublas库的相关函数做矩阵乘法时,应当注意两点:一是cublas的中数据时按里存储的,二是,要注意矩阵是在GPU端产生的还是CPU端产生的。 在cublas库中,实现矩阵的乘法有有以...

大毕设-CUDA-cuFFT库

Computing a number BATCH of one-dimensional DFTs of size NX using cuFFT will typically look like thi...

如何用cublas计算逆矩阵?

cublas的文档中提供了一个用LU分解求逆矩阵的方法,需要用到两个函数:  cublasgetrfBatched()  cublasgetriBatched() 第一个函数用于做LU分解...
  • yfszzx
  • yfszzx
  • 2016年01月27日 01:17
  • 2175

用cublas实现行优先矩阵乘法和列优先矩阵乘法

引用:http://www.cnblogs.com/scut-fm/p/3756242.html cublas库是CUDA标准的线代库,但没有专门针对稀疏矩阵的操作。 其中cublasSgemm实现C...

c语言求任意阶矩阵乘法

  • 2011年03月27日 21:39
  • 704B
  • 下载

cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的。处理方法可参考下面的注释代码

cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的。处理方法可参考下面的注释代码 cublas中执行矩...

基于c语言实现的矩阵乘法

  • 2016年03月30日 10:21
  • 2.43MB
  • 下载

linux多线程实现矩阵乘法

  • 2011年11月08日 17:08
  • 2KB
  • 下载

OpenMP矩阵乘法实现

前面已经介绍了MPI和Pthreads矩阵乘法的实现,下面将继续介绍OpenMP矩阵乘法的实现方式。其实OpenMP矩阵乘法的实现与前面的Pthreads的实现方式有共同之处,都是基于线程的并行矩阵乘...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cublas库实现矩阵乘法(任意维数)
举报原因:
原因补充:

(最多只允许输入30个字)