/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.sysml.hops.globalopt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.sysml.hops.HopsException; import org.apache.sysml.hops.globalopt.gdfgraph.GDFGraph; import org.apache.sysml.hops.globalopt.gdfgraph.GraphBuilder; import org.apache.sysml.lops.LopsException; import org.apache.sysml.parser.DMLProgram; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.controlprogram.Program; import org.apache.sysml.runtime.controlprogram.parfor.stat.Timing; import org.apache.sysml.utils.Explain; /** * Main entry point for Global Data Flow Optimization. It is intended to be invoked after * the initial runtime program was created (and thus with constructed hops and lops). * * */ public class GlobalOptimizerWrapper { private static final Log LOG = LogFactory.getLog(GlobalOptimizerWrapper.class); private static final boolean LDEBUG = true; //local debug flag //supported optimizers public enum GlobalOptimizerType{ ENUMERATE_DP, TRANSFORM } //internal parameters private static final GlobalOptimizerType OPTIM = GlobalOptimizerType.ENUMERATE_DP; static { // for internal debugging only if( LDEBUG ) { Logger.getLogger("org.apache.sysml.hops.globalopt") .setLevel((Level) Level.DEBUG); } } public static Program optimizeProgram(DMLProgram prog, Program rtprog) throws DMLRuntimeException, HopsException, LopsException { LOG.debug("Starting global data flow optimization."); Timing time = new Timing(true); //create optimizer instance GlobalOptimizer optimizer = createGlobalOptimizer( OPTIM ); //create global data flow graph Summary summary = new Summary(); GDFGraph graph = GraphBuilder.constructGlobalDataFlowGraph(rtprog, summary); if( LOG.isDebugEnabled() ) { LOG.debug("EXPLAIN GDFGraph:\n" + Explain.explainGDFNodes(graph.getGraphRootNodes(),1)); } //core global data flow optimization graph = optimizer.optimize(graph, summary); //get the final runtime program rtprog = graph.getRuntimeProgram(); //print global optimizer summary LOG.info( summary ); LOG.debug("Finished global data flow optimization in " + time.stop() + " ms."); return rtprog; } private static GlobalOptimizer createGlobalOptimizer( GlobalOptimizerType type ) throws HopsException, DMLRuntimeException { GlobalOptimizer optimizer = null; switch( type ) { case ENUMERATE_DP: optimizer = new GDFEnumOptimizer(); break; //case TRANSFORM: // optimizer = new GlobalTransformationOptimizer(Strategy.CANONICAL); // ((GlobalTransformationOptimizer)optimizer).addRule(new BlockSizeRule()); // break; default: throw new HopsException("Unsupported global optimizer type: "+type+"."); } return optimizer; } }