Skip to content

Latest commit

 

History

History
126 lines (102 loc) · 2.2 KB

gallery.md

File metadata and controls

126 lines (102 loc) · 2.2 KB

Gallery

Fibonacci

Serial fibonacci

using EventTracker

function fib(n)
    n <= 1 && return n
    @recordinterval :fib1 a = fib(n - 1)
    @recordinterval :fib2 b = fib(n - 2)
    return a + b
end

EventTracker.clear()
fib(10)

df = EventTracker.summary_dataframe()
using Plots
stks = EventTracker.stacks()
plot(stks)
savefig("fibonacci-serial-stacks.svg"); nothing # hide

Parallel fibonacci

using EventTracker

function fib(n)
    n <= 1 && return n
    t = @async begin
        rand(Bool) && yield()  # introduce more task jugglings
        @recordinterval :fib1 fib(n - 1)
    end
    @recordinterval :fib2 b = fib(n - 2)
    return (fetch(t)::Int) + b
end
nothing # hide
function withspin(f)
    done = Threads.Atomic{Bool}(false)
    @sync begin
        Threads.@spawn begin
            while !done[]
                @recordpoint :spin
                yield()
            end
        end
        try
            f()
        finally
            done[] = true
        end
    end
end

function run_fibs_with_spin(nums)
    withspin() do
        for n in nums
            fib(n)
        end
    end
end
run_fibs_with_spin([5, 6, 7])  # invoke compilation
nothing # hide
EventTracker.clear()
run_fibs_with_spin([5, 6, 7])

df = EventTracker.summary_dataframe()
using Plots
stks = EventTracker.stacks()
plot(stks)
savefig("fibonacci-spin-stacks.svg"); nothing # hide

Tarai

Ref: Tak (function) - Wikipedia

using EventTracker

function tarai(x, y, z)
    @recordinterval if y < x
        tarai(
            tarai(x - 1, y, z),
            tarai(y - 1, z, x),
            tarai(z - 1, x, y),
        )
    else
        @recordpoint
        y
    end
end

EventTracker.clear()
tarai(3, 1, 7)
df = EventTracker.summary_dataframe()
using Plots
stks = EventTracker.stacks()
plot(stks)
savefig("tarai-serial-stacks.png"); nothing # hide