Browse Source

Many optimizations to the request handler and number of calls

Yentl Van Tendeloo 7 years ago
parent
commit
4dd33101a0

+ 40 - 51
kernel/modelverse_kernel/main.py

@@ -353,8 +353,39 @@ class ModelverseKernel(object):
 
 
         yield [("RETURN", [func])]
         yield [("RETURN", [func])]
 
 
-    def jit_compile(self, task_root, inst):
-        # Try to retrieve the suggested name.
+    def execute_jit(self, task_root, inst, taskname, params = {}, store=False, resolve=True):
+        # execute_jit
+        if resolve:
+            try:
+                inst = self.jit.body_cache[inst]
+            except KeyError:
+                body, = yield [("RD", [inst, "body"])]
+                self.jit.body_cache[inst] = body
+                inst = body
+
+        if store:
+            task_frame, =    yield [("RD", [task_root, "frame"])]
+            symbols, =       yield [("RD", [task_frame, "symbols"])]
+            dict_keys_ref, =  yield [("RDK", [symbols])]
+            if dict_keys_ref:
+                dict_keys_ref_n =   yield [("RD", [i, "name"]) for i in dict_keys_ref]
+                dict_keys =       yield [("RV", [i]) for i in dict_keys_ref_n]
+                dict_values_elem = yield [("RDN", [symbols, i]) for i in dict_keys_ref]
+                dict_values = yield [("RD", [i, "value"]) for i in dict_values_elem]
+
+                parameters = dict(zip(dict_keys, dict_values))
+                parameters.update(params)
+
+                for p in parameters.keys():
+                    if not isinstance(parameters[p], dict):
+                        parameters[p] = {'id': parameters[p]}
+                params = parameters
+                    
+        params["root"] = self.root
+        params["task_root"] = task_root
+        params["taskname"] = taskname
+        params["mvk"] = self
+
         # Have the JIT compile the function.
         # Have the JIT compile the function.
         if inst is None:
         if inst is None:
             suggested_name = self.jit.get_global_name(inst)
             suggested_name = self.jit.get_global_name(inst)
@@ -363,7 +394,7 @@ class ModelverseKernel(object):
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
 
 
         elif inst in self.jit.jitted_entry_points:
         elif inst in self.jit.jitted_entry_points:
-            yield [("RETURN", [self.jit.jit_globals[self.jit.jitted_entry_points[inst]]])]
+            compiled_func = self.jit.jit_globals[self.jit.jitted_entry_points[inst]]
         else:
         else:
             compiled_func = self.jit.lookup_compiled_body(inst)
             compiled_func = self.jit.lookup_compiled_body(inst)
 
 
@@ -372,57 +403,11 @@ class ModelverseKernel(object):
                 if suggested_name is None:
                 if suggested_name is None:
                     suggested_name = "func_%s" % str(inst)
                     suggested_name = "func_%s" % str(inst)
                 compiled_func, = yield [("CALL_ARGS", [self.read_function, (inst, suggested_name)])]
                 compiled_func, = yield [("CALL_ARGS", [self.read_function, (inst, suggested_name)])]
-                exec(compiled_func, self.jit.jit_globals)
-                compiled_func = self.jit.jit_globals[suggested_name]
+                compiled_func = self.merge_function(compiled_func, suggested_name)
                 self.jit.register_compiled(inst, compiled_func, suggested_name)
                 self.jit.register_compiled(inst, compiled_func, suggested_name)
 
 
-            yield [("RETURN", [compiled_func])]
-
-    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"])]
-                symbols, =       yield [("RD", [task_frame, "symbols"])]
-                dict_keys_ref, =  yield [("RDK", [symbols])]
-                if dict_keys_ref:
-                    dict_keys_ref_n =   yield [("RD", [i, "name"]) for i in dict_keys_ref]
-                    dict_keys =       yield [("RV", [i]) for i in dict_keys_ref_n]
-                    dict_values_elem = yield [("RDN", [symbols, i]) for i in dict_keys_ref]
-                    dict_values = yield [("RD", [i, "value"]) for i in dict_values_elem]
-
-                    parameters = dict(zip(dict_keys, dict_values))
-                    parameters.update(params)
-                else:
-                    parameters = params
-            except:
-                parameters = params
-        else:
-            parameters = params
-
-        for p in parameters.keys():
-            if not isinstance(parameters[p], dict):
-                parameters[p] = {'id': parameters[p]}
-                #print("CONVERSION REQUIRED...")
-        #print("Calling with parameters:" + str(parameters))
-
-        parameters["root"] = self.root
-        parameters["task_root"] = task_root
-        parameters["taskname"] = taskname
-        parameters["mvk"] = self
-
-        # Have the JIT compile the function.
-        compiled_func, = yield [("CALL_ARGS", [self.jit_compile, (task_root, inst)])]
         # Run the compiled function.
         # Run the compiled function.
