test_random.py 2.24 KB
Newer Older
1
import numpy as np
Martin Bauer's avatar
Martin Bauer committed
2

3
import pystencils as ps
Martin Bauer's avatar
Martin Bauer committed
4
from pystencils.rng import PhiloxFourFloats, PhiloxTwoDoubles
5
6


Michael Kuron's avatar
Michael Kuron committed
7
8
9
10
11
12
# curand_Philox4x32_10(make_uint4(124, i, j, 0), make_uint2(0, 0))
philox_reference = np.array([[[3576608082, 1252663339, 1987745383,  348040302],
                              [1032407765,  970978240, 2217005168, 2424826293]],
                             [[2958765206, 3725192638, 2623672781, 1373196132],
                              [ 850605163, 1694561295, 3285694973, 2799652583]]])

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def test_philox_double():
    for target in ('cpu', 'gpu'):
        dh = ps.create_data_handling((2, 2), default_ghost_layers=0, default_target=target)
        f = dh.add_array("f", values_per_cell=2)

        dh.fill('f', 42.0)

        philox_node = PhiloxTwoDoubles(dh.dim)
        assignments = [philox_node,
                       ps.Assignment(f(0), philox_node.result_symbols[0]),
                       ps.Assignment(f(1), philox_node.result_symbols[1])]
        kernel = ps.create_kernel(assignments, target=dh.default_target).compile()

        dh.all_to_gpu()
        dh.run_kernel(kernel, time_step=124)
        dh.all_to_cpu()

        arr = dh.gather_array('f')
        assert np.logical_and(arr <= 1.0, arr >= 0).all()

Michael Kuron's avatar
Michael Kuron committed
33
34
35
36
37
38
        x = philox_reference[:,:,0::2]
        y = philox_reference[:,:,1::2]
        z = x ^ y << (53 - 32)
        double_reference = z * 2.**-53 + 2.**-54
        assert(np.allclose(arr, double_reference, rtol=0, atol=np.finfo(np.float64).eps))

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

def test_philox_float():
    for target in ('cpu', 'gpu'):
        dh = ps.create_data_handling((2, 2), default_ghost_layers=0, default_target=target)
        f = dh.add_array("f", values_per_cell=4)

        dh.fill('f', 42.0)

        philox_node = PhiloxFourFloats(dh.dim)
        assignments = [philox_node] + [ps.Assignment(f(i), philox_node.result_symbols[i]) for i in range(4)]
        kernel = ps.create_kernel(assignments, target=dh.default_target).compile()

        dh.all_to_gpu()
        dh.run_kernel(kernel, time_step=124)
        dh.all_to_cpu()
        arr = dh.gather_array('f')
        assert np.logical_and(arr <= 1.0, arr >= 0).all()
Michael Kuron's avatar
Michael Kuron committed
56
57
58

        float_reference = philox_reference * 2.**-32 + 2.**-33
        assert(np.allclose(arr, float_reference, rtol=0, atol=np.finfo(np.float32).eps))