Skip to content
Snippets Groups Projects
Select Git revision
  • 3c8507ba963c5e5c0d7006cd573134a40e52f26f
  • 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_base_pointer_specification.py

Blame
  • test_base_pointer_specification.py 2.52 KiB
    import pytest
    
    from pystencils import Assignment, CreateKernelConfig, Target, fields, create_kernel, get_code_str
    
    
    @pytest.mark.parametrize('target', (Target.CPU, Target.GPU))
    def test_intermediate_base_pointer(target):
        x = fields(f'x: double[3d]')
        y = fields(f'y: double[3d]')
        update = Assignment(x.center, y.center)
    
        config = CreateKernelConfig(base_pointer_specification=[], target=target)
        ast = create_kernel(update, config=config)
        code = get_code_str(ast)
    
        # no intermediate base pointers are created
        assert "_data_x[_stride_x_0*ctr_0 + _stride_x_1*ctr_1 + _stride_x_2*ctr_2] = " \
               "_data_y[_stride_y_0*ctr_0 + _stride_y_1*ctr_1 + _stride_y_2*ctr_2];" in code
    
    
        config = CreateKernelConfig(base_pointer_specification=[[0]], target=target)
        ast = create_kernel(update, config=config)
        code = get_code_str(ast)
    
        # intermediate base pointers for y and z
        assert "double * RESTRICT  _data_x_10_20 = _data_x + _stride_x_1*ctr_1 + _stride_x_2*ctr_2;" in code
        assert " double * RESTRICT _data_y_10_20 = _data_y + _stride_y_1*ctr_1 + _stride_y_2*ctr_2;" in code
        assert "_data_x_10_20[_stride_x_0*ctr_0] = _data_y_10_20[_stride_y_0*ctr_0];" in code
    
        config = CreateKernelConfig(base_pointer_specification=[[1]], target=target)
        ast = create_kernel(update, config=config)
        code = get_code_str(ast)
    
        # intermediate base pointers for x and z
        assert "double * RESTRICT  _data_x_00_20 = _data_x + _stride_x_0*ctr_0 + _stride_x_2*ctr_2;" in code
        assert "double * RESTRICT _data_y_00_20 = _data_y + _stride_y_0*ctr_0 + _stride_y_2*ctr_2;" in code
        assert "_data_x_00_20[_stride_x_1*ctr_1] = _data_y_00_20[_stride_y_1*ctr_1];" in code
    
        config = CreateKernelConfig(base_pointer_specification=[[2]], target=target)
        ast = create_kernel(update, config=config)
        code = get_code_str(ast)
    
        # intermediate base pointers for x and y
        assert "double * RESTRICT  _data_x_00_10 = _data_x + _stride_x_0*ctr_0 + _stride_x_1*ctr_1;" in code
        assert "double * RESTRICT _data_y_00_10 = _data_y + _stride_y_0*ctr_0 + _stride_y_1*ctr_1;" in code
        assert "_data_x_00_10[_stride_x_2*ctr_2] = _data_y_00_10[_stride_y_2*ctr_2];" in code
    
        config = CreateKernelConfig(target=target)
        ast = create_kernel(update, config=config)
        code = get_code_str(ast)
    
        # by default no intermediate base pointers are created
        assert "_data_x[_stride_x_0*ctr_0 + _stride_x_1*ctr_1 + _stride_x_2*ctr_2] = " \
               "_data_y[_stride_y_0*ctr_0 + _stride_y_1*ctr_1 + _stride_y_2*ctr_2];" in code