Skip to content

Commit

Permalink
Add support for nested shapes (#7)
Browse files Browse the repository at this point in the history
ShapedView is now <: DenseArray
ShapedViews of nested shapes are now supported.
  • Loading branch information
colinxs authored Dec 12, 2019
1 parent 22bbe99 commit 86f9938
Show file tree
Hide file tree
Showing 14 changed files with 511 additions and 233 deletions.
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ version = "0.1.0"

[deps]
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
UnsafeArrays = "c4a57d5a-5b31-53a6-b365-19f8c011fbd6"

[compat]
Adapt = "1"
Expand Down
8 changes: 8 additions & 0 deletions perf/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[deps]
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
UnsafeArrays = "c4a57d5a-5b31-53a6-b365-19f8c011fbd6"

[compat]
julia = "1.3"
153 changes: 153 additions & 0 deletions perf/benchmarks.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#function sv_ms_assign_loop(N::Int)
# s1 = MatrixShape(Float64, 5,10)
# s2 = VectorShape(Float64, 15)
# s3 = ScalarShape(Float64)
#
# ms = MultiShape(s1 = s1, s2 = s2, s3=s3)
# src = rand!(allocate(ms, N))
# dst = zeros(ms, N)
#
# bench = @benchmarkable begin
# sv_ms_assign_loop_bench($ms, $src, $dst)
# end teardown=(@assert $src == $dst)
#
# std = @benchmarkable sv_assign_loop_std($src, $dst)
#
# bench, std
#end
#
#function sv_ms_assign_loop_bench(ms, src, dst)
# @uviews src dst @inbounds for i in axes(src, 2)
# s, d = view(src, :, i), view(dst, :, i)
# src, dst = ms(s), ms(d)
#
# dst.s1 .= src.s1
# dst.s2 .= src.s2
# dst.s3 = src.s3
# end
#end
#
#function sv_ms_assign_loop_std(src, dst)
# @uviews src dst @inbounds for i in axes(src, 2)
# s, d = view(src, :, i), view(dst, :, i)
# s .= d
# end
#end


function sv_ms_nested_assign()
s1 = MatrixShape(Float64,5,10)
s2 = VectorShape(Float64,5)
s3 = ScalarShape(Float64)
ms1 = MultiShape(s1 = s1, s2 = s2, s3=s3)

s4 = VectorShape(Float64,3)
s5 = ScalarShape(Float64)
ms2 = MultiShape(s4=s4, s5=s5)

s6 = ScalarShape(Float64)
ms3 = MultiShape(s6=s6, ms2=ms2)

ms = MultiShape(ms1=ms1, ms2=ms2, ms3=ms3)

src = rand!(allocate(ms))
shaped_src = ms(rand!(allocate(ms)))
dst = zeros(ms)
shaped_dst = ms(zeros(ms))

bench = @benchmarkable begin
sv_ms_nested_assign_bench($shaped_dst, $shaped_src)
end teardown=(@assert $shaped_dst == $shaped_src)

std = @benchmarkable begin
sv_ms_nested_assign_std($dst, $src)
end teardown = (@assert $dst == $src)

bench, std
end

function sv_ms_nested_assign_bench(dst, src)
@uviews dst src @inbounds begin
dst.ms1.s1 .= src.ms1.s1
dst.ms1.s2 .= src.ms1.s2
dst.ms1.s3 = src.ms1.s3

dst.ms2.s4 .= src.ms2.s4
dst.ms2.s5 = src.ms2.s5

dst.ms3.s6 = src.ms3.s6
dst.ms3.ms2.s4 .= src.ms3.ms2.s4
dst.ms3.ms2.s5 = src.ms3.ms2.s5
end
end

function sv_ms_nested_assign_std(dst, src)
@uviews dst src @inbounds begin
dst[1:50] .= view(src, 1:50)
dst[51:55] .= view(src, 51:55)
dst[56] = src[56]
dst[57:59] .= view(src, 57:59)
dst[60] = src[60]
dst[61] = src[61]
dst[62:64] .= view(src, 62:64)
dst[65] = src[65]
end
end


function sv_ms_assign()
s1 = MatrixShape(Float64, 5,10)
s2 = VectorShape(Float64, 15)
s3 = ScalarShape(Float64)
ms = MultiShape(s1 = s1, s2 = s2, s3=s3)

src = rand!(allocate(ms))
shaped_src = ms(rand!(allocate(ms)))
dst = zeros(ms)
shaped_dst = ms(zeros(ms))

bench = @benchmarkable begin
sv_ms_assign_bench($shaped_dst, $shaped_src)
end teardown=(@assert $shaped_src == $shaped_dst)

std = @benchmarkable begin
sv_ms_assign_std($dst, $src)
end teardown = @assert $dst == $src

bench, std
end

function sv_ms_assign_bench(src, dst)
@uviews dst src @inbounds begin
dst.s1 .= src.s1
dst.s2 .= src.s2
dst.s3 = src.s3
end
end

function sv_ms_assign_std(dst, src)
@uviews dst src @inbounds begin
dst[1:50] .= view(src, 1:50)
dst[51:65] .= view(src, 51:65)
dst[66] = src[66]
end
end


function sv_vs_assign()
s = VectorShape(Float64, 15)

src = rand!(allocate(s))
shaped_src = ShapedView(rand!(allocate(s)), s)
dst = zeros(s)
shaped_dst = ShapedView(zeros(s), s)

bench = @benchmarkable begin
@inbounds $shaped_dst .= $shaped_src
end teardown=(@assert $shaped_src == $shaped_dst)
std = @benchmarkable begin
@inbounds $dst .= $src
end
bench, std
end

58 changes: 58 additions & 0 deletions perf/run_benchmarks.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using Random, BenchmarkTools, UnsafeArrays, Statistics
using BenchmarkTools: prettytime, prettypercent

push!(LOAD_PATH, joinpath(@__DIR__, ".."))
using Shapes

include("benchmarks.jl")

function bgroup!(suite_or_group, name, bench, std)
g = suite_or_group[name] = BenchmarkGroup()
g["bench"] = bench
g["std"] = std
g
end



# Define a parent BenchmarkGroup to contain our suite
suite = BenchmarkGroup()

suite["sv"] = BenchmarkGroup()
bgroup!(suite["sv"], "vs_assign", sv_vs_assign()...)
bgroup!(suite["sv"], "ms_assign", sv_ms_assign()...)
bgroup!(suite["sv"], "ms_nested_assign", sv_ms_nested_assign()...)

function run_benchmarks()
tune!(suite)
results = run(suite)
summarize_results(results)
results
end

summarize_results(suite_or_group) = summarize_results(suite_or_group, "")
function summarize_results(suite_or_group, name)
if haskey(suite_or_group, "bench")
println()
println("Benchmark $name")
bench, std = median.(values(suite_or_group))
if bench.allocs != 0
@warn "Non-zero allocs in bench: $(bench.allocs)"
end
if std.allocs != 0
@error "Non-zero allocs in std: $(std.allocs)"
end
bench_t = time(bench)
std_t = time(std)
ratio = (bench_t - std_t) / std_t

str = "Bench: $(prettytime(bench_t))"
str *= " Std: $(prettytime(std_t))"
str *= " Percent slower: $(prettypercent(ratio))"
println(str)
else
for (k, v) in suite_or_group
summarize_results(v, k)
end
end
end
19 changes: 0 additions & 19 deletions proto/Project.toml

This file was deleted.

59 changes: 0 additions & 59 deletions proto/nested.jl

This file was deleted.

5 changes: 0 additions & 5 deletions proto/src/proto.jl

This file was deleted.

Loading

0 comments on commit 86f9938

Please sign in to comment.