cublas函数调用cublasSgemv

cublas函数调用cublasSgemv,c,cuda,cublas,C,Cuda,Cublas,感谢@hubs,当调用cublasSgemv时,应该注意到CUBLAS_OP__T也是转置向量。 /*我正在学习cuda和cublas一个月,我想测试cublas的性能,以便进一步使用。但是在我使用cublasSgemv的矩阵向量乘法中,答案是错误的。 我初始化矩阵A和向量x的第二行。我使用cudaMemcpy将它们发送到设备,并调用函数cublasSgemv,因为A是row major,所以我使用参数CUBLAS_opt将其转置*/ //the row is 50,and col is 10

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

 //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;

}

要使用cublas中以行主顺序存储的二维数组(与列主顺序一起使用),可以用这种方式调用
gemv

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调用。

要使用cublas中以行主顺序存储的二维数组(与列主顺序一起工作),您可以这样调用
gemv

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调用。

什么是例外,答案是错误的?我认为你用错了
cublasSgemv
。您使用的是
CUBLAS\u OP\T
,这意味着您将使用
da
的转置,这在数学上应该是错误的。您有一个[col x raw]*x[col x 1]=y[row x 1],这是错误的。请提供完整的代码,包括对该函数的调用以及传递给它的所有变量。正如您在中所读到的,x是n(列)元素的向量,仅当使用
CUBLAS_OP_n
时。否则它会有m个元素!我编辑了代码,谢谢@RobertCrovellaA[rowcol]在c中。但在库布拉斯,这将是一个[科罗]。所以我转置了A。对吗?@hubsact什么意思是,答案是错的?我认为你用错了
cublasSgemv
。您使用的是
CUBLAS\u OP\T
,这意味着您将使用
da
的转置,这在数学上应该是错误的。您有一个[col x raw]*x[col x 1]=y[row x 1],这是错误的。请提供完整的代码,包括对该函数的调用以及传递给它的所有变量。正如您在中所读到的,x是n(列)元素的向量,仅当使用
CUBLAS_OP_n
时。否则它会有m个元素!我编辑了代码,谢谢@RobertCrovellaA[rowcol]在c中。但在库布拉斯,这将是一个[科罗]。所以我转置了A。对吗?@Hubstank。我复制您的代码,并调用:cudaMemcpy(y,d_y,sizeof(float)*row,cudaMemcpyDeviceToHost);然后,对于I=0->row,我可以得到y[I]。结果的一半是1.8628e+018,另一半是18628035948437。。。我哪里出错了?如果我只改变这一行,就像我在上面写的,它对我来说是有效的。我是编程新手。你认为什么对我不起作用?1.8628e+018与18628035948437相同。。。。一个是用指数表示法。e、 我不打算猜测你在做什么。如果你发布一个完整的、可编译的代码来打印数字(用不同的符号),我可以看一下。谢谢。我复制您的代码,并调用:cudaMemcpy(y,d_y,sizeof(float)*row,cudaMemcpyDeviceToHost);然后,对于I=0->row,我可以得到y[I]。结果的一半是1.8628e+018,另一半是18628035948437。。。我哪里出错了?如果我只改变这一行,就像我在上面写的,它对我来说是有效的。我是编程新手。你认为什么对我不起作用?1.8628e+018与18628035948437相同。。。。一个是用指数表示法。e、 我不打算猜测你在做什么。如果你发布一个完整的、可编译的代码来打印数字(用不同的符号),我可以看一下。