我想使用 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=1x4
和 B=4x16
这样 C=1x16
?
你给出的例子没有多大意义,因为它是一个矩阵向量乘积,所以我选择我自己的例子来使它更清楚:
C = A * B
CuBLAS 使用列优先顺序,因此谈论行优先顺序会分散注意力。最好说它们是转置的。这给我们 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、B 和 C 矩阵的外部维度。也称为外步幅,它是每个矩阵中连续列之间的元素数量(因为它们是列主数)。由于填充或使用较大矩阵的切片,这可能大于“逻辑”行数。
换句话说,如果我们有
float* A
并且 A[0]
是第一行第一列,那么 A[ld_A]
是第一行第二列,A[ld_A + 1]
是第二行第二列。
如果您使用
cudaMalloc3D
来分配适当填充的矩阵,则 pitch / sizeof(float)
使用 cudaPitchedPtr
的属性
只需添加到 @binaryBigInt ,主维将是 ld_B=6 和 ld_A=4 和 ld_C=6 。请注意,C 将为 68,但在行专业中它将为 86。因此,如果您使用外循环 8 和内循环 6 打印 C,您将在主行中打印答案。