我目前正在使用Julia,但我有一个性能关键功能,需要在小的固定大小矩阵(3维或4维)上进行大量的重复矩阵运算。似乎Julia中的所有矩阵运算都由BLAS和LAPACK后端处理。在其中一些功能中也会出现很多内存分配。
small matrices有一个julia库,它为3x3矩阵提供了令人印象深刻的加速,但它在3年内没有更新。我正在考虑在Eigen
中重写我的性能关键功能我知道Eigen声称对于固定大小的矩阵非常有用,但我仍然试图判断我是否应该在Eigen中重写这个函数。性能benchmarks适用于动态大小的矩阵。有没有人有任何数据可以表明从固定大小的矩阵中获得多少性能?我正在做的操作类型是矩阵x矩阵,矩阵x向量,正定线性求解。
答案 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
时,它只是被天真的实现所震撼。