def test_variable_sized_fields(): src_field = Field.create_generic('src', spatial_dimensions=2) dst_field = Field.create_generic('dst', spatial_dimensions=2) update_rule = Assignment(dst_field[0, 0], (src_field[0, 1] + src_field[0, -1] + src_field[1, 0] + src_field[-1, 0]) / 4) ast = create_cuda_kernel(sympy_cse_on_assignment_list([update_rule])) kernel = make_python_function(ast) size = (3, 3) src_arr = np.random.rand(*size) src_arr = add_ghost_layers(src_arr) dst_arr = np.zeros_like(src_arr) gpu_src_arr = gpuarray.to_gpu(src_arr) gpu_dst_arr = gpuarray.to_gpu(dst_arr) kernel(src=gpu_src_arr, dst=gpu_dst_arr) gpu_dst_arr.get(dst_arr) stencil = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) / 4.0 reference = convolve(remove_ghost_layers(src_arr), stencil, mode='constant', cval=0.0) reference = add_ghost_layers(reference) np.testing.assert_almost_equal(reference, dst_arr)
def _generate_fields(dt=np.uint64, num_directions=1, layout='numpy'): field_sizes = FIELD_SIZES if num_directions > 1: field_sizes = [s + (num_directions, ) for s in field_sizes] fields = [] for size in field_sizes: field_layout = layout_string_to_tuple(layout, len(size)) src_arr = create_numpy_array_with_layout(size, field_layout, dtype=dt) array_data = np.reshape(np.arange(1, int(np.prod(size) + 1)), size) # Use flat iterator to input data into the array src_arr.flat = add_ghost_layers( array_data, index_dimensions=1 if num_directions > 1 else 0).astype(dt).flat dst_arr = np.zeros(src_arr.shape, dtype=dt) buffer_arr = np.zeros(np.prod(src_arr.shape), dtype=dt) fields.append((src_arr, dst_arr, buffer_arr)) return fields
def _generate_fields(dt=np.uint8, stencil_directions=1, layout='numpy'): pytest.importorskip('pycuda') field_sizes = FIELD_SIZES if stencil_directions > 1: field_sizes = [s + (stencil_directions, ) for s in field_sizes] fields = [] for size in field_sizes: field_layout = layout_string_to_tuple(layout, len(size)) src_arr = create_numpy_array_with_layout(size, field_layout).astype(dt) array_data = np.reshape(np.arange(1, int(np.prod(size) + 1)), size) # Use flat iterator to input data into the array src_arr.flat = add_ghost_layers( array_data, index_dimensions=1 if stencil_directions > 1 else 0).astype(dt).flat gpu_src_arr = gpuarray.to_gpu(src_arr) gpu_dst_arr = gpuarray.empty_like(gpu_src_arr) size = int(np.prod(src_arr.shape)) gpu_buffer_arr = gpuarray.zeros(size, dtype=dt) fields.append((src_arr, gpu_src_arr, gpu_dst_arr, gpu_buffer_arr)) return fields