|
|
@@ -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"])]
|