Will definitely keep in mind FixedSizeArrays. In this case my factor of >10
speedup was for the solver itself, "\" vs. 2x2-specific function,
allocating arrays in both cases. I'll probably switch to passing 6 scalars
instead of a matrix and a vector eventually. Thanks again.
On Wednesday, November 18, 2015 at 4:45:01 AM UTC-8, Kristoffer Carlsson
wrote:
>
> With FSA I get around a factor 50 speedup (when I don't use the iterative
> corrector):
>
> function \{T}(A::FixedMatrix{2, 2, T}, b::FixedVector{2, T})
> x = unroll_LU(A[1,1], A[1,2], b[1], A[2,1], A[2,2], b[2])
> return x
> end
>
> @inline function unroll_LU{T <: Number}(a::T ,b::T ,c::T , d::T ,e::T
> ,f::T)
> if a == 0 && d == 0
> throw(ArgumentError("singular matrix"))
> end
> if abs(a) >= abs(d)
> a⁻¹ = 1/a
> α = d * a⁻¹
> β = e - b * α
> β == 0 && throw(ArgumentError("singular matrix"))
> γ = f - c * α
> y = γ / β
> x = (c - b * y) * a⁻¹
> return Vec{2, T}(x, y)
> else
> unroll_LU(d,e,f, a,b,c)
> end
> end
>
>
> m = Mat{2,2, Float64}(rand(2,2))^C
>
> c = Vec{2, Float64}(rand(2))
>
>
>
> julia> @benchmark foo(m,c)
> ================ Benchmark Results ========================
> Time per evaluation: 13.60 ns [13.42 ns, 13.78 ns]
>
>
> julia> @benchmark foo(rand(2,2),rand(2))
> ================ Benchmark Results ========================
> Time per evaluation: 564.77 ns [548.25 ns, 581.28 ns]
>
>
>
> On Wednesday, November 18, 2015 at 11:53:59 AM UTC+1, Tim Holy wrote:
>>
>> If allocating the arrays is a big bottleneck, you might consider making
>> use
>> of/adding this to FixedSizeArrays.
>>
>> --Tim
>>
>> On Tuesday, November 17, 2015 05:12:13 PM Pavel wrote:
>> > Quite useful, thank you. Essentially choosing the form of exact
>> expression
>> > based on matrix element comparison. Appears to be reasonably stable and
>> > over 10 times speedup!
>> >
>> > On Tuesday, November 17, 2015 at 12:57:33 AM UTC-8, Kristoffer Carlsson
>> >
>> > wrote:
>> > > Maybe this link is of use? http://stackoverflow.com/a/10188318
>>
>>