Last active
August 1, 2021 08:39
-
-
Save mkitti/84c2710df56c2b6c9f806d2b85c482f2 to your computer and use it in GitHub Desktop.
Code to downsample
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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