R: любая более быстрая функция R, чем "tcrossprod" для симметричного умножения плотной матрицы?
Позволять
x = matrix(rnorm(1000000), nrow = 5000)
Я хотел бы вычислить умножение матриц с помощью транспонирования: x %*% t(x)
,
После поиска в Google я нашел более быстрый способ сделать это
tcrossprod(x)
И время заняло
user system elapsed
2.975 0.000 2.960
Существует ли какая-либо другая R-функция, которая может выполнить задачу быстрее, чем указанная выше функция?
1 ответ
Нет. На уровне R это уже самый быстрый. Но внутренне это вызывает уровень 3 BLAS dsyrk
, Так что если у вас есть высокопроизводительная библиотека BLAS, это будет намного быстрее. Попробуйте связать OpenBLAS с вашим R.
Связывание библиотеки BLAS не требует перестройки R. Возможно, вы прочитали мой вопрос, связывающий R с библиотекой BLAS для обзора, который содержит несколько ссылок, показывающих, как настроить псевдоним, а затем переключаться между различными библиотеками BLAS на компьютере.
В качестве альтернативы вы можете прочитать мой очень длинный вопрос и ответ Без корневого доступа запустите R с настроенным BLAS, когда он связан с эталонным BLAS, который предоставляет различные способы использования внешней библиотеки BLAS, даже если R связан с эталонной библиотекой BLAS.
Как примечание, для матрицы с размерностью m * n
, dsyrk
имеет счетчик FLOP n * m ^ 2
, (Обратите внимание, это вычислительные затраты на tcrossprod
, За crossprod
это m * n ^ 2
.)
У тебя есть m = 5000
а также n = 200
и вычисление занимает 2.96s
, Таким образом, вычисления имеют скорость: (200 * 5000 ^ 2 / 2.96) * 1e-9 = 1.68 GFLOPs
, Что ж, это обычный уровень производительности, поэтому на данный момент вы определенно используете эталонный BLAS. С OpenBLAS
производительность может достигать 10 GFLOPs
или больше, в зависимости от вашего процессора. Удачи!