Skip to content

Instantly share code, notes, and snippets.

@zsunberg
Created December 24, 2021 01:50
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 zsunberg/9743519bfd1d9bb58e5c5c55a6e759b7 to your computer and use it in GitHub Desktop.
Save zsunberg/9743519bfd1d9bb58e5c5c55a6e759b7 to your computer and use it in GitHub Desktop.
Is it better to launch 10000 tasks or nthreads() tasks in Julia
using BenchmarkTools
function operate!(shared, locks)
i = rand(1:length(shared))
lock(locks[i]) do
shared[i] += 1
end
end
function operate_many!(shared, locks, channel)
while true
try
take!(channel)
catch
break
end
operate!(shared, locks)
end
end
function spawn_all(n=10000, m=10; Lock=ReentrantLock)
shared = zeros(Int, m)
locks = [Lock() for i in 1:m]
tasks = [Threads.@spawn(operate!(shared, locks)) for i in 1:n]
for t in tasks
wait(t)
end
@assert sum(shared) == n
return shared
end
function spawn_threads(n=10000, m=10; Lock=Threads.SpinLock)
shared = zeros(Int, m)
locks = [Lock() for i in 1:m]
channel = Channel{Int}(n) do ch
foreach(i -> put!(ch, i), 1:n)
close(ch)
end
tasks = [Threads.@spawn(operate_many!(shared, locks, channel)) for i in 1:Threads.nthreads()]
for t in tasks
wait(t)
end
@assert sum(shared) == n
return shared
end
display(@benchmark spawn_all()) # mean = 7.1 ms
display(@benchmark spawn_threads()) # mean = 10.6 ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment