特定格式的CUDA cublasSgemm矩阵乘法

问题描述 投票:0回答:2

我想使用 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

matrix cuda matrix-multiplication cublas
2个回答
4
投票

你给出的例子没有多大意义,因为它是一个矩阵向量乘积,所以我选择我自己的例子来使它更清楚:

C = A * B

  • A = [8, 4] 行主,解释为列主时表示 [4, 8]
  • B = [4, 6] 列专业
  • C = [8, 6] 行优先,解释为列优先时表示 [6, 8]

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

的属性

0
投票

只需添加到 @binaryBigInt ,主维将是 ld_B=6 和 ld_A=4 和 ld_C=6 。请注意,C 将为 68,但在行专业中它将为 86。因此,如果您使用外循环 8 和内循环 6 打印 C,您将在主行中打印答案。

© www.soinside.com 2019 - 2024. All rights reserved.