JuliaLang / julia

The Julia Programming Language
https://julialang.org/
MIT License
45.35k stars 5.46k forks source link

should matrix-vector mul! also protect against aliasing? #54540

Open daviehh opened 3 months ago

daviehh commented 3 months ago

As per the documentation for mul!,

https://github.com/JuliaLang/julia/blob/263928f9ad450a28d601c3f185040987e0bc45d5/stdlib/LinearAlgebra/src/matmul.jl#L266-L268

The mwe

a = rand(3, 3); v = rand(3);
mul!(a, a, a)

is 'protected' against wrong inputs for matrix-matrix product and errors w/

ERROR: ArgumentError: output matrix must not be aliased with input matrix

https://github.com/JuliaLang/julia/blob/263928f9ad450a28d601c3f185040987e0bc45d5/stdlib/LinearAlgebra/src/matmul.jl#L653-L655

however, the matrix-vector product a * v is not 'protected' against C == A || C == B

julia> mul!(v, a, v)
3-element Vector{Float64}:
 0.0
 0.0
 0.0

should a similar alias check be applied for matrix-vector mul! at the gemv! or generic_matvecmul! methods?

jishnub commented 3 months ago

I think it should, as it's a common footgun. Also, matrix-matrix multiplication doesn't protect against this either other than the 2x2 and 3x3 cases.

dkarrasch commented 3 months ago

... and in gemm_wrapper!. Maybe those aliasing tests got lost a bit over the recent rearrangements?