У меня есть три матрицы A, B и C:
И матрично-матричное произведение для общих матриц:
void cblas_dgemm(const enum CBLAS_ORDER __Order, const enum CBLAS_TRANSPOSE __TransA, const enum CBLAS_TRANSPOSE __TransB, const int __M, const int __N, const int __K, const double __alpha, const double *__A, const int __lda, const double *__B, const int __ldb, const double __beta, double *__C, const int __ldc);
Для использования cblas_dgemm
-команда мне нужно знать ведущее измерение. Для меня ясно, что в случае полной матрицы A (или ее транспонированной формы) имеем: M=5, N=4, lda=4
,
В случае подматрицы C я думаю, что я должен прощать &A[5]
и установить M=3, N=2, ldc=4
Но я понятия не имею, как это может работать в случае красной подматрицы B с M=4, N=2
, Может кто-то объяснить это мне. Большое спасибо.
Эта статья в значительной степени описывает это:
https://petewarden.com/2015/10/25/an-engineers-guide-to-gemm/
Причина очевидной сложности процедур BLAS заключается в том, что они обеспечивают большую гибкость и оптимизированы для обеспечения исключительно хороших результатов. Обе цели достигаются, если подпрограммы могут применяться к матрицам, состоящим из подматриц, представляющих интерес, и т. Д. Зачастую они могут делать больше, чем нужно. xGEMM
класс является выдающимся примером. Вы можете выполнить A * B
но также A * B + c*C
…
В вышеперечисленных случаях:
A: M=5, N=5, LDA = 5
B: M=4, N=1, LDB = 10
C: M=3, N=2, LDB = 5
И вы правы в том, что ваша первая запись в C &C[6]
Другими словами, ведущим измерением обычно будет длина столбца внешней матрицы, если вы главный столбец, и длина строки, если вы вычисляете мажор строки.
В случае B это немного сложнее, так как вам нужно перепрыгнуть через два столбца по 5, то есть 10, при переходе от одного столбца подматрицы к следующему.
Все, что BLAS хочет сейчас, это (столбец / ряд основных):
&A[0], &B[0], &C[6]
/&A[0], &B[0], &C[5]
) M
(5, 4, 3
/ 4, 2, 2
)N
(4, 2, 2
/ 5, 4, 3
)ldx
(5, 10, 5
)Других решений пока нет …