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 или больше, в зависимости от вашего процессора. Удачи!

Другие вопросы по тегам