From c41d7bd2de50b7d2692cd95a6ee0089cb34dac94 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Keck <Jean-Baptiste.Keck@imag.fr> Date: Mon, 4 Jul 2016 16:16:42 +0200 Subject: [PATCH] stretching codegen the beginnings --- hysop/codegen/base/codegen.py | 2 +- hysop/codegen/base/function_codegen.py | 10 +-- hysop/codegen/base/kernel_codegen.py | 10 +-- hysop/codegen/base/opencl_codegen.py | 8 +-- hysop/codegen/base/struct_codegen.py | 6 +- hysop/codegen/base/variables.py | 6 +- hysop/codegen/functions/apply_stencil.py | 12 ++-- hysop/codegen/functions/cache_load.py | 12 ++-- hysop/codegen/functions/compute_index.py | 10 +-- hysop/codegen/functions/empty.py | 10 +-- hysop/codegen/functions/gradient.py | 18 +++--- hysop/codegen/kernels/empty.py | 8 +-- hysop/codegen/kernels/stretching.py | 20 +++--- .../codegen/maths/runge_kutta/runge_kutta.py | 2 +- hysop/codegen/structs/mesh_info.py | 4 +- hysop/gpu/gpu_stretching.py | 61 +++++++++++-------- 16 files changed, 106 insertions(+), 93 deletions(-) diff --git a/hysop/codegen/base/codegen.py b/hysop/codegen/base/codegen.py index 57684d9bb..9f7074b2e 100644 --- a/hysop/codegen/base/codegen.py +++ b/hysop/codegen/base/codegen.py @@ -7,7 +7,7 @@ import itertools as it import pyopencl as cl -from base.utils import WriteOnceDict, VarDict +from hysop.codegen.base.utils import WriteOnceDict, VarDict class CodeGenerator(object): diff --git a/hysop/codegen/base/function_codegen.py b/hysop/codegen/base/function_codegen.py index 9e44bf24d..9745fa31f 100644 --- a/hysop/codegen/base/function_codegen.py +++ b/hysop/codegen/base/function_codegen.py @@ -2,11 +2,11 @@ import pyopencl as cl from contextlib import contextmanager -from base.codegen import CodeGenerator -from base.opencl_codegen import OpenClCodeGenerator -from base.utils import ArgDict -from base.types import TypeGen, OpenClTypeGen -from base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc +from hysop.codegen.base.codegen import CodeGenerator +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.utils import ArgDict +from hysop.codegen.base.types import TypeGen, OpenClTypeGen +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc class FunctionBase(object): diff --git a/hysop/codegen/base/kernel_codegen.py b/hysop/codegen/base/kernel_codegen.py index 8e4de660e..c6b13213d 100644 --- a/hysop/codegen/base/kernel_codegen.py +++ b/hysop/codegen/base/kernel_codegen.py @@ -2,11 +2,11 @@ from contextlib import contextmanager import pyopencl as cl -from base.opencl_codegen import OpenClCodeGenerator -from base.function_codegen import FunctionBase -from base.utils import VarDict, ArgDict, WriteOnceDict -from base.types import OpenClTypeGen -from base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.function_codegen import FunctionBase +from hysop.codegen.base.utils import VarDict, ArgDict, WriteOnceDict +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc class KernelBase(FunctionBase): def __init__(self, kname, vec_type_hint=None, diff --git a/hysop/codegen/base/opencl_codegen.py b/hysop/codegen/base/opencl_codegen.py index b12d7a235..c5f12f045 100644 --- a/hysop/codegen/base/opencl_codegen.py +++ b/hysop/codegen/base/opencl_codegen.py @@ -2,10 +2,10 @@ import pyopencl as cl from contextlib import contextmanager -from base.codegen import CodeGenerator -from base.types import OpenClTypeGen -from base.utils import VarDict -from base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc +from hysop.codegen.base.codegen import CodeGenerator +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import VarDict +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin, CodegenVectorClBuiltinFunc class OpenClCodeGenerator(CodeGenerator): default_keywords = { diff --git a/hysop/codegen/base/struct_codegen.py b/hysop/codegen/base/struct_codegen.py index 8607822f0..adbb2807c 100644 --- a/hysop/codegen/base/struct_codegen.py +++ b/hysop/codegen/base/struct_codegen.py @@ -5,9 +5,9 @@ import pyopencl.tools import numpy as np import re -from base.types import np_dtype -from base.codegen import CodeGenerator -from base.variables import VarDict, CodegenVariable, CodegenVector, CodegenStruct, CodegenVectorClBuiltin +from hysop.codegen.base.types import np_dtype +from hysop.codegen.base.codegen import CodeGenerator +from hysop.codegen.base.variables import VarDict, CodegenVariable, CodegenVector, CodegenStruct, CodegenVectorClBuiltin class StructCodeGenerator(CodeGenerator): def __init__(self,name,numpy_dtype,typegen, diff --git a/hysop/codegen/base/variables.py b/hysop/codegen/base/variables.py index 0ff7180fe..953391c28 100644 --- a/hysop/codegen/base/variables.py +++ b/hysop/codegen/base/variables.py @@ -1,9 +1,9 @@ import re -import base.types -from base.utils import VarDict -from base.types import OpenClTypeGen +import hysop.codegen.base.types +from hysop.codegen.base.utils import VarDict +from hysop.codegen.base.types import OpenClTypeGen class CodegenVariable(object): def __init__(self,name,dtype,typegen, diff --git a/hysop/codegen/functions/apply_stencil.py b/hysop/codegen/functions/apply_stencil.py index 3db6b6c5e..78d20a128 100644 --- a/hysop/codegen/functions/apply_stencil.py +++ b/hysop/codegen/functions/apply_stencil.py @@ -1,11 +1,11 @@ -from base.opencl_codegen import OpenClCodeGenerator -from base.function_codegen import OpenClFunctionCodeGenerator -from base.variables import CodegenVariable, CodegenVectorClBuiltin -from base.types import OpenClTypeGen -from base.utils import ArgDict +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.function_codegen import OpenClFunctionCodeGenerator +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import ArgDict -from maths.stencil.stencil import Stencil +from hysop.codegen.maths.stencil.stencil import Stencil class ApplyStencilFunction(OpenClFunctionCodeGenerator): diff --git a/hysop/codegen/functions/cache_load.py b/hysop/codegen/functions/cache_load.py index b9067ae5f..7c994a8eb 100644 --- a/hysop/codegen/functions/cache_load.py +++ b/hysop/codegen/functions/cache_load.py @@ -2,13 +2,13 @@ import contextlib from contextlib import contextmanager -from base.opencl_codegen import OpenClCodeGenerator -from base.function_codegen import FunctionCodeGenerator -from base.variables import CodegenVariable, CodegenVectorClBuiltin -from base.types import OpenClTypeGen -from base.utils import ArgDict +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.function_codegen import FunctionCodeGenerator +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import ArgDict -from functions.compute_index import ComputeIndexFunction +from hysop.codegen.functions.compute_index import ComputeIndexFunction class CacheLoadFunction(FunctionCodeGenerator): diff --git a/hysop/codegen/functions/compute_index.py b/hysop/codegen/functions/compute_index.py index 6d3a1b7e0..3047d6064 100644 --- a/hysop/codegen/functions/compute_index.py +++ b/hysop/codegen/functions/compute_index.py @@ -1,10 +1,10 @@ -from base.opencl_codegen import OpenClCodeGenerator -from base.function_codegen import OpenClFunctionCodeGenerator -from base.variables import CodegenVariable, CodegenVectorClBuiltin -from base.types import OpenClTypeGen -from base.utils import ArgDict +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.function_codegen import OpenClFunctionCodeGenerator +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import ArgDict class ComputeIndexFunction(OpenClFunctionCodeGenerator): diff --git a/hysop/codegen/functions/empty.py b/hysop/codegen/functions/empty.py index 49b7f7993..7b5595692 100644 --- a/hysop/codegen/functions/empty.py +++ b/hysop/codegen/functions/empty.py @@ -1,9 +1,9 @@ -from base.codegen import CodeGenerator -from base.function_codegen import FunctionCodeGenerator -from base.variables import CodegenVariable -from base.types import TypeGen -from base.utils import ArgDict +from hysop.codegen.base.codegen import CodeGenerator +from hysop.codegen.base.function_codegen import FunctionCodeGenerator +from hysop.codegen.base.variables import CodegenVariable +from hysop.codegen.base.types import TypeGen +from hysop.codegen.base.utils import ArgDict class EmptyFunction(FunctionCodeGenerator): diff --git a/hysop/codegen/functions/gradient.py b/hysop/codegen/functions/gradient.py index abcdae1aa..132f1ab97 100644 --- a/hysop/codegen/functions/gradient.py +++ b/hysop/codegen/functions/gradient.py @@ -1,17 +1,17 @@ import numpy as np -from base.opencl_codegen import OpenClCodeGenerator -from base.function_codegen import OpenClFunctionCodeGenerator -from base.variables import CodegenVariable, CodegenVectorClBuiltin -from base.types import OpenClTypeGen -from base.utils import ArgDict +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.function_codegen import OpenClFunctionCodeGenerator +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import ArgDict -from maths.stencil.stencil import Stencil1D, Stencil +from hysop.codegen.maths.stencil.stencil import Stencil1D, Stencil -from functions.compute_index import ComputeIndexFunction -from functions.cache_load import CacheLoadFunction -from functions.apply_stencil import ApplyStencilFunction +from hysop.codegen.functions.compute_index import ComputeIndexFunction +from hysop.codegen.functions.cache_load import CacheLoadFunction +from hysop.codegen.functions.apply_stencil import ApplyStencilFunction class GradientFunction(OpenClFunctionCodeGenerator): diff --git a/hysop/codegen/kernels/empty.py b/hysop/codegen/kernels/empty.py index c1611327b..70b5f3d5b 100644 --- a/hysop/codegen/kernels/empty.py +++ b/hysop/codegen/kernels/empty.py @@ -1,8 +1,8 @@ -from base.variables import CodegenVectorClBuiltin -from base.kernel_codegen import KernelCodeGenerator -from base.types import OpenClTypeGen -from base.utils import ArgDict +from hysop.codegen.base.variables import CodegenVectorClBuiltin +from hysop.codegen.base.kernel_codegen import KernelCodeGenerator +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import ArgDict class EmptyKernel(KernelCodeGenerator): diff --git a/hysop/codegen/kernels/stretching.py b/hysop/codegen/kernels/stretching.py index 77fd9662c..b88b5360e 100644 --- a/hysop/codegen/kernels/stretching.py +++ b/hysop/codegen/kernels/stretching.py @@ -2,26 +2,26 @@ import operator import numpy as np -from base.opencl_codegen import OpenClCodeGenerator -from base.kernel_codegen import KernelCodeGenerator -from base.variables import CodegenVariable, CodegenVectorClBuiltin -from base.types import OpenClTypeGen -from base.utils import WriteOnceDict, ArgDict +from hysop.codegen.base.opencl_codegen import OpenClCodeGenerator +from hysop.codegen.base.kernel_codegen import KernelCodeGenerator +from hysop.codegen.base.variables import CodegenVariable, CodegenVectorClBuiltin +from hysop.codegen.base.types import OpenClTypeGen +from hysop.codegen.base.utils import WriteOnceDict, ArgDict -from structs.mesh_info import MeshInfoStruct +from hysop.codegen.structs.mesh_info import MeshInfoStruct -from functions.compute_index import ComputeIndexFunction -from functions.gradient import GradientFunction +from hysop.codegen.functions.compute_index import ComputeIndexFunction +from hysop.codegen.functions.gradient import GradientFunction class CachedStretchingKernel(KernelCodeGenerator): def __init__(self, typegen, work_dim, order=2, - cached=True, ftype=None, device=None,context=None, known_vars = None, symbolic_mode=True): - + + cached = True ftype = ftype if ftype is not None else typegen.fbtype kernel_reqs = self.build_requirements(typegen,work_dim, order, cached) diff --git a/hysop/codegen/maths/runge_kutta/runge_kutta.py b/hysop/codegen/maths/runge_kutta/runge_kutta.py index d76767d61..8f01365bf 100644 --- a/hysop/codegen/maths/runge_kutta/runge_kutta.py +++ b/hysop/codegen/maths/runge_kutta/runge_kutta.py @@ -1,6 +1,6 @@ import numpy as np -from runge_kutta_coeffs import Itype,Qtype,rk_params, available_methods +from hysop.codegen.runge_kutta_coeffs import Itype,Qtype,rk_params, available_methods # default methods to dump rational and integers expression to string diff --git a/hysop/codegen/structs/mesh_info.py b/hysop/codegen/structs/mesh_info.py index 055fb5392..b525d4214 100644 --- a/hysop/codegen/structs/mesh_info.py +++ b/hysop/codegen/structs/mesh_info.py @@ -1,7 +1,7 @@ import numpy as np -from base.struct_codegen import StructCodeGenerator -from base.types import OpenClTypeGen +from hysop.codegen.base.struct_codegen import StructCodeGenerator +from hysop.codegen.base.types import OpenClTypeGen class MeshInfoStruct(StructCodeGenerator): def __init__(self, typegen, typedef=None, device=None,context=None): diff --git a/hysop/gpu/gpu_stretching.py b/hysop/gpu/gpu_stretching.py index a99847653..7695c72be 100644 --- a/hysop/gpu/gpu_stretching.py +++ b/hysop/gpu/gpu_stretching.py @@ -20,6 +20,8 @@ from hysop.numerics.odesolvers import Euler, RK2, RK3, RK4 from hysop.numerics.finite_differences import FDC2, FDC4 from hysop.operator.discrete.stretching import Conservative, GradUW +from hysop.codegen.kernels.stretching import CachedStretchingKernel + class GPUStretching(DiscreteOperator, GPUOperator): _supported_time_integrators = [Euler] @@ -106,18 +108,31 @@ class GPUStretching(DiscreteOperator, GPUOperator): raise NotImplementedError(msg) def _gen_cl_src(self): - print 'gen_cl_src!' - topo = self.velocity.topology + + shape = npw.ones(4, dtype=int) + shape[:self.dim] = topo.mesh.resolution + mesh_step = npw.ones(4, dtype=self.gpu_precision) mesh_step[:self.dim] = self._reorderVect(topo.mesh.space_step) - shape = topo.mesh.resolution - print 'shape:\t',shape - print 'mesh_step:\t',mesh_step - codegen = "" + typegen = self.typegen + work_dim = self.dim + symbolic_mode = True + known_vars = {} + + codegen = CachedStretchingKernel(typegen=typegen, + work_dim=work_dim, + order=order, + device=self.device, + context=self.context, + known_vars=known_vars, + symbolic_mode=symbolic_mode) + + src = codegen.__str__() + print src + sys.exit(1) - src = ""#codegen.__str__() gwi = (8,8,8) lwi = None @@ -125,25 +140,23 @@ class GPUStretching(DiscreteOperator, GPUOperator): prg = self.cl_env.build_raw_src(src, build_options) kernels = {} - kernels['stretching'] = KernelLauncher( - prg.stretching, self.cl_env.queue, gwi, lwi) - #kernels['copy'] = KernelLauncher(cl.enqueue_copy, self.cl_env.queue) + kernels['copy'] = KernelLauncher(cl.enqueue_copy, self.cl_env.queue) + kernels['stretching'] = KernelLauncher(prg.stretching, self.cl_env.queue, + gwi, lwi) self.kernels = kernels - def _compute_stretching(self, simulation): - pass - #wait_evt = self.field.events - #d_evt = self.num_diffusion( - #self.field.gpu_data[0], - #self.field_tmp, - #self.gpu_precision(self.viscosity * simulation.time_step), - #self._mesh_size, - #wait_for=wait_evt) - #c_evt = self.copy.launch_sizes_in_args( - #self.field.gpu_data[0], self.field_tmp, wait_for=[d_evt]) - #c_evt = cl.enqueue_copy(self.cl_env.queue, self.field.gpu_data[0], - #self.field_tmp, wait_for=[d_evt]) - #self.field.events.append(c_evt) + def _compute_stretching(self, simulation, to_gpu=True, to_host=True): + if to_gpu: + for field in self.input: + field.to_device() + + input_events = [evt for input in self.input for evt in input.events] + kernel_args = self.velocity.gpu_data + self.vorticity.gpu_data + + stretching_evt = self.kernels['stretching'](*kernel_args, wait_for=copy_events) + + if to_host: + for field in self.variables: + field.to_host() def apply(self, simulation): self._compute(simulation) -- GitLab