-        results = yield [("CALL_KWARGS", [compiled_func, parameters])]
+        results = yield [("CALL_KWARGS", [compiled_func, params])]
         if results is None:
         if results is None:
             raise Exception("%s: primitive finished without returning a value!" % (self.debug_info[taskname]))
             raise Exception("%s: primitive finished without returning a value!" % (self.debug_info[taskname]))
         else:
         else:
@@ -463,6 +448,10 @@ class ModelverseKernel(object):
             yield [("RETURN", [result])]
             yield [("RETURN", [result])]
         yield [("RETURN", [None])]
         yield [("RETURN", [None])]
 
 
+    def merge_function(self, func, name):
+        exec(func, self.jit.jit_globals)
+        return self.jit.jit_globals[name]
+
     ########################################
     ########################################
     ### Execute input and output methods ###
     ### Execute input and output methods ###
     ########################################
     ########################################

+ 16 - 20
kernel/modelverse_kernel/request_handler.py

@@ -19,28 +19,19 @@ class RequestHandler(object):
     def handle_request(self, reply):
     def handle_request(self, reply):
         self.reply = reply
         self.reply = reply
         while self.generator_stack:
         while self.generator_stack:
-            try:
-                requests = self.generator_stack[-1].send(self.reply)
-
-                # Generated new request, so process
-                if requests and requests[0][0] in self.handlers:
-                    # This next command potentially raises a finished message already, meaning that we should stop already
-                    # We avoid an extra try/except block by putting the None on the stack already
-                    self.reply = None
-                    self.handlers[requests[0][0]](requests[0][1])
-                else:
-                    # MvS request, so forward that instead
-                    return requests
-
-            except StopIteration:
-                # Exception, so finished execution of this generator, passing on None to the caller
-                #print("STOP for " + str(self.generator_stack))
-                del self.generator_stack[-1]
-                self.reply = [None]
+            requests = self.generator_stack[-1].send(self.reply)
+
+            # Generated new request, so process
+            if requests and requests[0][0] in self.handlers:
+                # This next command potentially raises a finished message already, meaning that we should stop already
+                # We avoid an extra try/except block by putting the None on the stack already
+                self.handlers[requests[0][0]](requests[0][1])
+            else:
+                # MvS request, so forward that instead
+                return requests
                 
                 
     def execute_finish(self, request_args):
     def execute_finish(self, request_args):
-        del self.generator_stack[-1]
-        self.reply = [None]
+        self.generator_stack = []
         
         
     def execute_sleep(self, request_args):
     def execute_sleep(self, request_args):
         raise primitive_functions.SleepKernel(request_args[0], request_args[1])
         raise primitive_functions.SleepKernel(request_args[0], request_args[1])
@@ -51,9 +42,14 @@ class RequestHandler(object):
 
 
     def execute_call(self, request_args):
     def execute_call(self, request_args):
         self.generator_stack.append(request_args[0])
         self.generator_stack.append(request_args[0])
+        self.reply = None
 
 
     def execute_call_args(self, request_args):
     def execute_call_args(self, request_args):
+        print("CALL " + str(request_args[0]))
         self.generator_stack.append(request_args[0](*(request_args[1])))
         self.generator_stack.append(request_args[0](*(request_args[1])))
+        self.reply = None
 
 
     def execute_call_kwargs(self, request_args):
     def execute_call_kwargs(self, request_args):
+        print("KWCALL " + str(request_args[0]))
         self.generator_stack.append(request_args[0](**(request_args[1])))
         self.generator_stack.append(request_args[0](**(request_args[1])))
+        self.reply = None

+ 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:   Wed May  2 11:10:29 2018
+Date:   Wed May  2 14:22:40 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server