Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regression in LU factorization causing allocations #1261

Closed
ChrisRackauckas opened this issue Jun 13, 2024 · 2 comments
Closed

Regression in LU factorization causing allocations #1261

ChrisRackauckas opened this issue Jun 13, 2024 · 2 comments

Comments

@ChrisRackauckas
Copy link
Member

MWE:

using StaticArrays, LinearAlgebra, Test, StableRNGs
using AllocCheck

rng = StableRNG(0)

A = SMatrix{5, 5}(Hermitian(rand(rng, 5, 5) + I))
b = SVector{5}(rand(rng, 5))
@check_allocs __solve_no_alloc(A, b) = A\b

try
    __solve_no_alloc(A, b)
catch err
    (err.errors...,)
end
julia> try                                                                                                                                
           __solve_no_alloc(A, b)                                                                                                         
       catch err                                                                                                                          
           (err.errors...,)                                                                                                               
       end
(Allocating runtime call to "jl_get_pgcstack" in unknown location
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81
  | L, U, P = __lu(A, $(_pivot))

Stacktrace:
  [1] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [2] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [3] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [4] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [5] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [6] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [7] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
  [8] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
  [9] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [10] var"##__solve_no_alloc#235"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:12
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [3] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [4] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [5] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [6] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [7] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [8] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
  [9] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [10] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [11] var"##__solve_no_alloc#235"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:12
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{4, 4, Float64, 16}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [3] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [4] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [5] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [6] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [7] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [8] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [9] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
 [10] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [11] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [12] var"##__solve_no_alloc#235"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:12
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{3, 3, Float64, 9}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] __lu(A::SMatrix{4, 4, Float64, 16}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [3] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [4] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [5] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [6] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [7] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [8] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [9] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
 [10] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
 [11] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [12] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [13] var"##__solve_no_alloc#235"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:12
)
@ChrisRackauckas
Copy link
Member Author

@avik-pal this is the root of the master failures popping up on SimpleNonlinearSolve.jl as well

https://github.com/SciML/SciMLBase.jl/actions/runs/9481664666/job/26124923121#step:6:1004

But it seems to be odd because while I can reproduce the issue, I just found that it might be spurious:

julia> try
           __solve_no_alloc(A, b)
       catch err
           (err.errors...,)
       end
(Allocating runtime call to "jl_get_pgcstack" in unknown location
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81
  | L, U, P = __lu(A, $(_pivot))

Stacktrace:
  [1] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [2] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [3] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [4] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [5] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [6] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [7] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
  [8] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
  [9] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [10] var"##__solve_no_alloc#225"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:20
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [3] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [4] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [5] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [6] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [7] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [8] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
  [9] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [10] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [11] var"##__solve_no_alloc#225"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:20
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{4, 4, Float64, 16}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [3] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [4] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [5] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [6] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [7] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [8] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
  [9] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
 [10] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [11] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [12] var"##__solve_no_alloc#225"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:20
, Allocating runtime call to "jl_get_pgcstack" in C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  | Lrest, Urest, prest = __lu(Arest, Val(Pivot))

Stacktrace:
  [1] __lu(A::SMatrix{3, 3, Float64, 9}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [2] __lu(A::SMatrix{4, 4, Float64, 16}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [3] __lu(A::SMatrix{5, 5, Float64, 25}, ::Val{true})
    @ StaticArrays C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:189
  [4] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:81 [inlined]
  [5] _lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:73 [inlined]
  [6] #lu#495
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:50 [inlined]
  [7] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:49 [inlined]
  [8] lu
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\lu.jl:54 [inlined]
  [9] macro expansion
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:62 [inlined]
 [10] _solve_general
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:52 [inlined]
 [11] _solve
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:49 [inlined]
 [12] \
    @ C:\Users\accou\.julia\packages\StaticArrays\85pEu\src\solve.jl:1 [inlined]
 [13] var"##__solve_no_alloc#225"(A::SMatrix{5, 5, Float64, 25}, b::SVector{5, Float64})
    @ Main c:\Users\accou\OneDrive\Computer\Desktop\test.jl:20
)

julia> 

julia> @btime $A\$b
  86.639 ns (0 allocations: 0 bytes)
5-element SVector{5, Float64} with indices SOneTo(5):
 -0.30935229423056443
  0.07052238283605455
  0.04962709500876435
 -0.10340384952355772
  0.5303187520058518

Going to need to dig deeper to figure out if this is really StaticArrays.jl or AllocCheck.jl

@ChrisRackauckas
Copy link
Member Author

Turns out to be an AllocCheck.jl bug as jl_get_pgcstack should be whitelisted as not as allocation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant