对于小的固定尺寸矩阵,Eigen的速度要快多少?

时间:2016-02-21 22:10:20

标签: julia eigen blas eigen3

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

small matrices有一个julia库,它为3x3矩阵提供了令人印象深刻的加速,但它在3年内没有更新。我正在考虑在Eigen

中重写我的性能关键功能

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

1 个答案:

答案 0 :(得分:3)

如果您想快速操作小型矩阵,我强烈推荐FixedSizeArrays。例如:

using FixedSizeArrays

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
        A_mul_B!(c, A, b)
        s += sum(c)
    end
    s
end

A = rand(3,3)
b = rand(3)
Af = Mat(A)
bf = Vec(b)

foo(A, b, 1)
foo2(A, b, 1)
foo(Af, bf, 1)
@time 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.000005 seconds (148 allocations: 10.151 KB)
  0.325433 seconds (2.00 M allocations: 106.812 MB, 9.07% gc time)
  0.144793 seconds (8 allocations: 304 bytes)
  0.012683 seconds (6 allocations: 192 bytes)

foo2试图变得聪明并避免内存分配,但在使用FixedSizeArrays时,它只是被天真的实现所震撼。