diff --git a/pystencils/cpu/kernelcreation.py b/pystencils/cpu/kernelcreation.py index c84ed8d2b6764c4f67db7c8235fa1acfa3e63752..c28e7d0ad686cad3f1689f1c1e8c67a0ab40def5 100644 --- a/pystencils/cpu/kernelcreation.py +++ b/pystencils/cpu/kernelcreation.py @@ -19,7 +19,7 @@ AssignmentOrAstNodeList = List[Union[Assignment, ast.Node]] def create_kernel(assignments: AssignmentOrAstNodeList, function_name: str = "kernel", type_info='double', split_groups=(), iteration_slice=None, ghost_layers=None, - skip_independence_check=False, optimizations=optims_pystencils_cpu) -> KernelFunction: + skip_independence_check=False, sympy_optimizations=optims_pystencils_cpu) -> KernelFunction: """Creates an abstract syntax tree for a kernel function, by taking a list of update rules. Loops are created according to the field accesses in the equations. @@ -55,9 +55,9 @@ def create_kernel(assignments: AssignmentOrAstNodeList, function_name: str = "ke else: raise ValueError("Term has to be field access or symbol") - if optimizations is None: - optimizations = optims_pystencils_cpu - assignments = optimize_assignments(assignments, optimizations) + if sympy_optimizations is None: + sympy_optimizations = optims_pystencils_cpu + assignments = optimize_assignments(assignments, sympy_optimizations) fields_read, fields_written, assignments = add_types(assignments, type_info, not skip_independence_check) all_fields = fields_read.union(fields_written) @@ -99,7 +99,7 @@ def create_indexed_kernel(assignments: AssignmentOrAstNodeList, function_name="kernel", type_info=None, coordinate_names=('x', 'y', 'z'), - optimizations=optims_pystencils_cpu) -> KernelFunction: + sympy_optimizations=optims_pystencils_cpu) -> KernelFunction: """ Similar to :func:`create_kernel`, but here not all cells of a field are updated but only cells with coordinates which are stored in an index field. This traversal method can e.g. be used for boundary handling. @@ -116,10 +116,10 @@ def create_indexed_kernel(assignments: AssignmentOrAstNodeList, function_name: see documentation of :func:`create_kernel` coordinate_names: name of the coordinate fields in the struct data type """ - if optimizations is None: - optimizations = optims_pystencils_cpu + if sympy_optimizations is None: + sympy_optimizations = optims_pystencils_cpu - assignments = optimize_assignments(assignments, optimizations) + assignments = optimize_assignments(assignments, sympy_optimizations) fields_read, fields_written, assignments = add_types(assignments, type_info, check_independence_condition=False) all_fields = fields_read.union(fields_written) diff --git a/pystencils/gpucuda/kernelcreation.py b/pystencils/gpucuda/kernelcreation.py index 3ac806e6cbc1838e2255b8cd12b057d238c0d5c8..12c7bd3c97dd8f8cc17f2641dbd442b615110082 100644 --- a/pystencils/gpucuda/kernelcreation.py +++ b/pystencils/gpucuda/kernelcreation.py @@ -3,18 +3,24 @@ from pystencils.data_types import BasicType, StructType, TypedSymbol from pystencils.field import Field, FieldType from pystencils.gpucuda.cudajit import make_python_function from pystencils.gpucuda.indexing import BlockIndexing -from pystencils.math_optimizations import optims_pystencils_gpu, optimize_assignments +from pystencils.math_optimizations import optimize_assignments, optims_pystencils_gpu from pystencils.transformations import ( add_types, get_base_buffer_index, get_common_shape, parse_base_pointer_info, resolve_buffer_accesses, resolve_field_accesses, unify_shape_symbols) -def create_cuda_kernel(assignments, function_name="kernel", type_info=None, indexing_creator=BlockIndexing, - iteration_slice=None, ghost_layers=None, skip_independence_check=False, optimizations=None): +def create_cuda_kernel(assignments, + function_name="kernel", + type_info=None, + indexing_creator=BlockIndexing, + iteration_slice=None, + ghost_layers=None, + skip_independence_check=False, + sympy_optimizations=None): - if optimizations is None: - optimizations = optims_pystencils_gpu - assignments = optimize_assignments(assignments, optimizations) + if sympy_optimizations is None: + sympy_optimizations = optims_pystencils_gpu + assignments = optimize_assignments(assignments, sympy_optimizations) fields_read, fields_written, assignments = add_types(assignments, type_info, not skip_independence_check) all_fields = fields_read.union(fields_written) @@ -92,11 +98,16 @@ def create_cuda_kernel(assignments, function_name="kernel", type_info=None, inde return ast -def created_indexed_cuda_kernel(assignments, index_fields, function_name="kernel", type_info=None, - coordinate_names=('x', 'y', 'z'), indexing_creator=BlockIndexing, optimizations=None): - if optimizations is None: - optimizations = optims_pystencils_gpu - assignments = optimize_assignments(assignments, optimizations) +def created_indexed_cuda_kernel(assignments, + index_fields, + function_name="kernel", + type_info=None, + coordinate_names=('x', 'y', 'z'), + indexing_creator=BlockIndexing, + sympy_optimizations=None): + if sympy_optimizations is None: + sympy_optimizations = optims_pystencils_gpu + assignments = optimize_assignments(assignments, sympy_optimizations) fields_read, fields_written, assignments = add_types(assignments, type_info, check_independence_condition=False) all_fields = fields_read.union(fields_written) diff --git a/pystencils/kernelcreation.py b/pystencils/kernelcreation.py index ae84332cbe6739c34a17eba967bad77d5b402fed..79c3d04d10224b63733bbbc8b88c9ebb093e5ce6 100644 --- a/pystencils/kernelcreation.py +++ b/pystencils/kernelcreation.py @@ -15,7 +15,7 @@ from pystencils.transformations import ( def create_kernel(assignments, target='cpu', data_type="double", iteration_slice=None, ghost_layers=None, skip_independence_check=False, cpu_openmp=False, cpu_vectorize_info=None, cpu_blocking=None, - gpu_indexing='block', gpu_indexing_params=MappingProxyType({}), optimizations=None): + gpu_indexing='block', gpu_indexing_params=MappingProxyType({}), sympy_optimizations=None): """ Creates abstract syntax tree (AST) of kernel, using a list of update equations. @@ -75,7 +75,7 @@ def create_kernel(assignments, target='cpu', data_type="double", iteration_slice from pystencils.cpu import add_openmp ast = create_kernel(assignments, type_info=data_type, split_groups=split_groups, iteration_slice=iteration_slice, ghost_layers=ghost_layers, - skip_independence_check=skip_independence_check, optimizations=optimizations) + skip_independence_check=skip_independence_check, sympy_optimizations=sympy_optimizations) omp_collapse = None if cpu_blocking: omp_collapse = loop_blocking(ast, cpu_blocking) @@ -91,15 +91,21 @@ def create_kernel(assignments, target='cpu', data_type="double", iteration_slice return ast elif target == 'llvm': from pystencils.llvm import create_kernel - ast = create_kernel(assignments, type_info=data_type, split_groups=split_groups, - iteration_slice=iteration_slice, ghost_layers=ghost_layers, optimizations=optimizations) + ast = create_kernel(assignments, + type_info=data_type, + split_groups=split_groups, + iteration_slice=iteration_slice, + ghost_layers=ghost_layers, + sympy_optimizations=sympy_optimizations) return ast elif target == 'gpu': from pystencils.gpucuda import create_cuda_kernel ast = create_cuda_kernel(assignments, type_info=data_type, indexing_creator=indexing_creator_from_params(gpu_indexing, gpu_indexing_params), - iteration_slice=iteration_slice, ghost_layers=ghost_layers, - skip_independence_check=skip_independence_check, optimizations=optimizations) + iteration_slice=iteration_slice, + ghost_layers=ghost_layers, + skip_independence_check=skip_independence_check, + sympy_optimizations=sympy_optimizations) return ast else: raise ValueError("Unknown target %s. Has to be one of 'cpu', 'gpu' or 'llvm' " % (target,)) @@ -107,7 +113,7 @@ def create_kernel(assignments, target='cpu', data_type="double", iteration_slice def create_indexed_kernel(assignments, index_fields, target='cpu', data_type="double", coordinate_names=('x', 'y', 'z'), cpu_openmp=True, gpu_indexing='block', gpu_indexing_params=MappingProxyType({}), - optimizations=None): + sympy_optimizations=None): """ Similar to :func:`create_kernel`, but here not all cells of a field are updated but only cells with coordinates which are stored in an index field. This traversal method can e.g. be used for boundary handling. @@ -151,7 +157,7 @@ def create_indexed_kernel(assignments, index_fields, target='cpu', data_type="do from pystencils.cpu import create_indexed_kernel from pystencils.cpu import add_openmp ast = create_indexed_kernel(assignments, index_fields=index_fields, type_info=data_type, - coordinate_names=coordinate_names, optimizations=optimizations) + coordinate_names=coordinate_names, sympy_optimizations=sympy_optimizations) if cpu_openmp: add_openmp(ast, num_threads=cpu_openmp) return ast @@ -162,14 +168,14 @@ def create_indexed_kernel(assignments, index_fields, target='cpu', data_type="do idx_creator = indexing_creator_from_params(gpu_indexing, gpu_indexing_params) ast = created_indexed_cuda_kernel(assignments, index_fields, type_info=data_type, coordinate_names=coordinate_names, indexing_creator=idx_creator, - optimizations=optimizations) + sympy_optimizations=sympy_optimizations) return ast else: raise ValueError("Unknown target %s. Has to be either 'cpu' or 'gpu'" % (target,)) def create_staggered_kernel(staggered_field, expressions, subexpressions=(), target='cpu', - gpu_exclusive_conditions=False, optimizations=None, **kwargs): + gpu_exclusive_conditions=False, sympy_optimizations=None, **kwargs): """Kernel that updates a staggered field. .. image:: /img/staggered_grid.svg @@ -256,8 +262,7 @@ def create_staggered_kernel(staggered_field, expressions, subexpressions=(), tar ast = create_kernel(final_assignments, ghost_layers=ghost_layers, target=target, - optimizations=optimizations, - + sympy_optimizations=sympy_optimizations, **kwargs) if target == 'cpu': diff --git a/pystencils/llvm/kernelcreation.py b/pystencils/llvm/kernelcreation.py index 1bffaa845d982722dbba0d7b87a6dd9d6f86355a..86f26ef6f388d95446f323b5c8965b0d90ff15af 100644 --- a/pystencils/llvm/kernelcreation.py +++ b/pystencils/llvm/kernelcreation.py @@ -3,7 +3,7 @@ from pystencils.transformations import insert_casts def create_kernel(assignments, function_name="kernel", type_info=None, split_groups=(), - iteration_slice=None, ghost_layers=None, optimizations=None): + iteration_slice=None, ghost_layers=None, sympy_optimizations=None): """ Creates an abstract syntax tree for a kernel function, by taking a list of update rules. @@ -32,7 +32,7 @@ def create_kernel(assignments, function_name="kernel", type_info=None, split_gro split_groups, iteration_slice, ghost_layers, - optimizations=optimizations) + sympy_optimizations=sympy_optimizations) code.body = insert_casts(code.body) code._compile_function = make_python_function code._backend = 'llvm' diff --git a/pystencils_tests/test_sympy_optimizations.py b/pystencils_tests/test_sympy_optimizations.py index 080205e3aecade863b26c1bd4c7227fe3e111c22..ff3b0fbbdeb26bd79014a89c2b61e13de4173e9e 100644 --- a/pystencils_tests/test_sympy_optimizations.py +++ b/pystencils_tests/test_sympy_optimizations.py @@ -48,7 +48,7 @@ def test_do_not_evaluate_constant_terms(): x[0, 0]: -sp.cos(1) + y[0, 0] }) - ast = pystencils.create_kernel(assignments, target=target, optimizations=optimizations) + ast = pystencils.create_kernel(assignments, target=target, sympy_optimizations=optimizations) code = str(pystencils.show_code(ast)) assert 'cos(' in code print(code)