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