Here are some benchmarks I quickly ran. Somewhat mixed results I get:
using LinearAlgebra
using Random
using Printf
using BenchmarkTools
BLAS.set_num_threads(16)
const SIZES = (256, 512, 1024, 2048)
function bench(f, name)
t = @belapsed $f()
@printf("%-25s %10.3f ms\n", name, t * 1000)
end
function benchmark_blas_lapack(N, A, B, C, x, y, SPD, SQR)
println("===== N = $N =====")
# Level-3 BLAS
bench("GEMM A * B") do
mul!(C, A, B)
end
# Level-2 BLAS
bench("GEMV A * x") do
mul!(y, A, x)
end
# LAPACK
bench("Cholesky") do
cholesky(SPD)
end
bench("LU") do
lu(SQR)
end
bench("QR") do
qr(SQR)
end
bench("Eigen (symmetric)") do
eigen(Symmetric(SPD))
end
println()
end
Random.seed!(1405)
#> TaskLocalRNG()
INPUTS = [
let
A = randn(Float64, N, N)
B = randn(Float64, N, N)
C = similar(A)
x = randn(Float64, N)
y = similar(x)
# Symmetric positive-definite matrix for Cholesky.
SPD = A * A' + N * I
# Separate copy for LU/QR.
SQR = copy(A)
(; N, A, B, C, x, y, SPD, SQR)
end
for N in SIZES
]
println("BLAS threads: ", BLAS.get_num_threads())
#> BLAS threads: 16
println(BLAS.get_config())
#> LBTConfig([ILP64] libopenblas64_.so)
for inputs in INPUTS
benchmark_blas_lapack(inputs...)
end
#> ===== N = 256 =====
#> GEMM A * B 0.117 ms
#> GEMV A * x 0.004 ms
#> Cholesky 0.166 ms
#> LU 0.309 ms
#> QR 0.887 ms
#> Eigen (symmetric) 5.436 ms
#>
#> ===== N = 512 =====
#> GEMM A * B 0.708 ms
#> GEMV A * x 0.018 ms
#> Cholesky 1.148 ms
#> LU 1.424 ms
#> QR 4.267 ms
#> Eigen (symmetric) 23.321 ms
#>
#> ===== N = 1024 =====
#> GEMM A * B 5.049 ms
#> GEMV A * x 0.027 ms
#> Cholesky 5.400 ms
#> LU 5.430 ms
#> QR 19.333 ms
#> Eigen (symmetric) 103.687 ms
#>
#> ===== N = 2048 =====
#> GEMM A * B 40.955 ms
#> GEMV A * x 0.368 ms
#> Cholesky 39.240 ms
#> LU 38.891 ms
#> QR 134.078 ms
#> Eigen (symmetric) 604.034 ms
using AOCL
println("BLAS threads: ", BLAS.get_num_threads())
#> BLAS threads: 16
println(BLAS.get_config())
#> LBTConfig([ILP64] libaocl64.so, [LP64] libaocl.so)
for inputs in INPUTS
benchmark_blas_lapack(inputs...)
end
#> ===== N = 256 =====
#> GEMM A * B 0.079 ms
#> GEMV A * x 0.004 ms
#> Cholesky 0.139 ms
#> LU 0.256 ms
#> QR 5.201 ms
#> Eigen (symmetric) 6.584 ms
#>
#> ===== N = 512 =====
#> GEMM A * B 0.669 ms
#> GEMV A * x 0.009 ms
#> Cholesky 1.047 ms
#> LU 1.080 ms
#> QR 14.699 ms
#> Eigen (symmetric) 28.969 ms
#>
#> ===== N = 1024 =====
#> GEMM A * B 5.218 ms
#> GEMV A * x 0.022 ms
#> Cholesky 4.182 ms
#> LU 4.435 ms
#> QR 41.410 ms
#> Eigen (symmetric) 110.973 ms
#>
#> ===== N = 2048 =====
#> GEMM A * B 45.948 ms
#> GEMV A * x 0.414 ms
#> Cholesky 20.869 ms
#> LU 29.655 ms
#> QR 169.518 ms
#> Eigen (symmetric) 736.530 ms
Created on 2026-08-11 with MinimalWorkingExamples v1.1.0 using Julia 1.12.6
Environment
Julia Version 1.12.6
Commit 15346901f00 (2026-04-09 19:20 UTC)
Build Info:
Official https://julialang.org release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 16 × AMD Ryzen 7 8845HS w/ Radeon 780M Graphics
WORD_SIZE: 64
LLVM: libLLVM-18.1.7 (ORCJIT, znver3)
GC: Built with stock GC
Threads: 1 default, 1 interactive, 1 GC (on 16 virtual cores)
Environment:
JULIA_LOAD_PATH = @:@stdlib