julia - 对于固定大小的小矩阵,Eigen 的速度有多快?

标签 julia eigen blas eigen3

我目前正在使用 Julia,但我有一个性能关键函数,它需要对固定大小的小型矩阵(3 维或 4 维)进行大量重复矩阵运算。 Julia 中的所有矩阵运算似乎都由 BLAS 和 LAPACK 后端处理。在这些函数中的一些函数中似乎还有很多内存分配。

有一个 Julia 图书馆 small matrices它为 3x3 矩阵提供了令人印象深刻的加速,但它已经 3 年没有更新了。我正在考虑在 Eigen 中重写我的性能关键函数

我知道 Eigen 声称对固定大小的矩阵非常有用,但我仍在尝试判断是否应该在 Eigen 中重写此函数。业绩benchmarks用于动态大小的矩阵。有没有人有任何数据可以表明一个人从固定大小的矩阵中获得多少性能?我正在做的操作类型是矩阵 x 矩阵、矩阵 x 向量、正定线性求解。

最佳答案

如果你想对小矩阵进行快速运算,我强烈推荐 StaticArrays .例如(注意:这最初是在 BenchmarkTools 包之前编写的,现在推荐使用):

using StaticArrays
using LinearAlgebra

function foo(A, b, n)
    s = 0.0
    for i = 1:n
        s += sum(A*b)
    end
    s
end

function foo2(A, b, n)
    c = A*b
    s = 0.0
    for i = 1:n
        mul!(c, A, b)
        s += sum(c)
    end
    s
end

A = rand(3,3)
b = rand(3)
Af = SMatrix{3,3}(A)
bf = SVector{3}(b)

foo(A, b, 1)
foo2(A, b, 1)
foo(Af, bf, 1)

@time foo(A, b, 10^6)
@time foo2(A, b, 10^6)
@time foo(Af, bf, 10^6)
结果:
julia> include("/tmp/foo.jl")
  0.080535 seconds (1.00 M allocations: 106.812 MiB, 14.86% gc time)
  0.064963 seconds (3 allocations: 144 bytes)
  0.001719 seconds (2 allocations: 32 bytes)
foo2试图变得聪明并避免内存分配,但在使用 StaticArrays 时,它只是被幼稚的实现所震撼。 .

关于julia - 对于固定大小的小矩阵,Eigen 的速度有多快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542776/

相关文章:

performance - Julia 中的矢量比较速度更快

reference - cblas 接口(interface)有什么好的文档吗?

python - 在 scipy 中使用大 F 阶矩阵进行 dgemm 段错误

julia - 如何使规范化适用于 Julia 中的所有类型的数组?

Julia 打印函数将 UInt32 数组打印为十六进制

python - 在 C++ 中使用来自 OpenCV 矩阵的特征将图像旋转 90 度

c++ - 如何对 Eigen 中的二维数组的列执行简单的算术运算

matlab - Armadillo + Matlab Mex 段错误

julia - 定义中的评估

c++ - Eigen 与 Matlab : parallelized Matrix-Multiplication