Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for nested shapes #7

Merged
merged 5 commits into from
Dec 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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