对于固定大小的小型矩阵,本征速度快多少?

Lin*_*don 5 blas eigen julia eigen3

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

有一个针对小型矩阵的julia库,该库具有3x3矩阵惊人的加速性能,但是3年没有更新。我正在考虑在Eigen中重写性能关键功能

我知道Eigen声称对固定大小的矩阵确实非常有用,但是我仍在尝试判断是否应该在Eigen中重写此函数。性能基准适用于动态大小的矩阵。没有人有任何数据可以建议人们从固定大小的矩阵中获得多少性能?我正在执行的运算类型是矩阵x矩阵,矩阵x向量,正定线性求解。

tho*_*oly 5

如果你想对小矩阵进行快速运算,我强烈推荐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)
Run Code Online (Sandbox Code Playgroud)

结果:

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)
Run Code Online (Sandbox Code Playgroud)

foo2试图变得聪明并避免内存分配,但在使用StaticArrays.