Julia 小的固定大小矩阵的特征值快多少?

Julia 小的固定大小矩阵的特征值快多少?,julia,eigen,blas,eigen3,Julia,Eigen,Blas,Eigen3,我现在使用的是Julia,但我有一个性能关键函数,它需要对小的固定大小矩阵(3维或4维)进行大量重复的矩阵运算。Julia中的所有矩阵运算似乎都由BLAS和LAPACK后端处理。在这些函数中,似乎还有很多内存分配 有一个julia库,其3x3矩阵的加速效果令人印象深刻,但它已经3年没有更新了。我正在考虑在中重写我的性能关键功能 我知道Eigen声称对固定大小的矩阵非常好,但我仍在尝试判断是否应该用Eigen重写这个函数。性能适用于动态大小的矩阵。有没有人有任何数据表明,一个人从固定大小的矩阵中获

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

有一个julia库,其3x3矩阵的加速效果令人印象深刻,但它已经3年没有更新了。我正在考虑在中重写我的性能关键功能


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

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

结果:

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

进行一些基准测试并亲自查看时,它却被天真的实现所破坏。这是唯一能肯定地回答这个问题的方法。确保您通过优化编译了Eigen。在启用OpenMP和不启用OpenMP的情况下都可以尝试。现在回想一下这句话:“优化的第一条规则:不要这样做!”,或者Knuth的至理名言:“过早优化是万恶之源。”。一个积极的方面是:如果存在特定的性能瓶颈,那么共享问题中的一些代码会有所帮助。您是否尝试过
Base.LinAlg.matmul3x3和本模块中的其他功能?它们绕过BLAS并允许最小分配计算。这很有趣,我还没有尝试过,我会看看它。还有其他专门针对3x3矩阵的函数吗?我想你的答案就在这里:谢谢你的回答,蒂姆,到目前为止一切都很好,现在只有一件事让我犹豫不决。我有数以万计的3x3和3x1,但它们在我的算法的每次迭代中都在变化。理想情况下,一旦它们被创建,我想通过使用setindex来更改它们!i、 e.bf[1]=44,但是包还不支持这个。我应该怎么做?首先将它们创建为
Fixed
。例如,不是从函数返回
[a,b,c]
,而是返回
Vec((a,b,c))
。那会快得多。通常您不需要
setindex,只需替换整个矩阵。(有时LLVM会在引擎盖下实现它作为替换,但你不看就不会知道。)我的算法中有大量固定大小的矩阵和向量,它们在每次迭代中都会发生变化。目前我有一个类似于x=array{FixedSizeArrays.Vec{2,Float64},1}()的数组。如果我调整它的大小,那么这些家伙就会被初始化,赋值x[1]=Mat(..)将不再工作。类似地,我需要在for循环的每次迭代中创建这个数组x,因为它是一个大数组,这将是一个巨大的内存分配负担。我希望在跳入for循环之前分配这个数组x,然后能够修改x[I]。我还按照您的建议通过执行sizehint重新编写了代码!(x,n)然后推!(x,Mat(…),因为我无法修改初始化的Mats。使用FixedSizerRays,我的代码运行时间延长了7倍。在分析下,大部分时间都花在constructor.jl上。看来Vec((a,b,c))正在扼杀它。讨论还在继续
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)