Transpose matrix multiplication in cuBLAS howto

后端 未结 1 1726
慢半拍i
慢半拍i 2020-12-10 08:59

The problem is simple: I have two matrices, A and B, that are M by N, where M >> N. I want to first take the transpose of A, and then multiply that by B (A^T * B) to put th

相关标签:
1条回答
  • 2020-12-10 09:29

    Since cuBLAS always assume that the matrices are stored in column-major. You could either transpose your matrices first into colum-major by using cublas_geam(), or

    You could treat your matrix A stored in row-major, as a new matrix AT stored in column-major. The matrix AT is actually the transpose of A. For B do the same thing. Then you could calculate matrix C stored in column-major by C=AT * BT^T

    float* AT = A;
    float* BT = B;
    

    The leading dimension is a param related to the storage, which doesn't change no matter you use the transpose flag CUBLAS_OP_T or not.

    lda = num_col_A = num_row_AT = N;
    ldb = num_col_B = num_row_BT = N;
    ldc = num_row_C = N;
    

    m and n in the cuBLAS GEMM routine are the #rows and #cols of the result matrix C,

    m = num_row_C = num_row_AT = num_col_A = N;
    n = num_col_C = num_row_BT = num_col_B = N;
    

    k is the common dimension of A^T and B,

    k = num_col_AT = num_row_B = M;
    

    Then you could invoke the GEMM routine by

    cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_T, m, n, k, &alpha, AT, lda, BT, ldb, &beta, C, ldc);
    

    If you want the matrix C to be stored in row-major, you could calculate the CT stored in column-major with the formula CT = BT * AT^T by

    cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_T, n, m, k, &alpha, BT, ldb, AT, lda, &beta, CT, ldc);
    

    Please note you don't have to swap m and n since C is a square matrix in this case.

    0 讨论(0)
提交回复
热议问题