浏览代码

Cache body of function and skip execute_jit_internal

Yentl Van Tendeloo 7 年之前
父节点
当前提交
baae540275
共有 2 个文件被更改,包括 13 次插入10 次删除
  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 = jit.ModelverseJit()
         self.jit.compiled_function_lookup = lambda func_name : getattr(compiled_functions, func_name, None)
+        self.jit.body_cache = {}
 
         self.debug_info = defaultdict(list)
 
@@ -75,7 +76,7 @@ class ModelverseKernel(object):
             elif isinstance(self.phase_v, string_types):
                 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))
-                    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:
                     raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[taskname], inst_v, self.phase_v))
                 else:
@@ -91,12 +92,6 @@ class ModelverseKernel(object):
 
             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):
         """Gets a generator for the given instruction in the given phase,
            for the specified task root."""
@@ -292,7 +287,7 @@ class ModelverseKernel(object):
                 pass
             else:
                 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:
                 # No indent, meaning that we use it inline
@@ -384,8 +379,16 @@ class ModelverseKernel(object):
 
             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
+        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:
             try:
                 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)
 
-Date:   Fri Apr 27 09:25:20 2018
+Date:   Fri Apr 27 10:19:38 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server