Hi. I googled and read many things about this topic, but cannot figure up what is the problem, and why I see no meaningful speedup for my code.
My code:
module Keygen
using Base.Threads
using Base.Iterators
include("./secp256k1.jl")
function gen_keys_range(k_range, out_matrix=nothing)
if isnothing(out_matrix)
data_size = length(k_range)
keys = zeros(BigInt, data_size, 2)
else
keys = out_matrix
end
for (i, k) in enumerate(k_range)
x,y = Secp256k1.der_keys(k)
keys[i,1] = x
keys[i,2] = y
end
return keys, k_range
end
function gen_keys_1(k_start, k_num)
nth = Threads.nthreads()
keys = zeros(BigInt, k_num, 2)
k_end = k_start + k_num - 1
part_size = div(k_num, nth)
tasks = []
for k_r in partition(k_start:k_end, part_size)
push!(tasks, Threads.@spawn gen_keys_range(k_r))
end
results = fetch.(tasks)
for res in results
k, k_r = res
v_start = k_r.start - k_start + 1
v_stop = k_r.stop - k_start + 1
keys[v_start:v_stop,:] = k
end
return keys
end
nth = Threads.nthreads()
println("Threads num $nth")
function test_gen_keys_range()
gen_keys_1(123,10000)
end
start_t = time();
keys = test_gen_keys_range()
stop_t = time();
elapsed_time = stop_t - start_t;
println("Time taken by test_gen_keys_range: ", elapsed_time, " seconds");
end
Results:
JULIA_NUM_THREADS=1 julia keygen.jl
Threads num 1
Time taken by test_gen_keys_range: 1.7290940284729004 seconds
JULIA_NUM_THREADS=16 julia keygen.jl
Threads num 16
Time taken by test_gen_keys_range: 1.2138419151306152 seconds
I tried different approaches, rewrite code few times. Tried
Threads.@threads
And getting same results every time.
I see constant small speed independent on number threads used after 2 threads and more.