{"id":32157887,"url":"https://github.com/juliasimd/triangularsolve.jl","last_synced_at":"2026-03-11T05:01:46.346Z","repository":{"id":39568095,"uuid":"382185926","full_name":"JuliaSIMD/TriangularSolve.jl","owner":"JuliaSIMD","description":"rdiv!(::AbstractMatrix, ::UpperTriangular) and ldiv!(::LowerTriangular, ::AbstractMatrix)","archived":false,"fork":false,"pushed_at":"2024-11-18T17:49:42.000Z","size":161,"stargazers_count":12,"open_issues_count":2,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-12-23T05:45:04.374Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JuliaSIMD.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-02T00:10:17.000Z","updated_at":"2024-06-28T16:01:48.000Z","dependencies_parsed_at":"2023-02-14T07:45:31.691Z","dependency_job_id":"ee87ba0d-8ce9-4c53-8f59-6f4a54d61874","html_url":"https://github.com/JuliaSIMD/TriangularSolve.jl","commit_stats":{"total_commits":74,"total_committers":8,"mean_commits":9.25,"dds":0.2702702702702703,"last_synced_commit":"3b79190338de6ff9974735a448379eb430f32d71"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/JuliaSIMD/TriangularSolve.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaSIMD%2FTriangularSolve.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaSIMD%2FTriangularSolve.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaSIMD%2FTriangularSolve.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaSIMD%2FTriangularSolve.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JuliaSIMD","download_url":"https://codeload.github.com/JuliaSIMD/TriangularSolve.jl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JuliaSIMD%2FTriangularSolve.jl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30372125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"online","status_checked_at":"2026-03-11T02:00:07.027Z","response_time":84,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-21T12:55:09.730Z","updated_at":"2026-03-11T05:01:46.330Z","avatar_url":"https://github.com/JuliaSIMD.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TriangularSolve\n\n[![Stable](https://img.shields.io/badge/docs-stable-blue.svg)](https://JuliaSIMD.github.io/TriangularSolve.jl/stable)\n[![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://JuliaSIMD.github.io/TriangularSolve.jl/dev)\n[![Build Status](https://github.com/JuliaSIMD/TriangularSolve.jl/workflows/CI/badge.svg)](https://github.com/JuliaSIMD/TriangularSolve.jl/actions)\n[![Coverage](https://codecov.io/gh/JuliaSIMD/TriangularSolve.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/JuliaSIMD/TriangularSolve.jl)\n\n\nPerforms some triangular solves. For example:\n```julia\njulia\u003e using TriangularSolve, LinearAlgebra, MKL;\n\njulia\u003e BLAS.set_num_threads(1)\n\njulia\u003e BLAS.get_config().loaded_libs\n1-element Vector{LinearAlgebra.BLAS.LBTLibraryInfo}:\n LBTLibraryInfo(libmkl_rt.so, ilp64)\n\njulia\u003e N = 100;\n\njulia\u003e A = rand(N,N); B = rand(N,N); C = similar(A);\n\njulia\u003e @benchmark TriangularSolve.rdiv!($C, $A, UpperTriangular($B), Val(false)) # false means single threaded\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  15.909 μs …  41.524 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     17.916 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   17.751 μs ± 697.786 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n  ▃▁    ▁    ▁     ▄▁    ▇▆    ▆█▃                             ▂\n  ██▃▁▁██▁▁▁▁█▆▁▁▃▇██▄▃▁███▆▁▄▄███▄▄▅▅▆▇█▇▄▅▆▇██▇█▇▇▆▄▅▄▁▄▁▄▄▇ █\n  15.9 μs       Histogram: log(frequency) by time      19.9 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark rdiv!(copyto!($C, $A), UpperTriangular($B))\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  17.578 μs … 75.835 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     19.852 μs              ┊ GC (median):    0.00%\n Time  (mean ± σ):   19.827 μs ±  1.342 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n  ▄▂              ▂    ▆▅   ▁█▇▂   ▅▃     ▂                   ▂\n  ██▁▁▃█▇▁▁▁█▇▄▄▁██▇▄▄▄██▆▅▄████▅▄▆██▆▆▆▆▇██▇▇▆▆▇▆▅▆▄▅▅▆▄▅▄▅▅ █\n  17.6 μs      Histogram: log(frequency) by time      22.4 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark ldiv!($C, LowerTriangular($B), $A)\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  19.102 μs …  69.966 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     21.561 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   21.565 μs ± 890.952 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n  ▂▂                 ▂▃     ▄▄     ▆█▄     ▅▅                  ▂\n  ██▃▁▁▁▇█▁▁▁▁▅█▁▁▁▁▁██▅▁▁▁▅██▆▁▁▁▆███▆▅▃▅████▃▄▅██▇▇▅▆▆▇▇█▇▆▆ █\n  19.1 μs       Histogram: log(frequency) by time      23.4 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A, Val(false)) # false means single threaded\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  19.082 μs …  39.078 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     19.694 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   19.765 μs ± 774.848 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n    ▃        ▄█         ▁\n  ▂▇██▄▂▁▁▂▂▃███▃▂▁▂▁▂▂▅█▇▃▂▂▂▁▂▂▂▂▂▂▂▁▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▁▂▂▂ ▃\n  19.1 μs         Histogram: frequency by time         22.1 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n```\nMultithreaded benchmarks:\n```julia\njulia\u003e BLAS.set_num_threads(min(Threads.nthreads(), TriangularSolve.VectorizationBase.num_cores()))\n\njulia\u003e @benchmark TriangularSolve.rdiv!($C, $A, UpperTriangular($B))\nBenchmarkTools.Trial: 10000 samples with 3 evaluations.\n Range (min … max):  8.309 μs …  24.357 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     8.769 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   8.812 μs ± 382.702 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n               ▁▃▄▆▆██▇▆▅▃▁\n  ▂▁▂▂▂▂▃▃▃▄▅▇██████████████▇▆▅▄▃▃▃▃▃▂▃▃▃▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ ▄\n  8.31 μs         Histogram: frequency by time         9.7 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark rdiv!(copyto!($C, $A), UpperTriangular($B))\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  11.996 μs … 151.147 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     14.163 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   14.281 μs ±   2.372 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n          ▂▄▇███▇▆▅▃▂ ▁   ▂▄▄▅▅▅▆▃▃         ▁\n  ▁▁▁▂▂▃▄▇██████████████████████████▇▆▅▄▅▆▇███▆▅▅▃▄▂▂▂▁▁▁▁▁▁▁▁ ▅\n  12 μs           Histogram: frequency by time         17.3 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A)\nBenchmarkTools.Trial: 10000 samples with 5 evaluations.\n Range (min … max):  7.903 μs …  22.442 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     9.871 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   9.789 μs ± 864.957 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n  ▂▃  ▄▃  ▃▅   ▅▃   ▆▂   ▆▄   ▂▇▄   ▃█▅▂▂▁▁▄▆▃▁ ▁             ▂\n  ██▅▂██▆▅██▆▆▆██▇▇███▇▇▇████▇█████▆██████████████▇███▇▇▆▇▆▅▆ █\n  7.9 μs       Histogram: log(frequency) by time      11.8 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark ldiv!($C, LowerTriangular($B), $A)\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  13.507 μs … 142.574 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     15.258 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   15.319 μs ±   2.045 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n     ▁▃   ▁▂   ▁▃▅▁  ▁▄▄▁  ▂▆█▆▃\n  ▁▂▅███▆▇███▆▅████▆▅████▆▆█████▆▄▄▆▆▅▄▂▂▂▂▂▂▂▂▂▂▂▂▂▂▁▁▁▁▁▁▁▁▁ ▄\n  13.5 μs         Histogram: frequency by time         18.5 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e versioninfo()\nJulia Version 1.8.0-DEV.438\nCommit 88a6376e99* (2021-08-28 11:03 UTC)\nPlatform Info:\n  OS: Linux (x86_64-redhat-linux)\n  CPU: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz\n  WORD_SIZE: 64\n  LIBM: libopenlibm\n  LLVM: libLLVM-12.0.1 (ORCJIT, tigerlake)\nEnvironment:\n  JULIA_NUM_THREADS = 8\n```\nSingle-threaded benchmarks on an M1 mac:\n```julia\njulia\u003e N = 100;\n\njulia\u003e A = rand(N,N); B = rand(N,N); C = similar(A);\n\njulia\u003e @benchmark TriangularSolve.rdiv!($C, $A, UpperTriangular($B), Val(false)) # false means single threaded\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  21.416 μs …  34.458 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     21.624 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   21.767 μs ± 491.788 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n    ▃ ▆██ ▆▄ ▁                 ▃▄ ▄▂          ▁            ▂▃▁ ▂\n  ▃▇█▁███▁██▁█▆▁▁▁▁▁▁▁▁▁▁▁▁▁▃█▁██▁███▁▆▃▁▁▆▇▁██▁█▆▅▁▄▃▁▃▃▇▁███ █\n  21.4 μs       Histogram: log(frequency) by time      23.2 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark rdiv!(copyto!($C, $A), UpperTriangular($B))\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  39.124 μs … 57.749 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     46.166 μs              ┊ GC (median):    0.00%\n Time  (mean ± σ):   46.274 μs ±  1.766 μs  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n                              ▁▁▄▂▆▃█▅▇▄▇▅▃▃▁▃▁▂               \n  ▂▁▁▂▂▂▂▂▁▂▂▂▂▂▂▃▃▃▃▃▄▄▅▅▆▅▇▇████████████████████▆▇▆▆▅▆▅▅▄▃▃ ▅\n  39.1 μs         Histogram: frequency by time        50.2 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark ldiv!($C, LowerTriangular($B), $A)\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  48.291 μs …  57.833 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     49.124 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   49.306 μs ± 802.143 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n    ▁▃▅▆▇██▇██▇▇▆▅▄▂▂▁▁▁▂▁▁▁▁▁▁▁ ▁▁▁                           ▃\n  ▃████████████████████████████████████▇▆▄▂▄▃▂▃▃▄▄▃▆▅▇▇▇██▇█▇▇ █\n  48.3 μs       Histogram: log(frequency) by time        53 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n\njulia\u003e @benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A, Val(false)) # false means single threaded\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  34.249 μs …  40.208 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     34.375 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   34.748 μs ± 774.675 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n  ▆██▆▃▄▅▃                ▁▁▄▅▅▃▂▁                     ▂▃▂  ▁▂ ▂\n  ████████▁▁▃▁▁▁▁▁▃▄▃▁▁▃██████████▇▅▄▅▅▆▄▄▄▄▄▅▄▄▃▅▃▄▃▅█████▇██ █\n  34.2 μs       Histogram: log(frequency) by time      37.1 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n```\nOr\n```julia\njulia\u003e @benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A, Val(false)) # false means single threaded\nBenchmarkTools.Trial: 10000 samples with 1 evaluation.\n Range (min … max):  23.750 μs …  30.541 μs  ┊ GC (min … max): 0.00% … 0.00%\n Time  (median):     23.875 μs               ┊ GC (median):    0.00%\n Time  (mean ± σ):   23.948 μs ± 316.293 ns  ┊ GC (mean ± σ):  0.00% ± 0.00%\n\n   ▃▁▆ █ ▇▆▆ ▄ ▁                               ▁ ▁         ▁ ▁ ▂\n  ▅███▆█▁███▄█▁██▇▁▄▁▁▁▁▁▃▁▁▁▁▁▁▁▃▁▁▁▃▁▁▁▁▁▆▁▇▆█▁█▁▇▆▅▁▅▁▇▆█▁█ █\n  23.8 μs       Histogram: log(frequency) by time        25 μs \u003c\n\n Memory estimate: 0 bytes, allocs estimate: 0.\n```\n\nFor editing convenience (you can copy/paste the above into a REPL and it should automatically strip `julia\u003e `s and outputs, but the above is less convenient to edit if you want to try changing the benchmarks):\n```julia\nusing TriangularSolve, LinearAlgebra, MKL;\nBLAS.set_num_threads(Threads.nthreads())\nBLAS.get_config().loaded_libs\nN = 100;\n\nA = rand(N,N); B = rand(N,N); C = similar(A);\n\n@benchmark TriangularSolve.rdiv!($C, $A, UpperTriangular($B), Val(false))\n@benchmark rdiv!(copyto!($C, $A), UpperTriangular($B))\n\n@benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A, Val(false))\n@benchmark ldiv!($C, LowerTriangular($B), $A)\n\nBLAS.set_num_threads(TriangularSolve.VectorizationBase.num_cores())\n@benchmark TriangularSolve.rdiv!($C, $A, UpperTriangular($B))\n@benchmark rdiv!(copyto!($C, $A), UpperTriangular($B))\n\n@benchmark TriangularSolve.ldiv!($C, LowerTriangular($B), $A)\n@benchmark ldiv!($C, LowerTriangular($B), $A)\n\nversioninfo()\n```\n\nCurrently, `rdiv!` with `UpperTriangular` and `ldiv!` with `LowerTriangulra` matrices are the only supported configurations.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliasimd%2Ftriangularsolve.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuliasimd%2Ftriangularsolve.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuliasimd%2Ftriangularsolve.jl/lists"}