Самый быстрый способ вычисления симметричного обновления ранга k с диагональной матрицей

#c #lapack #blas #intel-mkl

#c #lapack #blas #intel-mkl

Вопрос:

Я хотел бы обновить симметричную матрицу C с помощью уравнения

 C = alpha*A*D*A^T   beta*C
  

где A — общая матрица размером n на k, а D — диагональная матрица.

Какой наиболее эффективный способ вычислить это с использованием BLAS и LAPACK? Есть ли что-нибудь похожее на syrk (netlib), но допускающее диагональный множитель? Возможно, через расширение уровня BLAS 3?

Используя MKL, вы могли бы вычислить

 B = A*D
  

а затем используйте расширение MKL gemmt (Intel) для вычисления только нижней треугольной части A * B^T

Но это вряд ли кажется наиболее эффективным возможным подходом, потому что B = A * D вычисления требуют ненужной дополнительной работы. Мне интересно, существуют ли какие-либо специализированные ядра для этого, поскольку кажется, что это было бы обычным вычислением.