Цель аргумента LDA в BLAS dgemm? - PullRequest
40 голосов
/ 21 ноября 2011

Справочная документация по реализации на Фортране гласит:

*  LDA    - INTEGER.
*           On entry, LDA specifies the first dimension of A as declared
*           in the calling (sub) program. When  TRANSA = 'N' or 'n' then
*           LDA must be at least  max( 1, m ), otherwise  LDA must be at
*           least  max( 1, k ).
*           Unchanged on exit.

Однако, учитывая m и k, не могу ли я получить LDA?Когда LDA может быть больше n (или k)?

Ответы [ 3 ]

38 голосов
/ 21 ноября 2011

Параметр LDA в BLAS, по сути, является шагом матрицы, как он выложен в линейной памяти.Вполне допустимо иметь значение LDA, превышающее начальный размер матрицы, на которой выполняется операция.Типичные случаи, когда полезно или необходимо использовать большее значение LDA, это когда вы работаете с субматрицей из более плотной матрицы, и когда аппаратные средства или алгоритмы предлагают преимущества в производительности, когда хранилище дополняется до кратных некоторого оптимального размера (строки кэша, или размер транзакции памяти GPU, или баланс нагрузки в многопроцессорных реализациях, например).

20 голосов
/ 21 ноября 2011

Различие между логическим размером первых измерений массивов A и B и физическим размером.Первый - это размер используемого вами массива, второй - значение в объявлении или физический объем используемой памяти.Поскольку Fortran является основным языком столбцов, для расчета местоположения элемента массива должны быть известны объявленные размеры всех индексов, кроме последнего.Обратите внимание на объявления стиля FORTRAN 77: «A (LDA, ), B (LDB, ), C (LDC, *)».Объявленный размер массива может быть больше, чем часть, которую вы используете;конечно он не может быть меньше.

6 голосов
/ 18 июня 2016

Еще один способ взглянуть на это - LDA - это y-шага, то есть в макете основной строки ваш адрес для элемента A [y, x] вычисляется как x + LDA * y.Для «упакованного» макета памяти без промежутков между соседними строками x-данных LDA = xSize.

...