特定格式的 CUDA cublasSgemm 矩阵乘法

CUDA cublasSgemm matrix multiplication in specific format

我想使用 CUDA 的 cublasSgemm 函数将两个矩阵 A 和 B 相乘。

但是,A 是行优先格式,B 是列优先格式,我希望输出是行优先格式。

这是否可能 - 如果可以 - 我必须如何设置这些参数

cublasHandle_t handle,
cublasOperation_t transa, cublasOperation_t transb,
int m, int n, int k,
const float     *alpha,
const float     *A, int lda,
const float     *B, int ldb,
const float     *beta,
float           *C, int ldc

如果例如A=1x4B=4x16 这样 C=1x16?

你给出的例子没有多大意义,因为它是一个 matrix-vector 产品,所以我选择我自己的例子来使它更清楚:

C = A * B

  • A = [8, 4] 行专业,在解释时表示 [4, 8] column-major
  • B = [4, 6] 专栏
  • C = [8, 6] 行专业,在解释 column-major
  • 时表示 [6, 8]

CuBLAS 使用 column-major 顺序,因此谈论 row-major 顺序会让人分心。倒不如说是转置。这给了我们 A = [4, 8], B = [4, 6], C = [6, 8]。这很容易看出你想要 C = transpose(B) * A

在 CuBLAS 中,那将是

cublasSgemm(handle,
            CUBLAS_OP_T /*transpose left side*/,
            CUBLAS_OP_N /* no transposition right side*/,
            6 /*rows in C*/, 8 /*columns in C*/, 4 /* rows on right side*/,
            &alpha /*1.f*/, B /*left side*/, ld_B,
            A /*right side*/, ld_A, &beta /*0.f*/,
            C, ld_C);

ld_A、ld_B和ld_C是主要维度,a.k.a。 A、B 和 C 矩阵的外部维度。也称为外步幅,它是每个矩阵中连续列之间的元素数(因为它们是主要列)。由于填充或使用较大矩阵的切片,这可能大于“逻辑”行数。

换句话说,如果我们有float* A并且A[0]是第一行第一列,那么A[ld_A]是第一行第二列并且A[ld_A + 1]是第二行第二列。

如果您使用 cudaMalloc3D 分配适当的填充矩阵,则 pitch / sizeof(float) 使用 cudaPitchedPtr

的属性