use of org.apache.sysml.runtime.controlprogram.context.ExecutionContext in project incubator-systemml by apache.
the class GDFEnumOptimizer method optimize.
@Override
public GDFGraph optimize(GDFGraph gdfgraph, Summary summary) throws DMLRuntimeException, HopsException, LopsException {
Timing time = new Timing(true);
Program prog = gdfgraph.getRuntimeProgram();
ExecutionContext ec = ExecutionContextFactory.createContext(prog);
ArrayList<GDFNode> roots = gdfgraph.getGraphRootNodes();
//Step 1: baseline costing for branch and bound costs
double initCosts = Double.MAX_VALUE;
if (BRANCH_AND_BOUND_PRUNING) {
initCosts = CostEstimationWrapper.getTimeEstimate(prog, ec);
initCosts = initCosts * (1 + BRANCH_AND_BOUND_REL_THRES);
}
//Step 2: dynamic programming plan generation
//(finally, pick optimal root plans over all interesting property sets)
ArrayList<Plan> rootPlans = new ArrayList<Plan>();
for (GDFNode node : roots) {
PlanSet ps = enumOpt(node, _memo, initCosts);
Plan optPlan = ps.getPlanWithMinCosts();
rootPlans.add(optPlan);
}
long enumPlanMismatch = getPlanMismatches();
//check for final containment of independent roots and pick optimal
HashMap<Long, Plan> memo = new HashMap<Long, Plan>();
resetPlanMismatches();
for (Plan p : rootPlans) rSetRuntimePlanConfig(p, memo);
long finalPlanMismatch = getPlanMismatches();
//generate final runtime plan (w/ optimal config)
Recompiler.recompileProgramBlockHierarchy(prog.getProgramBlocks(), new LocalVariableMap(), 0, false);
ec = ExecutionContextFactory.createContext(prog);
double optCosts = CostEstimationWrapper.getTimeEstimate(prog, ec);
//maintain optimization summary statistics
summary.setCostsInitial(initCosts);
summary.setCostsOptimal(optCosts);
summary.setNumEnumPlans(_enumeratedPlans);
summary.setNumPrunedInvalidPlans(_prunedInvalidPlans);
summary.setNumPrunedSuboptPlans(_prunedSuboptimalPlans);
summary.setNumCompiledPlans(_compiledPlans);
summary.setNumCostedPlans(_costedPlans);
summary.setNumEnumPlanMismatch(enumPlanMismatch);
summary.setNumFinalPlanMismatch(finalPlanMismatch);
summary.setTimeOptim(time.stop());
return gdfgraph;
}
use of org.apache.sysml.runtime.controlprogram.context.ExecutionContext in project incubator-systemml by apache.
the class ScriptExecutorUtils method executeRuntimeProgram.
/**
* Execute the runtime program. This involves execution of the program
* blocks that make up the runtime program and may involve dynamic
* recompilation.
*
* @param se
* script executor
* @param statisticsMaxHeavyHitters
* maximum number of statistics to print
* @throws DMLRuntimeException
* if exception occurs
*/
public static void executeRuntimeProgram(ScriptExecutor se, int statisticsMaxHeavyHitters) throws DMLRuntimeException {
Program prog = se.getRuntimeProgram();
ExecutionContext ec = se.getExecutionContext();
DMLConfig config = se.getConfig();
executeRuntimeProgram(prog, ec, config, statisticsMaxHeavyHitters);
}
use of org.apache.sysml.runtime.controlprogram.context.ExecutionContext in project incubator-systemml by apache.
the class ProgramConverter method parseParForBody.
////////////////////////////////
// PARSING
////////////////////////////////
public static ParForBody parseParForBody(String in, int id) throws DMLRuntimeException {
ParForBody body = new ParForBody();
//header elimination
//normalization
String tmpin = in.replaceAll(NEWLINE, "");
//remove start/end
tmpin = tmpin.substring(PARFORBODY_BEGIN.length(), tmpin.length() - PARFORBODY_END.length());
HierarchyAwareStringTokenizer st = new HierarchyAwareStringTokenizer(tmpin, COMPONENTS_DELIM);
//handle DMLScript UUID (NOTE: set directly in DMLScript)
//(master UUID is used for all nodes (in order to simply cleanup))
DMLScript.setUUID(st.nextToken());
//handle DML config (NOTE: set directly in ConfigurationManager)
String confStr = st.nextToken();
JobConf job = ConfigurationManager.getCachedJobConf();
if (!InfrastructureAnalyzer.isLocalMode(job)) {
if (confStr != null && !confStr.trim().isEmpty()) {
DMLConfig dmlconf = DMLConfig.parseDMLConfig(confStr);
CompilerConfig cconf = OptimizerUtils.constructCompilerConfig(dmlconf);
ConfigurationManager.setLocalConfig(dmlconf);
ConfigurationManager.setLocalConfig(cconf);
}
//init internal configuration w/ parsed or default config
ParForProgramBlock.initInternalConfigurations(ConfigurationManager.getDMLConfig());
}
//handle additional configs
String aconfs = st.nextToken();
parseAndSetAdditionalConfigurations(aconfs);
//handle program
String progStr = st.nextToken();
Program prog = parseProgram(progStr, id);
//handle result variable names
String rvarStr = st.nextToken();
ArrayList<String> rvars = parseStringArrayList(rvarStr);
body.setResultVarNames(rvars);
//handle execution context
String ecStr = st.nextToken();
ExecutionContext ec = parseExecutionContext(ecStr, prog);
//handle program blocks
String spbs = st.nextToken();
ArrayList<ProgramBlock> pbs = rParseProgramBlocks(spbs, prog, id);
body.setChildBlocks(pbs);
body.setEc(ec);
return body;
}
use of org.apache.sysml.runtime.controlprogram.context.ExecutionContext in project incubator-systemml by apache.
the class ProgramConverter method serializeParForBody.
public static String serializeParForBody(ParForBody body, HashMap<String, byte[]> clsMap) throws DMLRuntimeException {
ArrayList<ProgramBlock> pbs = body.getChildBlocks();
ArrayList<String> rVnames = body.getResultVarNames();
ExecutionContext ec = body.getEc();
if (pbs.isEmpty())
return PARFORBODY_BEGIN + PARFORBODY_END;
Program prog = pbs.get(0).getProgram();
StringBuilder sb = new StringBuilder();
sb.append(PARFORBODY_BEGIN);
sb.append(NEWLINE);
//handle DMLScript UUID (propagate original uuid for writing to scratch space)
sb.append(DMLScript.getUUID());
sb.append(COMPONENTS_DELIM);
sb.append(NEWLINE);
//handle DML config
sb.append(ConfigurationManager.getDMLConfig().serializeDMLConfig());
sb.append(COMPONENTS_DELIM);
sb.append(NEWLINE);
//handle additional configurations
sb.append(PARFOR_CONF_STATS + "=" + DMLScript.STATISTICS);
sb.append(COMPONENTS_DELIM);
sb.append(NEWLINE);
//handle program
sb.append(PARFOR_PROG_BEGIN);
sb.append(NEWLINE);
sb.append(serializeProgram(prog, pbs, clsMap));
sb.append(PARFOR_PROG_END);
sb.append(NEWLINE);
sb.append(COMPONENTS_DELIM);
sb.append(NEWLINE);
//handle result variable names
sb.append(serializeStringArrayList(rVnames));
sb.append(COMPONENTS_DELIM);
//handle execution context
//note: this includes also the symbol table (serialize only the top-level variable map,
// (symbol tables for nested/child blocks are created at parse time, on the remote side)
sb.append(PARFOR_EC_BEGIN);
sb.append(serializeExecutionContext(ec));
sb.append(PARFOR_EC_END);
sb.append(NEWLINE);
sb.append(COMPONENTS_DELIM);
sb.append(NEWLINE);
//handle program blocks -- ONLY instructions, not variables.
sb.append(PARFOR_PBS_BEGIN);
sb.append(NEWLINE);
sb.append(rSerializeProgramBlocks(pbs, clsMap));
sb.append(PARFOR_PBS_END);
sb.append(NEWLINE);
sb.append(PARFORBODY_END);
return sb.toString();
}
use of org.apache.sysml.runtime.controlprogram.context.ExecutionContext in project incubator-systemml by apache.
the class ResourceOptimizer method getProgramCosts.
private static double getProgramCosts(Program prog) throws DMLRuntimeException {
//we need to cost the entire program in order to take in-memory status into account
ExecutionContext ec = ExecutionContextFactory.createContext();
double val = CostEstimationWrapper.getTimeEstimate(prog, ec);
_cntCostPB++;
return val;
}
Aggregations