diff --git a/benchmarks/LinearSolve/Manifest.toml b/benchmarks/LinearSolve/Manifest.toml index 471a76618..a61883ce7 100644 --- a/benchmarks/LinearSolve/Manifest.toml +++ b/benchmarks/LinearSolve/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.1" +julia_version = "1.9.2" manifest_format = "2.0" -project_hash = "f47fe8f87a8dd47ffa3fadb8dd62f222d498d440" +project_hash = "f34d6c06491ace514f6f9bc08e63c12bca59bee3" [[deps.ADTypes]] git-tree-sha1 = "f5c25e8a5b29b5e941b7408bc8cc79fea4d9ef9a" @@ -154,7 +154,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.2+0" +version = "1.0.5+0" [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] @@ -162,6 +162,12 @@ git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" version = "2.2.1" +[[deps.Conda]] +deps = ["Downloads", "JSON", "VersionParsing"] +git-tree-sha1 = "8c86e48c0db1564a1d49548d3515ced5d604c408" +uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" +version = "1.9.1" + [[deps.ConstructionBase]] deps = ["LinearAlgebra"] git-tree-sha1 = "fe2838a593b5f776e1597e086dcd47560d94e816" @@ -346,6 +352,18 @@ git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" version = "0.21.0+0" +[[deps.Git]] +deps = ["Git_jll"] +git-tree-sha1 = "51764e6c2e84c37055e846c516e9015b4a291c7d" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.3.0" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "d8be4aab0f4e043cc40984e9097417307cce4c03" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.36.1+2" + [[deps.Glib_jll]] deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" @@ -375,12 +393,24 @@ git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" version = "2.8.1+1" +[[deps.Highlights]] +deps = ["DocStringExtensions", "InteractiveUtils", "REPL"] +git-tree-sha1 = "0341077e8a6b9fc1c2ea5edc1e93a956d2aec0c7" +uuid = "eafb193a-b7ab-5a9e-9068-77385905fa72" +version = "0.5.2" + [[deps.HostCPUFeatures]] deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] git-tree-sha1 = "d38bd0d9759e3c6cfa19bdccc314eccf8ce596cc" uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" version = "0.1.15" +[[deps.IJulia]] +deps = ["Base64", "Conda", "Dates", "InteractiveUtils", "JSON", "Libdl", "Logging", "Markdown", "MbedTLS", "Pkg", "Printf", "REPL", "Random", "SoftGlobalScope", "Test", "UUIDs", "ZMQ"] +git-tree-sha1 = "47ac8cc196b81001a711f4b2c12c97372338f00c" +uuid = "7073ff75-c697-5162-941a-fcdaad2a7d2a" +version = "1.24.2" + [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" @@ -687,6 +717,12 @@ uuid = "a63ad114-7e13-5084-954f-fe012c677804" uuid = "14a3606d-f60d-562e-9121-12d972cd8159" version = "2022.10.11" +[[deps.Mustache]] +deps = ["Printf", "Tables"] +git-tree-sha1 = "821e918c170ead5298ff84bffee41dd28929a681" +uuid = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70" +version = "1.0.17" + [[deps.NaNMath]] deps = ["OpenLibm_jll"] git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" @@ -747,6 +783,12 @@ deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" version = "10.42.0+0" +[[deps.Pardiso]] +deps = ["Libdl", "LinearAlgebra", "MKL_jll", "SparseArrays"] +git-tree-sha1 = "8dbcb7c3c8066167825338732450db0ed1f2cad0" +uuid = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" +version = "0.5.0" + [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" @@ -767,7 +809,7 @@ version = "0.42.2+0" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.9.0" +version = "1.9.2" [[deps.PlotThemes]] deps = ["PlotUtils", "Statistics"] @@ -925,6 +967,12 @@ git-tree-sha1 = "04370090604cd399db5bebddb636d80ab9d338e9" uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" version = "1.94.0" +[[deps.SciMLBenchmarks]] +deps = ["Git", "IJulia", "InteractiveUtils", "Markdown", "Pkg", "Weave"] +git-tree-sha1 = "f4076dd5a103010d48bb6c4e50c5526f6622fa96" +uuid = "31c91b34-3c75-11e9-0341-95557aab0344" +version = "0.1.3" + [[deps.SciMLOperators]] deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] git-tree-sha1 = "65c2e6ced6f62ea796af251eb292a0e131a3613b" @@ -966,6 +1014,12 @@ version = "1.0.3" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +[[deps.SoftGlobalScope]] +deps = ["REPL"] +git-tree-sha1 = "986ec2b6162ccb95de5892ed17832f95badf770c" +uuid = "b85f4697-e234-5449-a836-ec8e2f98b302" +version = "1.1.0" + [[deps.SortingAlgorithms]] deps = ["DataStructures"] git-tree-sha1 = "c60ec5c62180f27efea3ba2908480f8055e17cee" @@ -1030,6 +1084,12 @@ git-tree-sha1 = "f02eb61eb5c97b48c153861c72fbbfdddc607e06" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" version = "0.4.17" +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" @@ -1160,6 +1220,11 @@ git-tree-sha1 = "b182207d4af54ac64cbc71797765068fdeff475d" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" version = "0.21.64" +[[deps.VersionParsing]] +git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" +uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" +version = "1.3.0" + [[deps.Wayland_jll]] deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" @@ -1172,6 +1237,12 @@ git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" version = "1.25.0+0" +[[deps.Weave]] +deps = ["Base64", "Dates", "Highlights", "JSON", "Markdown", "Mustache", "Pkg", "Printf", "REPL", "RelocatableFolders", "Requires", "Serialization", "YAML"] +git-tree-sha1 = "092217eb5443926d200ae9325f103906efbb68b1" +uuid = "44d3d7a6-8a23-5bf8-98c5-b353f8df5ec9" +version = "0.10.12" + [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] git-tree-sha1 = "93c41695bc1c08c46c5899f4fe06d6ead504bb73" @@ -1316,6 +1387,24 @@ git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" version = "1.5.0+0" +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "e6330e4b731a6af7959673621e91645eb1356884" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.9" + +[[deps.ZMQ]] +deps = ["FileWatching", "Sockets", "ZeroMQ_jll"] +git-tree-sha1 = "356d2bdcc0bce90aabee1d1c0f6d6f301eda8f77" +uuid = "c2297ded-f4af-51ae-bb23-16f91089e4e1" +version = "1.2.2" + +[[deps.ZeroMQ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "libsodium_jll"] +git-tree-sha1 = "fe5c65a526f066fb3000da137d5785d9649a8a47" +uuid = "8f1865be-045e-5c20-9c9f-bfbfb0764568" +version = "4.3.4+0" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" @@ -1362,6 +1451,12 @@ git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" version = "1.6.38+0" +[[deps.libsodium_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e" +uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8" +version = "1.0.20+0" + [[deps.libvorbis_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" diff --git a/benchmarks/LinearSolve/Project.toml b/benchmarks/LinearSolve/Project.toml index 3be43168b..f29437336 100644 --- a/benchmarks/LinearSolve/Project.toml +++ b/benchmarks/LinearSolve/Project.toml @@ -3,12 +3,17 @@ BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" MKL_jll = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" +Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +SciMLBenchmarks = "31c91b34-3c75-11e9-0341-95557aab0344" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" VectorizationBase = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" [compat] -Plots = "1" BenchmarkTools = "1" LinearSolve = "2.5" +Plots = "1" VectorizationBase = "0.21" diff --git a/benchmarks/LinearSolve/SparsePDE.jmd b/benchmarks/LinearSolve/SparsePDE.jmd new file mode 100644 index 000000000..a9e67b1f6 --- /dev/null +++ b/benchmarks/LinearSolve/SparsePDE.jmd @@ -0,0 +1,108 @@ +--- +title: Finite Difference Sparse PDE Jacobian Factorization Benchmarks +author: Jürgen Fuhrmann +--- + +```julia +using BenchmarkTools, Random, VectorizationBase +using LinearAlgebra, SparseArrays, LinearSolve, Sparspak +import Pardiso +using Plots + +BenchmarkTools.DEFAULT_PARAMETERS.seconds = 0.5 + +# Why do I need to set this ? +BenchmarkTools.DEFAULT_PARAMETERS.samples = 10 + +# Sparse matrix generation on a n-dimensional rectangular grid. After +# https://discourse.julialang.org/t/seven-lines-of-julia-examples-sought/50416/135 +# by A. Braunstein. + +A ⊕ B = kron(I(size(B, 1)), A) + kron(B, I(size(A, 1))) + +function lattice(n; Tv = Float64) + d = fill(2 * one(Tv), n) + d[1] = one(Tv) + d[end] = one(Tv) + spdiagm(1 => -ones(Tv, n - 1), 0 => d, -1 => -ones(Tv, n - 1)) +end + +lattice(L...; Tv = Float64) = lattice(L[1]; Tv) ⊕ lattice(L[2:end]...; Tv) + +# +# Create a matrix similar to that of a finite difference discretization in a `dim`-dimensional +# unit cube of ``-Δu + δu`` with approximately N unknowns. It is strictly diagonally dominant. +# +function fdmatrix(N; dim = 2, Tv = Float64, δ = 1.0e-2) + n = N^(1 / dim) |> ceil |> Int + lattice([n for i in 1:dim]...; Tv) + Tv(δ) * I +end + +algs = [ + UMFPACKFactorization(), + KLUFactorization(), + SparspakFactorization(), +] +cols = [:red, :blue, :green, :magenta, :turqoise] # one color per alg + +__parameterless_type(T) = Base.typename(T).wrapper +parameterless_type(x) = __parameterless_type(typeof(x)) +parameterless_type(::Type{T}) where {T} = __parameterless_type(T) + +# +# kmax=12 gives ≈ 40_000 unknowns max, can be watched in real time +# kmax=15 gives ≈ 328_000 unknows, you can go make a coffee. +# Main culprit is KLU factorization in 3D. +# +function run_and_plot(dim; kmax = 12) + ns = [10 * 2^k for k in 0:kmax] + + res = [Float64[] for i in 1:length(algs)] + + for i in 1:length(ns) + rng = MersenneTwister(123) + A = fdmatrix(ns[i]; dim) + n = size(A, 1) + @info "dim=$(dim): $n × $n" + b = rand(rng, n) + u0 = rand(rng, n) + + for j in 1:length(algs) + bt = @belapsed solve(prob, $(algs[j])).u setup=(prob = LinearProblem(copy($A), + copy($b); + u0 = copy($u0), + alias_A = true, + alias_b = true)) + push!(res[j], bt) + end + end + + p = plot(; + ylabel = "Time/s", + xlabel = "N", + yscale = :log10, + xscale = :log10, + title = "Time for NxN sparse LU Factorization $(dim)D", + label = string(Symbol(parameterless_type(algs[1]))), + legend = :outertopright) + + for i in 1:length(algs) + plot!(p, ns, res[i]; + linecolor = cols[i], + label = "$(string(Symbol(parameterless_type(algs[i]))))") + end + p +end +``` + +```julia +run_and_plot(1) +``` + +```julia +run_and_plot(2) +``` + +```julia +run_and_plot(3) +``` \ No newline at end of file