计算矩阵A。在cuda中转置*A

计算矩阵A。在cuda中转置*A,cuda,gpu,cublas,Cuda,Gpu,Cublas,在cuda中计算'A.transpose*A'时出现了一些问题 假设A是M*N矩阵,存储在major列中,我尝试使用这个函数cublasgemv2,它是cublas中的矩阵乘法API 像这样: cublasSgemm_v2(handle,CUBLAS_OP_T,CUBLAS_OP_N,N,N,M,&al,A,N,A,M,&beta,A_result,N) 在调用这个函数之前,我测试了矩阵A,它看起来不错,但它表明参数8是非法的,我不知道为什么 所以我决定使用另一个API来计算A

在cuda中计算'A.transpose*A'时出现了一些问题

假设A是M*N矩阵,存储在major列中,我尝试使用这个函数cublasgemv2,它是cublas中的矩阵乘法API

像这样:

cublasSgemm_v2(handle,CUBLAS_OP_T,CUBLAS_OP_N,N,N,M,&al,A,N,A,M,&beta,A_result,N)
在调用这个函数之前,我测试了矩阵A,它看起来不错,但它表明参数8是非法的,我不知道为什么

所以我决定使用另一个API来计算A.tanspose*A cublassyrk。返回的结果存储在矩阵的下部或上部,这意味着矩阵的其余部分不被引用,如何编写内核将元素复制到对称部分

另一个问题是,我的程序有时在代码开始时可能有三分之一种可能性,比如CUADAMOLC或CBURASGEATE或其他地方,我只是修改了代码中间的一些代码,然后运行了很多次,这可能是什么原因? 谢谢

你必须仔细阅读这篇文章

有一种方法可以用cublasgemm计算a'*a direct,但这很棘手

  cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_N, N, K, M, &alpha,
    A, M, A, M, &beta, B, N);
这是一种小技巧-a是以列大顺序存储的维数为AMxN的矩阵,K=N。
因此,作为响应,您将得到B=A'*A.

请提供一个最小大小的代码,其他人可以复制、粘贴、编译和运行它来重现您的问题。它不一定是K。我只使用它来显示参数的使用。当然也可以是N。