Возможно, вы захотите взглянуть на использование библиотеки BLAS (подпрограмма базовой линейной алгебры), в частности, Intel предлагает свои MKL здесь , у AMD их ACML здесь , а также есть (с открытым исходным кодом) Goto BLAS здесь .
Ядром (плотной) матрично-матричного умножения будет вызов ?GEMM
, где ?
указывает тип с плавающей запятой. Например, DGEMM
вызовет подпрограмму double
.
Если вы не уверены в том, что знаете, что делаете с низкоуровневой оптимизацией, эти библиотеки, вероятно, будут предлагать лучшую производительность, чем то, что вы можете кодировать вручную.
Если вы действительно хотите сами написать код, тогда вы можете рассмотреть следующее:
- Используйте "векторные" инструкции.
SSE, SSE2..4
инструкции широко поддерживаются, некоторые более новые CPU
также будут поддерживать AVX
инструкции.
- Развертывание вложенного цикла для максимизации отношения операций с плавающей запятой к операциям загрузки / сохранения.
- Блочные алгоритмы для обеспечения эффективного использования кэша.
- Многопоточность.
Эта ссылка может дать вам представление о текущем состоянии вещей:
Высокопроизводительная реализация BLAS уровня 3 - K Goto.
Надеюсь, это поможет.