Skip to content

Instantly share code, notes, and snippets.

@mkitti
Last active August 1, 2021 08:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkitti/84c2710df56c2b6c9f806d2b85c482f2 to your computer and use it in GitHub Desktop.
Save mkitti/84c2710df56c2b6c9f806d2b85c482f2 to your computer and use it in GitHub Desktop.
Code to downsample
module Downsampling
using TiledIteration, BenchmarkTools
I = rand(UInt16, 10000, 10000);
D = zeros(size(I).÷2...);
function avgNxN!(I, D, ::Val{N}) where N
for c = 1:size(D,2), bc = 1-N:0, r = 1:size(D,1), br = 1-N:0
@inbounds D[r,c] += I[r*N+br, c*N+bc]/N/N
end
end
avg2x2!(I, D) = avgNxN!(I, D, Val(2))
avg4x4!(I, D) = avgNxN!(I, D, Val(4))
avg2x2(I) = avg2x2!(I, zeros(size(I).÷2...))
avg4x4(I) = avg4x4!(I, zeros(size(I).÷4...))
precompile(avg2x2!, (typeof(I), typeof(D)) )
precompile(avg4x4!, (typeof(I), typeof(D)) )
precompile(avg2x2, (typeof(I),) )
precompile(avg4x4, (typeof(I),) )
function tileavg!(I, D, factor, avgfun)
tiled_I = collect(TileIterator(axes(I), size(I).÷factor))
tiled_D = collect(TileIterator(axes(D), size(D).÷factor))
Threads.@threads for i = eachindex(tiled_I)
@views avgfun(I[tiled_I[i]...], D[tiled_D[i]...])
end
end
tileavg2x2!(I, D, factor=100) = tileavg!(I, D, factor, avg2x2!)
tileavg4x4!(I, D, factor=50) = tileavg!(I, D, factor, avg4x4!)
tileavg2x2(I, factor=100) = tileavg2x2!(I, zeros(size(I).÷2...), factor)
tileavg4x4(I, factor=50) = tileavg2x2!(I, zeros(size(I).÷4...), factor)
precompile(tileavg2x2!, (typeof(I), typeof(D)) )
precompile(tileavg4x4!, (typeof(I), typeof(D)) )
precompile(tileavg2x2, (typeof(I),) )
precompile(tileavg4x4, (typeof(I),) )
function demo(I)
D = zeros(size(I).÷2...);
avg2x2!(I, D)
@info "Testing avg2x2!" sum(float(I)) sum(D)*4 sum(float(I)) == sum(D)*4
@info "Benchmarking avg2x2!"
display(@benchmark avg2x2!($I, $D))
@info "Benchmarking avg2x2"
display(@benchmark avg2x2($I))
@info "Benchmarking tileavg2x2!"
display(@benchmark tileavg2x2!($I, $D))
@info "Benchmarking tileavg2x2"
display(@benchmark tileavg2x2($I))
D = zeros(size(I).÷4...);
avg4x4!(I, D)
@info "Testing avg4x4!" sum(float(I)) sum(D)*16 sum(float(I)) == sum(D)*16
@info "Benchmarking avg4x4!"
display(@benchmark avg4x4!($I, $D))
@info "Benchmarking avg4x4"
display(@benchmark avg4x4($I))
@info "Benchmarking tileavg4x4!"
display(@benchmark tileavg4x4!($I, $D))
@info "Benchmarking tileavg4x4"
display(@benchmark tileavg4x4($I))
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment