首页 文章

在cuda中计算矩阵A.transpose * A.

提问于
浏览
-2

当我在cuda中计算`A.transpose * A'时有一些问题 .

假设A是M * N矩阵并存储在column-major中,我尝试使用此函数 cublasSgemm_v2 这是Cublas中的Matrix-Matrix乘法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 cublas<t>syrk() . 返回的结果存储在矩阵的下部或上部,这意味着未引用矩阵的其余部分,以及如何编写内核以将元素复制到对称部分?

另一个问题是我的程序有时会崩溃(可能是三分之一的可能性)在代码的开头,如cudaMalloc或cbulascreate或其他地方,我只修改代码中间的一些代码,并且它之前运行了很多次,可能是什么原因这个?

谢谢

1 回答

  • 0

    你必须仔细阅读cublas gemm documentation .

    有一种方法可以用 cublas<T>gemm 直接计算 A' * A ,但这很棘手 .

    cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_N, N, K, M, &alpha,
        A, M, A, M, &beta, B, N);
    

    这是一种小黑客 - A是以列主要顺序存储的维度矩阵 A(MxN)K = N . 因此作为回应你会得到 B = A' * A .

相关问题