首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cublas函数调用cublasSgemv

cublas函数调用cublasSgemv
EN

Stack Overflow用户
提问于 2014-01-16 14:22:31
回答 1查看 3.5K关注 0票数 2

感谢@集线器,当调用cublasSgemv时,应该注意到CUBLAS_OP_T也是转置向量。/*I正在学习cuda和cublas一个月,我想测试cublas的性能以供进一步使用。但是在我使用cublasSgemv的矩阵向量乘法中,答案是错误的。我在行大调中初始化矩阵A和向量x。我使用cudaMemcpy将它们发送到设备,并调用函数cublasSgemv,因为A是主要行,所以我使用参数CUBLAS_OP_T*/

代码语言:javascript
复制
 //the row is 50,and col is 10, A[i]=i;x[i]=1; And A matrix is row major.
 //the answer I get is 45,545,.....4545,0,0,0,0,0,0,0,0,........0

int main(){
int row=50;
int col=10;
int N=row*col;
float*A=new float[N];
float* y_gpu=new float[50]; 
for (int i=0;i<N;i++)
{
    A[i]=(float)i;
}
float* x=new float[10];
for (int i=0;i<10;i++)
{
    x[i]=1;
}
GpuVec(A,x,y_gpu,row,col);  //call the function 
    for(int i=0;i<50;i++){
    cout<<" "<<y_gpu[i]<<endl;  //
} 

return 0;

}

代码语言:javascript
复制
int GpuVec(const float* A,const float* x, float* y,const int row,const int col){
cudaError_t cudastat;
cublasStatus_t stat;
int size=row*col;
cublasHandle_t handle;
float* d_A;  //device matrix
float* d_x;  //device vector
float* d_y;  //device result
cudastat=cudaMalloc((void**)&d_A,size*sizeof(float)); 
cudastat=cudaMalloc((void**)&d_x,col*sizeof(float));
cudastat=cudaMalloc((void**)&d_y,row*sizeof(float));// when I copy y to d_y ,can I cout d_y?

cudaMemcpy(d_A,A,sizeof(float)*size,cudaMemcpyHostToDevice);  //copy A to device d_A
cudaMemcpy(d_x,x,sizeof(float)*col,cudaMemcpyHostToDevice);   //copy x to device d_x
float alf=1.0;
float beta=0;
    stat=cublasCreate(&handle);
stat=cublasSgemv(handle,CUBLAS_OP_T,col,row,&alf,d_A,col,d_x,1,&beta,d_y,1);//swap col and row
cudaMemcpy(y,d_y,sizeof(float)*row,cudaMemcpyDeviceToHost); // copy device result to host 
cudaFree(d_A);
cudaFree(d_x);
cudaFree(d_y);
cublasDestroy(handle);
return 0;

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-16 15:27:05

要使用按行大顺序存储的二维数组(与列的主要顺序配合使用),您可以这样调用gemv

代码语言:javascript
复制
stat = cublasSgemv(handle, CUBLAS_OP_T, col, row, &alf, d_A, col, d_x, 1, &beta, d_y, 1);

您也必须在调用中交换m(行)和n(列),以执行y = A * x,但它允许您使用cublas调用,而无需转换原始数组。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21164373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档