blob: 720f1640db7c9e1e0ac22805dee64fcf690792ee [file] [log] [blame]
/*
* 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);
}
}
/**
*
* @param prog
* @param rtprog
* @return
* @throws DMLRuntimeException
* @throws HopsException
* @throws LopsException
*/
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;
}
/**
*
* @param type
* @param graphCreator
* @return
* @throws HopsException
* @throws DMLRuntimeException
*/
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;
}
}