Как работает параметр ведущего измерения для подматриц в cblas_dgemm ()? - PullRequest
0 голосов
/ 03 января 2019

У меня есть три матрицы A, B и C: enter image description here

И матрично-матричное произведение для общих матриц:

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.

В случае подматрицы CI я думаю, что мне нужно прощать &A[5] и установить M=3, N=2, ldc=4

Но я понятия не имею, как это может работать в случае красной подматрицы B с M=4, N=2.Может кто-то объяснить это мне.Большое спасибо.

1 Ответ

0 голосов
/ 03 января 2019

Эта статья в значительной степени объясняет это: 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]

Другими словами, начальный размер обычно будет длиной в столбце внешней матрицы, если выMajor Column и длина строки, если вы вычисляете строку-Major.

В случае B это немного сложнее, так как вам нужно перепрыгнуть через два столбца по 5, т.е. 10, при переходе от одногостолбец подматрицы к следующему.

Все, что BLAS хочет сейчас: (основной столбец / строка):

  1. С чего начать (&A[0], &B[0], &C[6] / &A[0], &B[0], &C[5])
  2. Сколько длится первое измерение, M (5, 4, 3 / 4, 2, 2)
  3. Сколько существует этих столбцов / строк, N (4, 2, 2 / 5, 4, 3)
  4. Как далеко прыгать по внешней матрице, чтобы перейти к следующему столбцу / строке ldx (5, 10, 5)
...