diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c0fc31..c8d9cc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,36 +9,25 @@ on: tags: '*' jobs: test: - name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ github.event_name }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: version: - - '1.6' + - 'min' + - 'lts' - '1' # automatically expands to the latest stable 1.x release of Julia. os: - ubuntu-latest - macOS-latest - windows-latest - arch: - - x64 steps: - uses: actions/checkout@v4 - uses: julia-actions/setup-julia@v2 with: version: ${{ matrix.version }} - arch: ${{ matrix.arch }} - - uses: actions/cache@v3 - env: - cache-name: cache-artifacts - with: - path: ~/.julia/artifacts - key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} - restore-keys: | - ${{ runner.os }}-test-${{ env.cache-name }}- - ${{ runner.os }}-test- - ${{ runner.os }}- + - uses: julia-actions/cache@v2 - uses: julia-actions/julia-buildpkg@v1 - uses: julia-actions/julia-runtest@v1 - uses: julia-actions/julia-processcoverage@v1 diff --git a/Project.toml b/Project.toml index 77f8794..e778120 100644 --- a/Project.toml +++ b/Project.toml @@ -1,14 +1,13 @@ name = "VectorizedRNG" uuid = "33b4df10-0173-11e9-2a0c-851a7edac40e" authors = ["Chris Elrod "] -version = "0.2.25" +version = "0.2.26" [deps] Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Requires = "ae029012-a4dd-5104-9daa-d747884805df" SLEEFPirates = "476501e8-09a2-5ece-8869-fb82de89a1fa" -UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" VectorizationBase = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" [weakdeps] @@ -22,9 +21,8 @@ VectorizedRNGStaticArraysExt = ["StaticArraysCore"] Requires = "1" SLEEFPirates = "0.6.29" StaticArraysCore = "1" -UnPack = "1" VectorizationBase = "0.19.38, 0.20.1, 0.21" -julia = "1.6" +julia = "1.10" [extras] RNGTest = "97cc5700-e6cb-5ca1-8fb2-7f6b45264ecd" diff --git a/src/VectorizedRNG.jl b/src/VectorizedRNG.jl index a477508..da64406 100644 --- a/src/VectorizedRNG.jl +++ b/src/VectorizedRNG.jl @@ -4,7 +4,7 @@ if isdefined(Base, :Experimental) && @eval Base.Experimental.@max_methods 1 end -using VectorizationBase, Random, UnPack +using VectorizationBase, Random using VectorizationBase: simd_integer_register_size, gep, diff --git a/src/xoshiro.jl b/src/xoshiro.jl index 72a62a2..7991d6a 100644 --- a/src/xoshiro.jl +++ b/src/xoshiro.jl @@ -123,92 +123,49 @@ end end # https://prng.di.unimi.it/xoshiro256starstar.c -@static if VERSION >= v"1.8" - Base.@assume_effects total function jump( - eins::UInt64, - zwei::UInt64, - drei::UInt64, - vier::UInt64 +Base.@assume_effects total function jump( + eins::UInt64, + zwei::UInt64, + drei::UInt64, + vier::UInt64 +) + e = zero(UInt64) + z = zero(UInt64) + d = zero(UInt64) + v = zero(UInt64) + for u ∈ ( + 0x180ec6d33cfd0aba, + 0xd5a61266f0c9392c, + 0xa9582618e03fc9aa, + 0x39abdc4529b1661c ) - e = zero(UInt64) - z = zero(UInt64) - d = zero(UInt64) - v = zero(UInt64) - for u ∈ ( - 0x180ec6d33cfd0aba, - 0xd5a61266f0c9392c, - 0xa9582618e03fc9aa, - 0x39abdc4529b1661c - ) - for _ ∈ 0:63 - if u % Bool - e ⊻= eins - z ⊻= zwei - d ⊻= drei - v ⊻= vier - end - u >>>= 1 - e, z, d, v = nextstate(e, z, d, v) - end - end - e, z, d, v - end -else - function jump(eins::UInt64, zwei::UInt64, drei::UInt64, vier::UInt64) - e = zero(UInt64) - z = zero(UInt64) - d = zero(UInt64) - v = zero(UInt64) - for u ∈ ( - 0x180ec6d33cfd0aba, - 0xd5a61266f0c9392c, - 0xa9582618e03fc9aa, - 0x39abdc4529b1661c - ) - for _ ∈ 0:63 - if u % Bool - e ⊻= eins - z ⊻= zwei - d ⊻= drei - v ⊻= vier - end - u >>>= 1 - e, z, d, v = nextstate(e, z, d, v) + for _ ∈ 0:63 + if u % Bool + e ⊻= eins + z ⊻= zwei + d ⊻= drei + v ⊻= vier end + u >>>= 1 + e, z, d, v = nextstate(e, z, d, v) end - e, z, d, v end -end -@static if VERSION >= v"1.8" - Base.@assume_effects consistent nothrow terminates_globally function seed( - s::Base.BitInteger - ) - i = s % UInt64 - e = z = d = v = zero(UInt64) - increment = 0xa04de531e612e1b9 - while any(iszero, (e, z, d, v)) - e = ((i * 0x90ce6ecbad5e33b5) + increment) - z = ((e * 0x90ce6ecbad5e33b5) + increment) - d = ((z * 0x90ce6ecbad5e33b5) + increment) - v = ((d * 0x90ce6ecbad5e33b5) + increment) - increment += 0x0000000000000002 - end - e, z, d, v - end -else - function seed(s::Base.BitInteger) - i = s % UInt64 - e = z = d = v = zero(UInt64) - increment = 0xa04de531e612e1b9 - while any(iszero, (e, z, d, v)) - e = ((i * 0x90ce6ecbad5e33b5) + increment) - z = ((e * 0x90ce6ecbad5e33b5) + increment) - d = ((z * 0x90ce6ecbad5e33b5) + increment) - v = ((d * 0x90ce6ecbad5e33b5) + increment) - increment += 0x0000000000000002 - end - e, z, d, v + e, z, d, v +end +Base.@assume_effects consistent nothrow terminates_globally function seed( + s::Base.BitInteger +) + i = s % UInt64 + e = z = d = v = zero(UInt64) + increment = 0xa04de531e612e1b9 + while any(iszero, (e, z, d, v)) + e = ((i * 0x90ce6ecbad5e33b5) + increment) + z = ((e * 0x90ce6ecbad5e33b5) + increment) + d = ((z * 0x90ce6ecbad5e33b5) + increment) + v = ((d * 0x90ce6ecbad5e33b5) + increment) + increment += 0x0000000000000002 end + e, z, d, v end seed(s::Integer) = seed((s % UInt64)::UInt64) @@ -389,7 +346,7 @@ end ) where {P,N,W} ptr = pointer(rng) GC.@preserve rng begin - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s @inbounds for n ∈ 0:N vstorea!(ptr, data(eins)[n], simd_integer_register_size() * n) end @@ -410,7 +367,7 @@ end ) where {P} ptr = pointer(rng) GC.@preserve rng begin - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s vstorea!(ptr, eins) vstorea!(ptr, zwei, P * simd_integer_register_size()) vstorea!(ptr, drei, 2P * simd_integer_register_size()) @@ -422,7 +379,7 @@ end s::XoshiroState{0,W} ) where {P,W} ptr = pointer(rng) - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s _eins = data(eins) _zwei = data(zwei) _drei = data(drei) @@ -441,7 +398,7 @@ end s::XoshiroState{1,W} ) where {P,W} ptr = pointer(rng) - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s _eins = data(eins) _zwei = data(zwei) _drei = data(drei) @@ -464,7 +421,7 @@ end s::XoshiroState{3,W} ) where {P,W} ptr = pointer(rng) - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s _eins = data(eins) _zwei = data(zwei) _drei = data(drei) @@ -506,7 +463,7 @@ end if U ≤ P quote $(Expr(:meta, :inline)) - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s _eins = data(eins) _zwei = data(zwei) _drei = data(drei) @@ -591,7 +548,7 @@ end XoshiroState(eins, zwei, drei, vier, s), out end @inline function nextstate(s::XoshiroScalarState) - @unpack eins, zwei, drei, vier = s + (; eins, zwei, drei, vier) = s out = eins + vier out = rotate_right(out, 0x0000000000000017) eins, zwei, drei, vier = nextstate(eins, zwei, drei, vier) diff --git a/test/runtests.jl b/test/runtests.jl index 5eb2c73..c6d0ac1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -65,7 +65,7 @@ function test_serial_rng(f) end @testset "VectorizedRNG.jl" begin - Aqua.test_all(VectorizedRNG)#, ambiguities = VERSION < v"1.6-DEV") + Aqua.test_all(VectorizedRNG) VectorizedRNG.seed!(33) @test isempty(detect_unbound_args(VectorizedRNG)) @testset "Small Crush" begin