Skip to content

Commit 3e6756b

Browse files
committed
Moved randjump(::MersenneTwister, ::steps) out of Future and placed it into Random.
Implemented set_nthreads!() to allocate ThreadRNG at init.
1 parent 1f8b9c0 commit 3e6756b

File tree

5 files changed

+35
-31
lines changed

5 files changed

+35
-31
lines changed

base/threads.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,22 @@ function resize_nthreads!(A::AbstractVector, copyvalue=A[1])
2929
return A
3030
end
3131

32+
"""
33+
set_nthreads!(A, origarray::AbstracVector)
34+
Similar to `resize_nthreads!` but makes a deepcopy per value of the origin array.
35+
36+
If `length(origarray)` is not equal to [`nthreads()`](@ref) it throws an error.
37+
This function in intended to be used to allocate `origarray` values per-thread,
38+
and should be called at `__init__` if `A` is a global constant.
39+
"""
40+
function set_nthreads!(A::AbstractVector, origarray::AbstractVector)
41+
nthr = nthreads()
42+
nthr > length(origarray) && throw(ArgumentError("Origin Array must have at least nthreads() elements!"))
43+
resize!(A, nthr)
44+
@threads for i = 1:nthr
45+
A[i] = deepcopy(origarray[i])
46+
end
47+
return A
48+
end
49+
3250
end

stdlib/Future/src/Future.jl

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,4 @@ function copy!(dst::AbstractArray, src::AbstractArray)
2828
copyto!(dst, src)
2929
end
3030

31-
32-
## randjump
33-
34-
"""
35-
randjump(r::MersenneTwister, steps::Integer) -> MersenneTwister
36-
37-
Create an initialized `MersenneTwister` object, whose state is moved forward
38-
(without generating numbers) from `r` by `steps` steps.
39-
One such step corresponds to the generation of two `Float64` numbers.
40-
For each different value of `steps`, a large polynomial has to be generated internally.
41-
One is already pre-computed for `steps=big(10)^20`.
42-
"""
43-
randjump(r::MersenneTwister, steps::Integer) =
44-
Random._randjump(r, Random.DSFMT.calc_jump(steps))
45-
4631
end # module Future

stdlib/Random/src/RNGs.jl

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -555,22 +555,22 @@ end
555555

556556
### randjump
557557

558-
# Old randjump methods are deprecated, the scalar version is in the Future module.
559-
560558
_randjump(r::MersenneTwister, jumppoly::DSFMT.GF2X) =
561559
fillcache_zeros!(MersenneTwister(copy(r.seed), DSFMT.dsfmt_jump(r.state, jumppoly)))
562560

563-
function _randjump(mt::MersenneTwister, jumppoly::DSFMT.GF2X, len::Integer)
564-
mts = MersenneTwister[]
565-
push!(mts, mt)
566-
for i in 1:len-1
567-
cmt = mts[end]
568-
push!(mts, _randjump(cmt, jumppoly))
569-
end
570-
return mts
571-
end
561+
"""
562+
randjump(r::MersenneTwister, steps::Integer) -> MersenneTwister
563+
564+
Create an initialized `MersenneTwister` object, whose state is moved forward
565+
(without generating numbers) from `r` by `steps` steps.
566+
One such step corresponds to the generation of two `Float64` numbers.
567+
For each different value of `steps`, a large polynomial has to be generated internally.
568+
One is already pre-computed for `steps=big(10)^20`.
569+
"""
570+
randjump(r::MersenneTwister, steps::Integer) =
571+
Random._randjump(r, Random.DSFMT.calc_jump(steps))
572572

573-
const ThreadRNG = Ref{Vector{MersenneTwister}}()
573+
const ThreadRNG = MersenneTwister[]
574574

575575
"""
576576
trand(r::Vector{MersenneTwister}) -> Float64
@@ -581,7 +581,7 @@ it relies on `ThreadRNG[]`, a threaded array of `MersenneTwister` objects genera
581581
`randjump` by taking 10^20 steps from `GLOBAL_RNG`.
582582
If provided, it can also rely on a vector of `MersenneTwister` generated by the user.
583583
"""
584-
function trand(r::Vector{MersenneTwister}=ThreadRNG[])
585-
rt = r[Threads.threadid()]
584+
function trand(r::Vector{MersenneTwister}=ThreadRNG)
585+
@inbounds rt = r[Threads.threadid()]
586586
return rand(rt)
587587
end

stdlib/Random/src/Random.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ function __init__()
271271
Base.showerror_nostdio(ex,
272272
"WARNING: Error during initialization of module Random")
273273
end
274-
ThreadRNG[] = randjump(GLOBAL_RNG, big(10)^20, Threads.nthreads())
274+
rand_gens = accumulate(randjump, fill(2^30, Threads.nthreads()); init=GLOBAL_RNG)
275+
Threads.set_nthreads!(ThreadRNG, rand_gens)
275276
end
276277

277278
include("RNGs.jl")

stdlib/Random/src/deprecated.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function randjump(mt::MersenneTwister, jumps::Integer, jumppoly::AbstractString)
1414
_randjump(mt, DSFMT.GF2X(jumppoly), jumps)
1515
end
1616

17-
@deprecate randjump(mt::MersenneTwister, jumps::Integer) randjump(mt, big(10)^20, jumps)
17+
# @deprecate randjump(mt::MersenneTwister, jumps::Integer) randjump(mt, big(10)^20, jumps)
1818

1919
function randjump(r::MersenneTwister, steps::Integer, len::Integer)
2020
Base.depwarn("`randjump(rng, steps::Integer, len::Integer` is deprecated; use `Future.randjump` and `accumulate` instead", :randjump)

0 commit comments

Comments
 (0)