Почему BLAS имеет функцию gemm
для матрично-матричного умножения и отдельную функцию gemv
для умножения матричных векторов? Не является ли матрично-векторное умножение лишь частным случаем матрично-матричного умножения, где одна матрица имеет только одну строку/столбец?
BLAS: гемма против gemv
Ответ 1
Математически умножение матричных векторов является частным случаем матрично-матричного умножения, но это не обязательно верно для них, как реализовано в библиотеке программного обеспечения.
Они поддерживают разные варианты. Например, gemv
поддерживает строгий доступ к векторам, на которых он работает, тогда как gemm
не поддерживает макеты строковых матриц. В привязках языка C gemm
требуется, чтобы вы указали порядок хранения всех трех матриц, в то время как это не нужно в gemv
для векторных аргументов, потому что это было бы бессмысленно.
Помимо поддержки разных опций, существуют семейства оптимизаций, которые могут выполняться на gemm
, которые не применимы к gemv
. Если вы знаете, что вы делаете матрично-векторный продукт, вы не хотите, чтобы библиотека теряла время, выясняя, что это дело, прежде чем переключиться на путь кода, который оптимизирован для этого случая; вам лучше называть это напрямую.
Ответ 2
При оптимизации gemv и gemm применяются различные методы:
- Для операции матричной матрицы вы используете блокированные алгоритмы. Размеры блоков зависят от размеров кеша.
- Для оптимизации матрично-векторного продукта вы используете так называемые плавные операции уровня 1 (например, плавленые точечные продукты или плавленые оси).
Сообщите мне, если вы хотите получить более подробную информацию.
Ответ 3
Я думаю, что он лучше подходит для иерархии BLAS с помощью своих подпрограмм уровня 1 (вектор-вектор), уровня 2 (матричный вектор) и уровня 3 (матрично-матричная). И это может быть оптимизировано немного лучше, если вы знаете, что это всего лишь вектор.