strided-kernel 0.3.0

Cache-optimized kernels for strided multidimensional array operations in Rust (ported from Julia Strided.jl/StridedViews.jl).
Documentation
using Strided
using BenchmarkTools
using Statistics

# Julia must run with 1 thread for fair comparison if Rust is single-threaded (mostly)
# or just compare as-is. strided-rs is single-threaded by default in these benches.
println("Julia Threads: ", Threads.nthreads())

function bench_mwe_stridedview_scale_transpose_1000()
    n = 1000
    A = rand(n, n)
    B = similar(A)

    # MWE:
    #   StridedView(B) .= 3 .* StridedView(A)'
    #
    # For benchmarking, pre-wrap to avoid measuring wrapper construction.
    svA = StridedView(A)
    svB = StridedView(B)

    t = @benchmark $svB .= 3 .* $svA'
    println("mwe_stridedview_scale_transpose_1000 (StridedView): ", mean(t.times) / 1e6, " ms")
end

function bench_symmetrize_4000()
    A = rand(4000, 4000)
    B = similar(A)
    # This is what Rust's benches/readme_examples.rs does
    t = @benchmark @strided $B .= ($A .+ $A') ./ 2
    println("symmetrize_4000 (Strided): ", mean(t.times) / 1e6, " ms")
end

function bench_scale_transpose_1000()
    A = rand(1000, 1000)
    B = similar(A)
    t = @benchmark @strided $B .= 3 .* $A'
    println("scale_transpose_1000 (Strided): ", mean(t.times) / 1e6, " ms")
end

function bench_complex_elementwise_1000()
    A = rand(1000, 1000)
    B = similar(A)
    t = @benchmark @strided $B .= $A .* exp.( -2 .* $A) .+ sin.( $A .* $A)
    println("complex_elementwise_1000 (Strided): ", mean(t.times) / 1e6, " ms")
end

function bench_permute_32_4d()
    A = randn(32, 32, 32, 32)
    B = similar(A)
    t = @benchmark @strided permutedims!($B, $A, (4,3,2,1))
    println("permute_32_4d (Strided): ", mean(t.times) / 1e6, " ms")
end

function bench_multiple_permute_sum_32_4d()
    A = randn(32, 32, 32, 32)
    B = similar(A)
    t = @benchmark @strided $B .= permutedims($A, (1,2,3,4)) .+ permutedims($A, (2,3,4,1)) .+ permutedims($A, (3,4,1,2)) .+ permutedims($A, (4,1,2,3))
    println("multiple_permute_sum_32_4d (Strided): ", mean(t.times) / 1e6, " ms")
end

bench_symmetrize_4000()
bench_mwe_stridedview_scale_transpose_1000()
bench_scale_transpose_1000()
bench_complex_elementwise_1000()
bench_permute_32_4d()
bench_multiple_permute_sum_32_4d()