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