Ваш код - лучшее, что BLAS может сделать для вас. Нет операции BLAS, которая может использовать тот факт, что M симметрична.
Вы правы, хотя технически вам нужно только вычислить верхнюю диагональную часть продукта gemm
и затем скопировать строго верхнюю диагональную часть в нижнюю диагональную часть. Но для этого нет рутины.
Могу ли я узнать о размерах? И позвольте мне также вдохновить некоторые другие источники для повышения производительности: Собственная сборка вашей реализации BLAS, сравнение с MKL, ACML, OpenBLAS, ATLAS. Очевидно, вы можете написать свою собственную версию, которая будет использовать AVX
, FMA
intrinsics. Вы должны быть в состоянии сделать лучше, чем некоторые обобщенные библиотеки. Кроме того, какова точность вашей переменной с плавающей точкой?
Я серьезно сомневаюсь, что вы все равно могли бы получить слишком много, если бы сами его кодировали. Но то, что я бы определенно предложил, - это конвертировать все в поплавки и тестировать, если точность поплавка не дает того же результата со значительным ускорением во времени вычислений. Очень редко я видел такие случаи, которые были больше в области решения ODE и численной интеграции неприятных функций.
Но вы не ответили на мой вопрос относительно реализации BLAS и типа машины.
Опять же, оптимизация за пределами этого пункта невозможна без дополнительных навыков :(. А если серьезно, не беспокойтесь об этом. Есть причина, почему BLAS не делает оптимизацию, которую вы запрашиваете. Стоит хлопот. Пойдите со своим решением.
И не забывайте инвестировать в использование поплавков, а не удваивать. На R конвертируй все, чтобы плавать. Для команд Lapack используйте только sgemX