def run_cmd(cmd, run_name=None): import imp module = imp.new_module(run_name) setattr(module, '__name__', run_name) setattr(module, '__package__', None) # Hide the current module if it exists. old_module = sys.modules.get(run_name) sys.modules[run_name] = module code = compile(cmd, '<string>', 'eval') exec(code, module.__dict__, module.__dict__) # Wait for execution to finish here before removing the module # because executing tasks might still need to refer to it future = c.legion_runtime_issue_execution_fence(top_level.runtime[0], top_level.context[0]) # block waiting on the future c.legion_future_wait(future, True, ffi.NULL) c.legion_future_destroy(future) # Make sure our module gets deleted to clean up any references # to variables the user might have made if old_module is None: del sys.modules[run_name] else: sys.modules[run_name] = old_module del module
def run_path(filename, run_name=None): import imp module = imp.new_module(run_name) setattr(module, '__name__', run_name) setattr(module, '__file__', filename) setattr(module, '__loader__', None) setattr(module, '__package__', run_name.rpartition('.')[0]) # Hide the current module if it exists. old_module = sys.modules.get(run_name) sys.modules[run_name] = module sys.path.append(os.path.dirname(filename)) with open(filename) as f: code = compile(f.read(), filename, 'exec') exec(code, module.__dict__, module.__dict__) # Wait for execution to finish here before removing the module # because executing tasks might still need to refer to it future = c.legion_runtime_issue_execution_fence(top_level.runtime[0], top_level.context[0]) # block waiting on the future c.legion_future_wait(future, True, ffi.NULL) c.legion_future_destroy(future) # Make sure our module gets deleted to clean up any references # to variables the user might have made if old_module is None: del sys.modules[run_name] else: sys.modules[run_name] = old_module del module
def flexflow_top_level_task(raw_args, user_data, proc): print("start top-level task") raw_arg_ptr = ffi.new('char[]', bytes(raw_args)) raw_arg_size = len(raw_args) # Execute preamble to obtain Legion API context. task = ffi.new('legion_task_t *') raw_regions = ffi.new('legion_physical_region_t **') num_regions = ffi.new('unsigned *') context = ffi.new('legion_context_t *') runtime = ffi.new('legion_runtime_t *') c.legion_task_preamble( raw_arg_ptr, raw_arg_size, proc, task, raw_regions, num_regions, context, runtime) top_level.runtime, top_level.context, top_level.task = runtime, context, task top_level.cleanup_items = [] print("top-level task") # Run user's script. args = input_args(True) start = 1 if len(args) > 1 and args[1] == '--nocr': start += 1 if len(args) < (start+1) or args[start] == '-': run_repl() elif args[start] == '-c': assert len(args) >= 3 sys.argv = list(args) run_cmd(args[start+1], run_name='__main__') else: assert len(args) >= (start+1) sys.argv = list(args) run_path(args[start], run_name='__main__') future = c.legion_runtime_issue_execution_fence(runtime[0], context[0]) c.legion_future_wait(future, False, ffi.NULL) print("end top-level task") # # Hack: Keep this thread alive because otherwise Python will reuse # # it for task execution and Pygion's thread-local state (_my.ctx) # # will get messed up. # c.legion_future_get_void_result( # c.legion_runtime_issue_execution_fence(runtime[0], context[0])) for cleanup in top_level.cleanup_items: cleanup() del top_level.runtime del top_level.context del top_level.task del top_level.cleanup_items gc.collect() # Execute postamble. c.legion_task_postamble(runtime[0], context[0], ffi.NULL, 0) print("real end top-level task")