Single-Instruction multiple data
Before we are going to specifically parallelize code we talk about an inbuilt mechanism called Single-instruction, multiple data or SIMD for short. The main idea is that, central processing units (CPUs) or basically any arithmetic logic unit (ALU) can perform the same operation on multiple inputs in a single clock cycle. This was already used for BLAS and LAPACK packages, with the so called unrolling.
Let us consider the following example
which should look pretty familiar from the basic vector addition . As mentioned, modern processors have vector units that can deal with this kind of operation at once, basically:
or visualized as:
Even if you do not see it right away, we can modify our sum over a vector, and learn how Julia is including the SIMD concept and why it is most of the time better to call library functions than programming them on your own. As we already know how to do benchmarking, let us try to figure out if our sum function is doing a good job.
using BenchmarkTools
function mysum(a)
result = zero(eltype(a))
for i in eachindex(a)
@inbounds result += a[i]
end
return result
end
a = rand(100_000)
println("\nSimple sum:")
@btime mysum($a)
println("\nBuilt-in sum:")
@btime sum($a)
Simple sum:
76.961 μs (0 allocations: 0 bytes)
Built-in sum:
22.395 μs (0 allocations: 0 bytes)
49996.475917028365
As we can see, we are slower, exactly how much slower depends on the architecture of your CPU but it is usually between 2 to 16 times.
In order to enable SIMD in a program (if it is not done by library calls anyway), we can use the @simd
macro, this works if we loop over the indices or the elements, Julia is quite flexible there.
function mysimdsum(a)
result = zero(eltype(a))
@simd for i in eachindex(a)
@inbounds result += a[i]
end
return result
end
function mysum2(V)
s = zero(eltype(V))
for v in V
s += v
end
return s
end
function mysimdsum2(V)
s = zero(eltype(V))
@simd for v in V
s += v
end
return s
end
println("\nSimple mysum(a) = ", mysum(a))
@btime mysum($a)
println("\nBuilt-in sum(a) = ", sum(a))
@btime sum($a)
println("\nSimple mysimdsum = ", mysimdsum(a))
@btime mysimdsum($a)
println("\nSimple mysum2 = ", mysum2(a))
@btime mysum2($a)
println("\nSimple mysimdsum2 = ", mysimdsum2(a))
@btime mysimdsum2($a)
Simple mysum(a) = 49996.475917028474
76.963 μs (0 allocations: 0 bytes)
Built-in sum(a) = 49996.475917028365
22.370 μs (0 allocations: 0 bytes)
Simple mysimdsum = 49996.47591702835
21.373 μs (0 allocations: 0 bytes)
Simple mysum2 = 49996.475917028474
76.960 μs (0 allocations: 0 bytes)
Simple mysimdsum2 = 49996.47591702835
21.363 μs (0 allocations: 0 bytes)
49996.47591702835
We can see a massive speed up (that will depend on the CPU architecture you are running your code on). What is interesting is, that the results of the three function calls are not the same.
This is due to the fact that the numerics involved are a bit tricky. In short, when adding floating point numbers you lose accuracy when adding a large number to a small number. This is exactly what is happening for our first example as we add all the numbers in one long sequence.
The built-in sum
function as well as the @simd
macro allow Julia to change the order of the operations. In this specific case, it boils down to computing the result for the even and odd entries separately and therefore gaining a bit of accuracy.
If you are not sure if something is vectorized, you can check out the LLVM code for the two versions and see the difference (Hint: look out for something called vector.ph
).
using InteractiveUtils
@code_llvm mysum(a)
printstyled("\n------Separator-------\n\n"; color = :red)
@code_llvm mysimdsum(a)
; @ none:2 within `mysum`
define double @julia_mysum_3167({}* nonnull align 16 dereferenceable(40) %0) #0 {
top:
; @ none:5 within `mysum`
; ┌ @ abstractarray.jl:279 within `eachindex`
; │┌ @ abstractarray.jl:116 within `axes1`
; ││┌ @ abstractarray.jl:95 within `axes`
; │││┌ @ array.jl:151 within `size`
%1 = bitcast {}* %0 to {}**
%2 = getelementptr inbounds {}*, {}** %1, i64 3
%3 = bitcast {}** %2 to i64*
%4 = load i64, i64* %3, align 8
; └└└└
; ┌ @ range.jl:833 within `iterate`
; │┌ @ range.jl:609 within `isempty`
; ││┌ @ operators.jl:378 within `>`
; │││┌ @ int.jl:83 within `<`
%.not.not = icmp eq i64 %4, 0
; └└└└
br i1 %.not.not, label %L31, label %L14.preheader
L14.preheader: ; preds = %top
%5 = bitcast {}* %0 to double**
%6 = load double*, double** %5, align 8
; @ none:6 within `mysum`
br label %L14
L14: ; preds = %L14, %L14.preheader
%value_phi3 = phi i64 [ %11, %L14 ], [ 1, %L14.preheader ]
%value_phi5 = phi double [ %10, %L14 ], [ 0.000000e+00, %L14.preheader ]
; ┌ @ array.jl:861 within `getindex`
%7 = add nsw i64 %value_phi3, -1
%8 = getelementptr inbounds double, double* %6, i64 %7
%9 = load double, double* %8, align 8
; └
; ┌ @ float.jl:399 within `+`
%10 = fadd double %value_phi5, %9
; └
; ┌ @ range.jl:837 within `iterate`
; │┌ @ promotion.jl:468 within `==`
%.not = icmp eq i64 %value_phi3, %4
; │└
%11 = add nuw nsw i64 %value_phi3, 1
; └
br i1 %.not, label %L31, label %L14
L31: ; preds = %L14, %top
%value_phi9 = phi double [ 0.000000e+00, %top ], [ %10, %L14 ]
; @ none:9 within `mysum`
ret double %value_phi9
}
------Separator-------
; @ none:1 within `mysimdsum`
define double @julia_mysimdsum_3182({}* nonnull align 16 dereferenceable(40) %0) #0 {
top:
; @ none:4 within `mysimdsum`
; ┌ @ simdloop.jl:69 within `macro expansion`
; │┌ @ abstractarray.jl:279 within `eachindex`
; ││┌ @ abstractarray.jl:116 within `axes1`
; │││┌ @ abstractarray.jl:95 within `axes`
; ││││┌ @ array.jl:151 within `size`
%1 = bitcast {}* %0 to {}**
%2 = getelementptr inbounds {}*, {}** %1, i64 3
%3 = bitcast {}** %2 to i64*
%4 = load i64, i64* %3, align 8
; └└└└└
; ┌ @ simdloop.jl:72 within `macro expansion`
; │┌ @ int.jl:83 within `<`
%.not = icmp eq i64 %4, 0
; │└
br i1 %.not, label %L30, label %L13.lr.ph
L13.lr.ph: ; preds = %top
%5 = bitcast {}* %0 to double**
%6 = load double*, double** %5, align 8
; └
; ┌ @ simdloop.jl:75 within `macro expansion`
%min.iters.check = icmp ult i64 %4, 16
br i1 %min.iters.check, label %L13, label %vector.ph
vector.ph: ; preds = %L13.lr.ph
%n.vec = and i64 %4, 9223372036854775792
br label %vector.body
vector.body: ; preds = %vector.body, %vector.ph
; └
; ┌ @ simdloop.jl:78 within `macro expansion`
; │┌ @ int.jl:87 within `+`
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
%vec.phi = phi <4 x double> [ zeroinitializer, %vector.ph ], [ %15, %vector.body ]
%vec.phi9 = phi <4 x double> [ zeroinitializer, %vector.ph ], [ %16, %vector.body ]
%vec.phi10 = phi <4 x double> [ zeroinitializer, %vector.ph ], [ %17, %vector.body ]
%vec.phi11 = phi <4 x double> [ zeroinitializer, %vector.ph ], [ %18, %vector.body ]
; └└
; ┌ @ simdloop.jl:77 within `macro expansion` @ none:5
; │┌ @ array.jl:861 within `getindex`
%7 = getelementptr inbounds double, double* %6, i64 %index
%8 = bitcast double* %7 to <4 x double>*
%wide.load = load <4 x double>, <4 x double>* %8, align 8
%9 = getelementptr inbounds double, double* %7, i64 4
%10 = bitcast double* %9 to <4 x double>*
%wide.load12 = load <4 x double>, <4 x double>* %10, align 8
%11 = getelementptr inbounds double, double* %7, i64 8
%12 = bitcast double* %11 to <4 x double>*
%wide.load13 = load <4 x double>, <4 x double>* %12, align 8
%13 = getelementptr inbounds double, double* %7, i64 12
%14 = bitcast double* %13 to <4 x double>*
%wide.load14 = load <4 x double>, <4 x double>* %14, align 8
; │└
; │┌ @ float.jl:399 within `+`
%15 = fadd fast <4 x double> %vec.phi, %wide.load
%16 = fadd fast <4 x double> %vec.phi9, %wide.load12
%17 = fadd fast <4 x double> %vec.phi10, %wide.load13
%18 = fadd fast <4 x double> %vec.phi11, %wide.load14
; └└
; ┌ @ simdloop.jl:78 within `macro expansion`
; │┌ @ int.jl:87 within `+`
%index.next = add i64 %index, 16
%19 = icmp eq i64 %index.next, %n.vec
br i1 %19, label %middle.block, label %vector.body
middle.block: ; preds = %vector.body
; └└
; ┌ @ simdloop.jl:75 within `macro expansion`
%bin.rdx = fadd fast <4 x double> %16, %15
%bin.rdx15 = fadd fast <4 x double> %17, %bin.rdx
%bin.rdx16 = fadd fast <4 x double> %18, %bin.rdx15
%20 = call fast double @llvm.vector.reduce.fadd.v4f64(double -0.000000e+00, <4 x double> %bin.rdx16)
%cmp.n = icmp eq i64 %4, %n.vec
br i1 %cmp.n, label %L30, label %L13
L13: ; preds = %L13, %middle.block, %L13.lr.ph
%value_phi18 = phi i64 [ %24, %L13 ], [ %n.vec, %middle.block ], [ 0, %L13.lr.ph ]
%value_phi7 = phi double [ %23, %L13 ], [ %20, %middle.block ], [ 0.000000e+00, %L13.lr.ph ]
; └
; ┌ @ simdloop.jl:77 within `macro expansion` @ none:5
; │┌ @ array.jl:861 within `getindex`
%21 = getelementptr inbounds double, double* %6, i64 %value_phi18
%22 = load double, double* %21, align 8
; │└
; │┌ @ float.jl:399 within `+`
%23 = fadd fast double %value_phi7, %22
; └└
; ┌ @ simdloop.jl:78 within `macro expansion`
; │┌ @ int.jl:87 within `+`
%24 = add nuw nsw i64 %value_phi18, 1
; └└
; ┌ @ simdloop.jl:75 within `macro expansion`
; │┌ @ int.jl:83 within `<`
%exitcond.not = icmp eq i64 %24, %4
; │└
br i1 %exitcond.not, label %L30, label %L13
L30: ; preds = %L13, %middle.block, %top
%value_phi2 = phi double [ 0.000000e+00, %top ], [ %20, %middle.block ], [ %23, %L13 ]
; └
; @ none:8 within `mysimdsum`
ret double %value_phi2
}
The LLVM project is the compiler toolchain technology that Julia uses for its Just in Time (JIT) compilation. Basically, it translates the Julia code into a machine language close to Assembler (but quite readable, if you get used to it) and this is compiled when needed. We could see JIT doing its magic in the beginning of the Benchmark section, as the function mysum
was compiled on its first run. Note: in general packages get precompiled before they are used to gain performance.
Multiple dispatch
While on the subject of performance and the JIT compilation it is time to recall the multiple dispatch capabilities of Julia.
Like most of the time, this concept is best explained by showing an example. In our, now already famous, sum example we never specified what type the argument has. As long as one was able to loop over it and add the entries it was fine. That does not mean Julia never cared. In fact, we can take a look what Julia does for different input types.
For this we use another macro from the InteractiveUtils
package, namely @code_typed
. Again, we get some intermediate code that Julia produces for us. This time a bit more compact but most important, all the type information of the input argument attached to it.
For an array of Int64
we get:
@code_typed optimize=false mysum([1, 2, 3])
CodeInfo(
1 ─ %1 = eltype(a)::Core.Const(Int64)
│ (result = zero(%1))::Core.Const(0)
│ %3 = eachindex(a)::Base.OneTo{Int64}
│ (@_3 = Base.iterate(%3))::Union{Nothing, Tuple{Int64, Int64}}
│ %5 = (@_3 === nothing)::Bool
│ %6 = Base.not_int(%5)::Bool
└── goto #4 if not %6
2 ┄ %8 = @_3::Tuple{Int64, Int64}
│ (i = Core.getfield(%8, 1))::Int64
│ %10 = Core.getfield(%8, 2)::Int64
│ $(Expr(:inbounds, true))::Any
│ %12 = result::Int64
│ %13 = Base.getindex(a, i)::Int64
│ %14 = (%12 + %13)::Int64
│ (result = %14)::Int64
│ (val = %14)::Int64
│ $(Expr(:inbounds, :pop))::Any
│ val::Int64
│ (@_3 = Base.iterate(%3, %10))::Union{Nothing, Tuple{Int64, Int64}}
│ %20 = (@_3 === nothing)::Bool
│ %21 = Base.not_int(%20)::Bool
└── goto #4 if not %21
3 ─ goto #2
4 ┄ return result
) => Int64
and for Float64
:
@code_typed optimize=false mysum([1.0, 2.0, 3.0])
CodeInfo(
1 ─ %1 = eltype(a)::Core.Const(Float64)
│ (result = zero(%1))::Core.Const(0.0)
│ %3 = eachindex(a)::Base.OneTo{Int64}
│ (@_3 = Base.iterate(%3))::Union{Nothing, Tuple{Int64, Int64}}
│ %5 = (@_3 === nothing)::Bool
│ %6 = Base.not_int(%5)::Bool
└── goto #4 if not %6
2 ┄ %8 = @_3::Tuple{Int64, Int64}
│ (i = Core.getfield(%8, 1))::Int64
│ %10 = Core.getfield(%8, 2)::Int64
│ $(Expr(:inbounds, true))::Any
│ %12 = result::Float64
│ %13 = Base.getindex(a, i)::Float64
│ %14 = (%12 + %13)::Float64
│ (result = %14)::Float64
│ (val = %14)::Float64
│ $(Expr(:inbounds, :pop))::Any
│ val::Float64
│ (@_3 = Base.iterate(%3, %10))::Union{Nothing, Tuple{Int64, Int64}}
│ %20 = (@_3 === nothing)::Bool
│ %21 = Base.not_int(%20)::Bool
└── goto #4 if not %21
3 ─ goto #2
4 ┄ return result
) => Float64
We can see, that in the first output everything is of type Int64
, including the result. The second output has the same instructions but with Float64
as type.
As we might have already seen throughout this workshop we can define the same function name for different input arguments. This is very obvious for the basic math operators but it is true for every function. Let us have a look at the +
operator:
methods(+)
# 208 methods for generic function "+":
[1] +(x::T, y::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} in Base at int.jl:87
[2] +(c::Union{UInt16, UInt32, UInt64, UInt8}, x::BigInt) in Base.GMP at gmp.jl:529
[3] +(c::Union{Int16, Int32, Int64, Int8}, x::BigInt) in Base.GMP at gmp.jl:535
[4] +(c::Union{UInt16, UInt32, UInt64, UInt8}, x::BigFloat) in Base.MPFR at mpfr.jl:397
[5] +(c::Union{Int16, Int32, Int64, Int8}, x::BigFloat) in Base.MPFR at mpfr.jl:405
[6] +(c::Union{Float16, Float32, Float64}, x::BigFloat) in Base.MPFR at mpfr.jl:413
[7] +(x::Union{Dates.CompoundPeriod, Dates.Period}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:372
[8] +(F::LinearAlgebra.Hessenberg, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:640
[9] +(x::Dates.Instant) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:4
[10] +(A::SparseArrays.AbstractSparseMatrixCSC, B::SparseArrays.AbstractSparseMatrixCSC) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/sparsematrix.jl:1771
[11] +(A::SparseArrays.AbstractSparseMatrixCSC, B::Array) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/sparsematrix.jl:1774
[12] +(A::SparseArrays.AbstractSparseMatrixCSC, J::LinearAlgebra.UniformScaling) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/sparsematrix.jl:3754
[13] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:641
[14] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:643
[15] +(UL::LinearAlgebra.UnitLowerTriangular, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:182
[16] +(A::LinearAlgebra.UnitLowerTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:86
[17] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:636
[18] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:638
[19] +(x::LinearAlgebra.UpperTriangular, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[20] +(A::LinearAlgebra.UpperTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:86
[21] +(z::Complex, w::Complex) in Base at complex.jl:288
[22] +(A::BitArray, B::BitArray) in Base at bitarray.jl:1180
[23] +(r1::StepRangeLen{T, R}, r2::StepRangeLen{T, R}) where {R<:Base.TwicePrecision, T} in Base at twiceprecision.jl:613
[24] +(r1::StepRangeLen{T, S}, r2::StepRangeLen{T, S}) where {T, S} in Base at range.jl:1370
[25] +(r1::LinRange{T}, r2::LinRange{T}) where T in Base at range.jl:1354
[26] +(x::T, y::Integer) where T<:AbstractChar in Base at char.jl:237
[27] +(index1::CartesianIndex{N}, index2::CartesianIndex{N}) where N in Base.IteratorsMD at multidimensional.jl:114
[28] +(J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:150
[29] +(J::LinearAlgebra.UniformScaling, x::Number) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:145
[30] +(J1::LinearAlgebra.UniformScaling, J2::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:151
[31] +(J::LinearAlgebra.UniformScaling, B::BitMatrix) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:153
[32] +(x::LinearAlgebra.UniformScaling, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[33] +(J::LinearAlgebra.UniformScaling, F::LinearAlgebra.Hessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:641
[34] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Tridiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:245
[35] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.SymTridiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:250
[36] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Bidiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:255
[37] +(A::LinearAlgebra.UniformScaling, B::LinearAlgebra.Diagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:260
[38] +(J::LinearAlgebra.UniformScaling, A::AbstractMatrix) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:154
[39] +(Da::LinearAlgebra.Diagonal, Db::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/diagonal.jl:172
[40] +(D::LinearAlgebra.Diagonal, S::LinearAlgebra.Symmetric) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/diagonal.jl:176
[41] +(D::LinearAlgebra.Diagonal{var"#s861", V} where {var"#s861"<:Real, V<:AbstractVector{var"#s861"}}, H::LinearAlgebra.Hermitian) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/diagonal.jl:182
[42] +(x::LinearAlgebra.Diagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[43] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:125
[44] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:135
[45] +(A::LinearAlgebra.Diagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:163
[46] +(A::LinearAlgebra.Diagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:241
[47] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:640
[48] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:642
[49] +(UL::LinearAlgebra.UnitUpperTriangular, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:182
[50] +(x::LinearAlgebra.UnitUpperTriangular, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[51] +(A::LinearAlgebra.UnitUpperTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:86
[52] +(y::AbstractFloat, x::Bool) in Base at bool.jl:172
[53] +(A::LinearAlgebra.UpperHessenberg, B::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:99
[54] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[55] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[56] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[57] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.Tridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[58] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[59] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[60] +(H::LinearAlgebra.UpperHessenberg, x::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:106
[61] +(x::Rational, y::Integer) in Base at rational.jl:311
[62] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/tridiag.jl:740
[63] +(x::LinearAlgebra.Tridiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[64] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:157
[65] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:173
[66] +(A::LinearAlgebra.Tridiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:193
[67] +(A::LinearAlgebra.Tridiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:226
[68] +(r::AbstractRange{<:Dates.TimeType}, x::Dates.Period) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/ranges.jl:63
[69] +(x::AbstractArray{<:Dates.TimeType}, y::Union{Dates.CompoundPeriod, Dates.Period}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:6
[70] +(x::Base.TwicePrecision, y::Number) in Base at twiceprecision.jl:279
[71] +(x::Base.TwicePrecision{T}, y::Base.TwicePrecision{T}) where T in Base at twiceprecision.jl:285
[72] +(x::Base.TwicePrecision, y::Base.TwicePrecision) in Base at twiceprecision.jl:290
[73] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/tridiag.jl:208
[74] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Symmetric) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:485
[75] +(A::LinearAlgebra.SymTridiagonal{var"#s859", V} where {var"#s859"<:Real, V<:AbstractVector{var"#s859"}}, B::LinearAlgebra.Hermitian) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:487
[76] +(x::LinearAlgebra.SymTridiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[77] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:145
[78] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:159
[79] +(A::LinearAlgebra.SymTridiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:213
[80] +(A::LinearAlgebra.SymTridiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:231
[81] +(x::AbstractIrrational, y::AbstractIrrational) in Base at irrationals.jl:158
[82] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:637
[83] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:639
[84] +(A::LinearAlgebra.LowerTriangular, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:86
[85] +(A::LinearAlgebra.Symmetric, B::LinearAlgebra.Symmetric) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:469
[86] +(A::LinearAlgebra.Symmetric, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:486
[87] +(S::LinearAlgebra.Symmetric, D::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/diagonal.jl:179
[88] +(A::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:15
[89] +(A::LinearAlgebra.Symmetric, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:18
[90] +(A::LinearAlgebra.Symmetric{<:Real, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:25
[91] +(A::LinearAlgebra.Symmetric{var"#s860", S} where {var"#s860"<:Real, S<:(AbstractMatrix{<:var"#s860"})}, B::LinearAlgebra.Hermitian) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:484
[92] +(A::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:23
[93] +(x::SparseArrays.AbstractSparseVector, y::SparseArrays.AbstractSparseVector) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/sparsevector.jl:1355
[94] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:14
[95] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Hermitian) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:17
[96] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:14
[97] +(A::SparseArrays.AbstractSparseMatrix, B::LinearAlgebra.Symmetric) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:17
[98] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.Hermitian) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:469
[99] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.SymTridiagonal{var"#s858", V} where {var"#s858"<:Real, V<:AbstractVector{var"#s858"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:488
[100] +(H::LinearAlgebra.Hermitian, D::LinearAlgebra.Diagonal{var"#s861", V} where {var"#s861"<:Real, V<:AbstractVector{var"#s861"}}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/diagonal.jl:185
[101] +(A::LinearAlgebra.Hermitian, J::LinearAlgebra.UniformScaling{<:Complex}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:196
[102] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:15
[103] +(A::LinearAlgebra.Hermitian, B::SparseArrays.AbstractSparseMatrix) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:18
[104] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Symmetric{<:Real, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:26
[105] +(A::LinearAlgebra.Hermitian, B::LinearAlgebra.Symmetric{var"#s861", S} where {var"#s861"<:Real, S<:(AbstractMatrix{<:var"#s861"})}) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/symmetric.jl:483
[106] +(A::LinearAlgebra.Hermitian{<:Any, <:SparseArrays.AbstractSparseMatrix}, B::LinearAlgebra.Symmetric{<:Any, <:SparseArrays.AbstractSparseMatrix}) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/linalg.jl:24
[107] +(y::Dates.TimeType, x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:18
[108] +(x::Ptr, y::Integer) in Base at pointer.jl:159
[109] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Bidiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/bidiag.jl:354
[110] +(x::LinearAlgebra.Bidiagonal, H::LinearAlgebra.UpperHessenberg) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/hessenberg.jl:107
[111] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:94
[112] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UnitUpperTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:94
[113] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.LowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:94
[114] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.UnitLowerTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:94
[115] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Diagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:115
[116] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.Tridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:183
[117] +(A::LinearAlgebra.Bidiagonal, B::LinearAlgebra.SymTridiagonal) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:203
[118] +(A::LinearAlgebra.Bidiagonal{var"#s861", V} where {var"#s861"<:Number, V<:AbstractVector{var"#s861"}}, B::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/special.jl:236
[119] +(A::LinearAlgebra.AbstractTriangular, B::LinearAlgebra.AbstractTriangular) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/triangular.jl:644
[120] +(r1::OrdinalRange, r2::OrdinalRange) in Base at range.jl:1347
[121] +(r1::Union{LinRange, OrdinalRange, StepRangeLen}, r2::Union{LinRange, OrdinalRange, StepRangeLen}) in Base at range.jl:1363
[122] +(x::P, y::P) where P<:Dates.Period in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:79
[123] +(x::Dates.Period, y::Dates.Period) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:361
[124] +(y::Dates.Period, x::Dates.CompoundPeriod) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:363
[125] +(y::Dates.Period, x::Dates.TimeType) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:85
[126] +(x::Dates.Period, r::AbstractRange{<:Dates.TimeType}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/ranges.jl:62
[127] +(y::Union{Dates.CompoundPeriod, Dates.Period}, x::AbstractArray{<:Dates.TimeType}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:14
[128] +(A::Array, Bs::Array...) in Base at arraymath.jl:43
[129] +(X::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}, Y::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:62
[130] +(A::Array, B::SparseArrays.AbstractSparseMatrixCSC) in SparseArrays at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/SparseArrays/src/sparsematrix.jl:1775
[131] +(x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:55
[132] +(x::StridedArray{<:Union{Dates.CompoundPeriod, Dates.Period}}, y::Dates.TimeType) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/deprecated.jl:10
[133] +(A::AbstractArray, B::AbstractArray) in Base at arraymath.jl:37
[134] +(a::Pkg.Resolve.VersionWeight, b::Pkg.Resolve.VersionWeight) in Pkg.Resolve at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Pkg/src/Resolve/versionweights.jl:22
[135] +(x::Dates.CompoundPeriod, y::Dates.Period) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:362
[136] +(x::Dates.CompoundPeriod, y::Dates.TimeType) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:392
[137] +(x::Dates.CompoundPeriod, y::Dates.CompoundPeriod) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:364
[138] +(x::BigFloat, c::Union{UInt16, UInt32, UInt64, UInt8}) in Base.MPFR at mpfr.jl:392
[139] +(x::BigFloat, c::Union{Int16, Int32, Int64, Int8}) in Base.MPFR at mpfr.jl:400
[140] +(x::BigFloat, c::Union{Float16, Float32, Float64}) in Base.MPFR at mpfr.jl:408
[141] +(x::BigFloat, y::BigFloat) in Base.MPFR at mpfr.jl:385
[142] +(x::BigFloat, c::BigInt) in Base.MPFR at mpfr.jl:416
[143] +(a::BigFloat, b::BigFloat, c::BigFloat) in Base.MPFR at mpfr.jl:557
[144] +(a::BigFloat, b::BigFloat, c::BigFloat, d::BigFloat) in Base.MPFR at mpfr.jl:563
[145] +(a::BigFloat, b::BigFloat, c::BigFloat, d::BigFloat, e::BigFloat) in Base.MPFR at mpfr.jl:570
[146] +(::Missing) in Base at missing.jl:101
[147] +(::Missing, ::Number) in Base at missing.jl:123
[148] +(x::Missing, y::Dates.AbstractTime) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:89
[149] +(::Missing, ::Missing) in Base at missing.jl:122
[150] +(x::Bool) in Base at bool.jl:159
[151] +(x::Integer, y::Ptr) in Base at pointer.jl:161
[152] +(y::Integer, x::Rational) in Base at rational.jl:318
[153] +(x::Integer, y::AbstractChar) in Base at char.jl:247
[154] +(x::Bool, y::T) where T<:AbstractFloat in Base at bool.jl:169
[155] +(x::Bool, y::Bool) in Base at bool.jl:162
[156] +(x::Bool, z::Complex{Bool}) in Base at complex.jl:299
[157] +(x::Real, z::Complex{Bool}) in Base at complex.jl:313
[158] +(x::Bool, z::Complex) in Base at complex.jl:306
[159] +(x::Real, z::Complex) in Base at complex.jl:325
[160] +(level::Base.CoreLogging.LogLevel, inc::Integer) in Base.CoreLogging at logging.jl:131
[161] +(z::Complex{Bool}, x::Bool) in Base at complex.jl:300
[162] +(z::Complex, x::Bool) in Base at complex.jl:307
[163] +(z::Complex{Bool}, x::Real) in Base at complex.jl:314
[164] +(z::Complex) in Base at complex.jl:286
[165] +(z::Complex, x::Real) in Base at complex.jl:326
[166] +(x::Float64, y::Float64) in Base at float.jl:399
[167] +(x::Rational{BigInt}, y::Rational{BigInt}) in Base.GMP.MPQ at gmp.jl:885
[168] +(x::Rational) in Base at rational.jl:268
[169] +(x::Number, y::Base.TwicePrecision) in Base at twiceprecision.jl:283
[170] +(::Number, ::Missing) in Base at missing.jl:124
[171] +(x::Number, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:146
[172] +(x::Rational, y::Rational) in Base at rational.jl:282
[173] +(x::Float16, y::Float16) in Base at float.jl:397
[174] +(x::BigInt, c::Union{UInt16, UInt32, UInt64, UInt8}) in Base.GMP at gmp.jl:528
[175] +(x::BigInt, c::Union{Int16, Int32, Int64, Int8}) in Base.GMP at gmp.jl:534
[176] +(x::BigInt, y::BigInt) in Base.GMP at gmp.jl:480
[177] +(a::BigInt, b::BigInt, c::BigInt) in Base.GMP at gmp.jl:520
[178] +(a::BigInt, b::BigInt, c::BigInt, d::BigInt) in Base.GMP at gmp.jl:521
[179] +(a::BigInt, b::BigInt, c::BigInt, d::BigInt, e::BigInt) in Base.GMP at gmp.jl:522
[180] +(x::BigInt, y::BigInt, rest::BigInt...) in Base.GMP at gmp.jl:635
[181] +(a::Integer, b::Integer) in Base at int.jl:978
[182] +(c::BigInt, x::BigFloat) in Base.MPFR at mpfr.jl:421
[183] +(B::BitMatrix, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:152
[184] +(A::AbstractMatrix, J::LinearAlgebra.UniformScaling) in LinearAlgebra at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/LinearAlgebra/src/uniformscaling.jl:215
[185] +(x::AbstractArray{<:Number}) in Base at abstractarraymath.jl:104
[186] +(x::Float32, y::Float32) in Base at float.jl:398
[187] +(x::Number) in Base at operators.jl:592
[188] +(x::T, y::T) where T<:Number in Base at promotion.jl:454
[189] +(x::Number, y::Number) in Base at promotion.jl:379
[190] +(dt::Dates.Date, t::Dates.Time) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:19
[191] +(dt::Dates.Date, y::Dates.Year) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:27
[192] +(dt::Dates.Date, z::Dates.Month) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:54
[193] +(x::Dates.Date, y::Dates.Quarter) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:73
[194] +(x::Dates.Date, y::Dates.Week) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:77
[195] +(x::Dates.Date, y::Dates.Day) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:79
[196] +(x::Dates.Time, y::Dates.TimePeriod) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:83
[197] +(t::Dates.Time, dt::Dates.Date) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:20
[198] +(a::Pkg.Resolve.FieldValue, b::Pkg.Resolve.FieldValue) in Pkg.Resolve at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Pkg/src/Resolve/fieldvalues.jl:43
[199] +(dt::Dates.DateTime, y::Dates.Year) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:23
[200] +(dt::Dates.DateTime, z::Dates.Month) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:47
[201] +(x::Dates.DateTime, y::Dates.Quarter) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:75
[202] +(x::Dates.DateTime, y::Dates.Period) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:81
[203] +(x::Dates.TimeType) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:8
[204] +(x::Dates.AbstractTime, y::Missing) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/arithmetic.jl:88
[205] +(a::Dates.TimeType, b::Dates.Period, c::Dates.Period) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:383
[206] +(a::Dates.TimeType, b::Dates.Period, c::Dates.Period, d::Dates.Period...) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:384
[207] +(x::Dates.TimeType, y::Dates.CompoundPeriod) in Dates at /home/noxthot/.julia/juliaup/julia-1.7.3+0.x64/share/julia/stdlib/v1.7/Dates/src/periods.jl:386
[208] +(a, b, c, xs...) in Base at operators.jl:655
This shows us two things. First, we did not think anybody will print this workshop out or we would have gone for shorter outputs. Second, and more importantly, every time we call a function, Julia will look at the type of each argument and search for the function that fits best. As a result we can write optimized code for different types and in general this is one key stone in the excellent performance numbers of Julia.
Before we continue to the other parallel computation concepts, we introduce an example that will help us along, same as the sum did for the beginning of this section.