R:对于对称密集矩阵乘法,有比 "tcrossprod" 更快的 R 函数吗?
R: any faster R function than "tcrossprod" for symmetric dense matrix multiplication?
让
x = matrix(rnorm(1000000), nrow = 5000)
我想计算矩阵乘法及其转置:x %*% t(x)
。
谷歌搜索后我发现一个可能更快的方法是
tcrossprod(x)
花费的时间是
user system elapsed
2.975 0.000 2.960
是否有任何其他 R 函数可以比上述函数更快地完成任务?
没有。在 R 级别,这已经是最快的了。但在内部它调用 level-3 BLAS 例程 dsyrk
。所以如果你有一个高性能的 BLAS 库,这会快很多。尝试将 OpenBLAS 链接到您的 R.
链接 BLAS 库不需要重建 R。您可以阅读我的问题 linking R to BLAS library 以获得概述,其中包含几个链接,向您展示如何设置别名然后在不同的 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
或更高,具体取决于您的 CPU。祝你好运!
让
x = matrix(rnorm(1000000), nrow = 5000)
我想计算矩阵乘法及其转置:x %*% t(x)
。
谷歌搜索后我发现一个可能更快的方法是
tcrossprod(x)
花费的时间是
user system elapsed
2.975 0.000 2.960
是否有任何其他 R 函数可以比上述函数更快地完成任务?
没有。在 R 级别,这已经是最快的了。但在内部它调用 level-3 BLAS 例程 dsyrk
。所以如果你有一个高性能的 BLAS 库,这会快很多。尝试将 OpenBLAS 链接到您的 R.
链接 BLAS 库不需要重建 R。您可以阅读我的问题 linking R to BLAS library 以获得概述,其中包含几个链接,向您展示如何设置别名然后在不同的 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
或更高,具体取决于您的 CPU。祝你好运!