Bläddra i källkod

Cache body of function and skip execute_jit_internal

Yentl Van Tendeloo 7 år sedan
förälder
incheckning
baae540275
2 ändrade filer med 13 tillägg och 10 borttagningar
  1. 12 9
      kernel/modelverse_kernel/main.py
  2. 1 1
      wrappers/modelverse_SCCD.py

+ 12 - 9
kernel/modelverse_kernel/main.py

@@ -33,6 +33,7 @@ class ModelverseKernel(object):
         # `self.jit` handles most JIT-related functionality.
         # `self.jit` handles most JIT-related functionality.
         self.jit = jit.ModelverseJit()
         self.jit = jit.ModelverseJit()
         self.jit.compiled_function_lookup = lambda func_name : getattr(compiled_functions, func_name, None)
         self.jit.compiled_function_lookup = lambda func_name : getattr(compiled_functions, func_name, None)
+        self.jit.body_cache = {}
 
 
         self.debug_info = defaultdict(list)
         self.debug_info = defaultdict(list)
 
 
@@ -75,7 +76,7 @@ class ModelverseKernel(object):
             elif isinstance(self.phase_v, string_types):
             elif isinstance(self.phase_v, string_types):
                 if self.phase_v == "init" and self.jit.is_jittable_entry_point(self.inst):
                 if self.phase_v == "init" and self.jit.is_jittable_entry_point(self.inst):
                     #print("%-30s(%s)" % ("COMPILED " + str(self.jit.jitted_entry_points[self.inst]), phase_v))
                     #print("%-30s(%s)" % ("COMPILED " + str(self.jit.jitted_entry_points[self.inst]), phase_v))
-                    gen = self.execute_jit(task_root, self.inst, taskname, store=True)
+                    gen = self.execute_jit(task_root, self.inst, taskname, store=True, resolve=False)
                 elif inst_v is None:
                 elif inst_v is None:
                     raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[taskname], inst_v, self.phase_v))
                     raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[taskname], inst_v, self.phase_v))
                 else:
                 else:
@@ -91,12 +92,6 @@ class ModelverseKernel(object):
 
 
             yield [("CALL", [gen])]
             yield [("CALL", [gen])]
 
 
-    def execute_jit_internal(self, task_root, inst, taskname, params):
-        inst, = yield [("RD", [inst, "body"])]
-        result, = yield [("CALL_ARGS", [self.execute_jit, [task_root, inst, taskname, params, False]])]
-        #print("Setting result of call to " + str(result))
-        raise primitive_functions.PrimitiveFinished(result)
-        
     def get_inst_phase_generator(self, inst_v, phase_v, task_root):
     def get_inst_phase_generator(self, inst_v, phase_v, task_root):
         """Gets a generator for the given instruction in the given phase,
         """Gets a generator for the given instruction in the given phase,
            for the specified task root."""
            for the specified task root."""
@@ -292,7 +287,7 @@ class ModelverseKernel(object):
                 pass
                 pass
             else:
             else:
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
-                actual_computation = "%s, = yield [('CALL_ARGS', [_mvk.execute_jit_internal, (_root, %s['id'], _taskname, %s)])]\n" % (value, func_name, param_list)
+                actual_computation = "%s, = yield [('CALL_ARGS', [_mvk.execute_jit, (_root, %s['id'], _taskname, %s)])]\n" % (value, func_name, param_list)
 
 
             if indent == 0:
             if indent == 0:
                 # No indent, meaning that we use it inline
                 # No indent, meaning that we use it inline
@@ -384,8 +379,16 @@ class ModelverseKernel(object):
 
 
             raise primitive_functions.PrimitiveFinished(compiled_func)
             raise primitive_functions.PrimitiveFinished(compiled_func)
 
 
-    def execute_jit(self, task_root, inst, taskname, params = {}, store=False):
+    def execute_jit(self, task_root, inst, taskname, params = {}, store=False, resolve=True):
         # execute_jit
         # execute_jit
+        if resolve:
+            try:
+                body = self.jit.body_cache[inst]
+            except KeyError:
+                body, = yield [("RD", [inst, "body"])]
+                self.jit.body_cache[inst] = body
+            inst = body
+
         if store:
         if store:
             try:
             try:
                 task_frame, =    yield [("RD", [task_root, "frame"])]
                 task_frame, =    yield [("RD", [task_root, "frame"])]

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Fri Apr 27 09:25:20 2018
+Date:   Fri Apr 27 10:19:38 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server