Skip to content

Commit 75ba3ac

Browse files
committed
Put random functionality in own source and test file.
1 parent cfe8ed0 commit 75ba3ac

File tree

6 files changed

+85
-91
lines changed

6 files changed

+85
-91
lines changed

src/CUDA.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ include("device/intrinsics.jl")
5757
include("device/llvm.jl")
5858
include("device/runtime.jl")
5959
include("device/texture.jl")
60+
include("device/random.jl")
6061

6162
# array essentials
6263
include("pool.jl")

src/device/intrinsics.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ include("intrinsics/memory_dynamic.jl")
4141
include("intrinsics/atomics.jl")
4242
include("intrinsics/misc.jl")
4343
include("intrinsics/wmma.jl")
44-
include("intrinsics/random.jl")
4544

4645
# functionality from libdevice
4746
#
File renamed without changes.

test/device/intrinsics.jl

Lines changed: 0 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,93 +1180,3 @@ end
11801180
end
11811181

11821182
end
1183-
1184-
1185-
1186-
############################################################################################
1187-
1188-
using Random
1189-
1190-
@testset "random numbers" begin
1191-
1192-
n = 256
1193-
1194-
@testset "basic rand($T), seed $seed" for T in (Int32, UInt32, Int64, UInt64, Int128, UInt128,
1195-
Float32, Float64),
1196-
seed in (nothing, #=missing,=# 1234)
1197-
1198-
function apply_seed(seed)
1199-
if seed === missing
1200-
# should result in different numbers across launches
1201-
Random.seed!()
1202-
# XXX: this currently doesn't work, because of the definition in Base,
1203-
# `seed!(r::MersenneTwister=default_rng())`, which breaks overriding
1204-
# `default_rng` with a non-MersenneTwister RNG.
1205-
elseif seed !== nothing
1206-
# should result in the same numbers
1207-
Random.seed!(seed)
1208-
elseif seed === nothing
1209-
# should result in different numbers across launches,
1210-
# as determined by the seed set during module loading.
1211-
end
1212-
end
1213-
1214-
# different kernel invocations should get different numbers
1215-
@testset "across launches" begin
1216-
function kernel(A::AbstractArray{T}, seed) where {T}
1217-
apply_seed(seed)
1218-
tid = threadIdx().x
1219-
A[tid] = rand(T)
1220-
return nothing
1221-
end
1222-
1223-
a = CUDA.zeros(T, n)
1224-
b = CUDA.zeros(T, n)
1225-
1226-
@cuda threads=n kernel(a, seed)
1227-
@cuda threads=n kernel(b, seed)
1228-
1229-
if seed === nothing || seed === missing
1230-
@test all(Array(a) .!= Array(b))
1231-
else
1232-
@test Array(a) == Array(b)
1233-
end
1234-
end
1235-
1236-
# multiple calls to rand should get different numbers
1237-
@testset "across calls" begin
1238-
function kernel(A::AbstractArray{T}, B::AbstractArray{T}, seed) where {T}
1239-
apply_seed(seed)
1240-
tid = threadIdx().x
1241-
A[tid] = rand(T)
1242-
B[tid] = rand(T)
1243-
return nothing
1244-
end
1245-
1246-
a = CUDA.zeros(T, n)
1247-
b = CUDA.zeros(T, n)
1248-
1249-
@cuda threads=n kernel(a, b, seed)
1250-
1251-
@test all(Array(a) .!= Array(b))
1252-
end
1253-
1254-
# different threads should get different numbers
1255-
@testset "across threads" for active_dim in 1:6
1256-
function kernel(A::AbstractArray{T}, seed) where {T}
1257-
apply_seed(seed)
1258-
id = threadIdx().x*threadIdx().y*threadIdx().z*blockIdx().x*blockIdx().y*blockIdx().z
1259-
A[id] = rand(T)
1260-
return nothing
1261-
end
1262-
1263-
tx, ty, tz, bx, by, bz = [dim == active_dim ? 2 : 1 for dim in 1:6]
1264-
a = CUDA.zeros(T, 2)
1265-
1266-
@cuda threads=(tx, ty, tz) blocks=(bx, by, bz) kernel(a, seed)
1267-
1268-
@test Array(a)[1] != Array(a)[2]
1269-
end
1270-
end
1271-
1272-
end

test/device/random.jl

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using Random
2+
3+
n = 256
4+
5+
@testset "basic rand($T), seed $seed" for T in (Int32, UInt32, Int64, UInt64, Int128, UInt128,
6+
Float32, Float64),
7+
seed in (nothing, #=missing,=# 1234)
8+
9+
function apply_seed(seed)
10+
if seed === missing
11+
# should result in different numbers across launches
12+
Random.seed!()
13+
# XXX: this currently doesn't work, because of the definition in Base,
14+
# `seed!(r::MersenneTwister=default_rng())`, which breaks overriding
15+
# `default_rng` with a non-MersenneTwister RNG.
16+
elseif seed !== nothing
17+
# should result in the same numbers
18+
Random.seed!(seed)
19+
elseif seed === nothing
20+
# should result in different numbers across launches,
21+
# as determined by the seed set during module loading.
22+
end
23+
end
24+
25+
# different kernel invocations should get different numbers
26+
@testset "across launches" begin
27+
function kernel(A::AbstractArray{T}, seed) where {T}
28+
apply_seed(seed)
29+
tid = threadIdx().x
30+
A[tid] = rand(T)
31+
return nothing
32+
end
33+
34+
a = CUDA.zeros(T, n)
35+
b = CUDA.zeros(T, n)
36+
37+
@cuda threads=n kernel(a, seed)
38+
@cuda threads=n kernel(b, seed)
39+
40+
if seed === nothing || seed === missing
41+
@test all(Array(a) .!= Array(b))
42+
else
43+
@test Array(a) == Array(b)
44+
end
45+
end
46+
47+
# multiple calls to rand should get different numbers
48+
@testset "across calls" begin
49+
function kernel(A::AbstractArray{T}, B::AbstractArray{T}, seed) where {T}
50+
apply_seed(seed)
51+
tid = threadIdx().x
52+
A[tid] = rand(T)
53+
B[tid] = rand(T)
54+
return nothing
55+
end
56+
57+
a = CUDA.zeros(T, n)
58+
b = CUDA.zeros(T, n)
59+
60+
@cuda threads=n kernel(a, b, seed)
61+
62+
@test all(Array(a) .!= Array(b))
63+
end
64+
65+
# different threads should get different numbers
66+
@testset "across threads" for active_dim in 1:6
67+
function kernel(A::AbstractArray{T}, seed) where {T}
68+
apply_seed(seed)
69+
id = threadIdx().x*threadIdx().y*threadIdx().z*blockIdx().x*blockIdx().y*blockIdx().z
70+
A[id] = rand(T)
71+
return nothing
72+
end
73+
74+
tx, ty, tz, bx, by, bz = [dim == active_dim ? 2 : 1 for dim in 1:6]
75+
a = CUDA.zeros(T, 2)
76+
77+
@cuda threads=(tx, ty, tz) blocks=(bx, by, bz) kernel(a, seed)
78+
79+
@test Array(a)[1] != Array(a)[2]
80+
end
81+
end

test/runtests.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ if Sys.ARCH == :aarch64
171171
# CUFFT segfaults on ARM
172172
push!(skip_tests, "cufft")
173173
end
174+
if VERSION < v"1.6.1-"
175+
push!(skip_tests, "device/random")
176+
end
174177
for (i, test) in enumerate(skip_tests)
175178
# we find tests by scanning the file system, so make sure the path separator matches
176179
skip_tests[i] = replace(test, '/'=>Base.Filesystem.path_separator)

0 commit comments

Comments
 (0)