特定格式的 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=1x4
和 B=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
的属性
我想使用 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-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