Я хочу использовать многопоточность совместно используемой памяти в Julia.Как и в макросе Threads. @ Threads, я могу использовать ccall (: jl_threading_run ...) для этого.И хотя мой код теперь работает параллельно, я не получил ожидаемого ускорения.
Следующий код предназначен в качестве минимального примера подхода, который я использую, и проблемы с производительностью, которую я испытываю: [РЕДАКТИРОВАТЬ: см. Позже для еще более минимального примера]
nthreads = Threads.nthreads()
test_size = 1000000
println("STARTED with ", nthreads, " thread(s) and test size of ", test_size, ".")
# Something to be processed:
objects = rand(test_size)
# Somewhere for our results
results = zeros(nthreads)
counts = zeros(nthreads)
# A function to do some work.
function worker_fn()
work_idx = 1
my_result = results[Threads.threadid()]
while work_idx > 0
my_result += objects[work_idx]
work_idx += nthreads
if work_idx > test_size
break
end
counts[Threads.threadid()] += 1
end
end
# Call our worker function using jl_threading_run
@time ccall(:jl_threading_run, Ref{Cvoid}, (Any,), worker_fn)
# Verify that we made as many calls as we think we did.
println("\nCOUNTS:")
println("\tPer thread:\t", counts)
println("\tSum:\t\t", sum(counts))
На i7-7700 типичный однопоточный результат:
STARTED with 1 thread(s) and test size of 1000000.
0.134606 seconds (5.00 M allocations: 76.563 MiB, 1.79% gc time)
COUNTS:
Per thread: [999999.0]
Sum: 999999.0
И с 4 потоками:
STARTED with 4 thread(s) and test size of 1000000.
0.140378 seconds (1.81 M allocations: 25.661 MiB)
COUNTS:
Per thread: [249999.0, 249999.0, 249999.0, 249999.0]
Sum: 999996.0
Многопоточность замедляет работу!Почему?
РЕДАКТИРОВАТЬ: можно создать лучший минимальный пример самого макроса @threads.
a = zeros(Threads.nthreads())
b = rand(test_size)
calls = zeros(Threads.nthreads())
@time Threads.@threads for i = 1 : test_size
a[Threads.threadid()] += b[i]
calls[Threads.threadid()] += 1
end
Я ошибочно предположил, что включение макроса @threads в Юлию означало бы, что было преимущество длябыть имел.