Skip to content
Snippets Groups Projects
Select Git revision
  • ae69d3d3b700f608c93bbd442a59654436603de7
  • master default protected
  • v2.0-dev protected
  • zikeliml/Task-96-dotExporterForAST
  • zikeliml/124-rework-tutorials
  • fma
  • fhennig/v2.0-deprecations
  • holzer-master-patch-46757
  • 66-absolute-access-is-probably-not-copied-correctly-after-_eval_subs
  • gpu_bufferfield_fix
  • hyteg
  • vectorization_sqrt_fix
  • target_dh_refactoring
  • const_fix
  • improved_comm
  • gpu_liveness_opts
  • release/1.3.7 protected
  • release/1.3.6 protected
  • release/2.0.dev0 protected
  • release/1.3.5 protected
  • release/1.3.4 protected
  • release/1.3.3 protected
  • release/1.3.2 protected
  • release/1.3.1 protected
  • release/1.3 protected
  • release/1.2 protected
  • release/1.1.1 protected
  • release/1.1 protected
  • release/1.0.1 protected
  • release/1.0 protected
  • release/0.4.4 protected
  • last/Kerncraft
  • last/OpenCL
  • last/LLVM
  • release/0.4.3 protected
  • release/0.4.2 protected
36 results

test_random.py

Blame
  • test_random.py 3.46 KiB
    import numpy as np
    
    import pystencils as ps
    from pystencils.rng import PhiloxFourFloats, PhiloxTwoDoubles, AESNIFourFloats, AESNITwoDoubles
    
    
    # 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]]])
    
    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()
    
            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))
    
    
    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()
    
            float_reference = philox_reference * 2.**-32 + 2.**-33
            assert(np.allclose(arr, float_reference, rtol=0, atol=np.finfo(np.float32).eps))
    
    def test_aesni_double():
        dh = ps.create_data_handling((2, 2), default_ghost_layers=0, default_target="cpu")
        f = dh.add_array("f", values_per_cell=2)
    
        dh.fill('f', 42.0)
    
        aesni_node = AESNITwoDoubles(dh.dim)
        assignments = [aesni_node,
                       ps.Assignment(f(0), aesni_node.result_symbols[0]),
                       ps.Assignment(f(1), aesni_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()
    
    
    def test_aesni_float():
        dh = ps.create_data_handling((2, 2), default_ghost_layers=0, default_target="cpu")
        f = dh.add_array("f", values_per_cell=4)
    
        dh.fill('f', 42.0)
    
        aesni_node = AESNIFourFloats(dh.dim)
        assignments = [aesni_node] + [ps.Assignment(f(i), aesni_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()