blob: fd95f38960168c28db189e408b026fcd16adc8e9 [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.sysds.runtime.controlprogram;
import java.util.ArrayList;
import java.util.List;
import org.apache.sysds.api.DMLScript;
import org.apache.sysds.conf.ConfigurationManager;
import org.apache.sysds.hops.recompile.Recompiler;
import org.apache.sysds.runtime.DMLRuntimeException;
import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
import org.apache.sysds.runtime.instructions.Instruction;
import org.apache.sysds.runtime.lineage.LineageCache;
import org.apache.sysds.runtime.lineage.LineageCacheConfig;
import org.apache.sysds.runtime.lineage.LineageCacheStatistics;
import org.apache.sysds.runtime.lineage.LineageItem;
import org.apache.sysds.runtime.lineage.LineageItemUtils;
import org.apache.sysds.utils.Statistics;
public class BasicProgramBlock extends ProgramBlock
{
protected ArrayList<Instruction> _inst;
public BasicProgramBlock(Program prog) {
super(prog);
_inst = new ArrayList<>();
}
public ArrayList<Instruction> getInstructions() {
return _inst;
}
public Instruction getInstruction(int i) {
return _inst.get(i);
}
public void setInstructions( ArrayList<Instruction> inst ) {
_inst = inst;
}
public void addInstruction(Instruction inst) {
_inst.add(inst);
}
public void addInstructions(ArrayList<Instruction> inst) {
_inst.addAll(inst);
}
public int getNumInstructions() {
return _inst.size();
}
@Override
public ArrayList<ProgramBlock> getChildBlocks() {
return null;
}
@Override
public boolean isNested() {
return false;
}
@Override
public void execute(ExecutionContext ec)
{
ArrayList<Instruction> tmp = _inst;
//dynamically recompile instructions if enabled and required
try
{
long t0 = DMLScript.STATISTICS ? System.nanoTime() : 0;
if( ConfigurationManager.isDynamicRecompilation()
&& _sb != null
&& _sb.requiresRecompilation() )
{
tmp = Recompiler.recompileHopsDag(
_sb, _sb.getHops(), ec, null, false, true, _tid);
}
if( DMLScript.STATISTICS ){
long t1 = System.nanoTime();
Statistics.incrementHOPRecompileTime(t1-t0);
if( tmp!=_inst )
Statistics.incrementHOPRecompileSB();
}
}
catch(Exception ex)
{
throw new DMLRuntimeException("Unable to recompile program block.", ex);
}
//statement-block-level, lineage-based reuse
LineageItem[] liInputs = null;
long t0 = 0;
if (_sb != null && LineageCacheConfig.isMultiLevelReuse() && !_sb.isNondeterministic()) {
liInputs = LineageItemUtils.getLineageItemInputstoSB(_sb.getInputstoSB(), ec);
List<String> outNames = _sb.getOutputNamesofSB();
if(liInputs != null && LineageCache.reuse(outNames, _sb.getOutputsofSB(),
outNames.size(), liInputs, _sb.getName(), ec) ) {
if( DMLScript.STATISTICS )
LineageCacheStatistics.incrementSBHits();
return;
}
t0 = System.nanoTime();
}
//actual instruction execution
executeInstructions(tmp, ec);
//statement-block-level, lineage-based caching
if (_sb != null && liInputs != null && !_sb.isNondeterministic())
LineageCache.putValue(_sb.getOutputsofSB(),
liInputs, _sb.getName(), ec, System.nanoTime()-t0);
}
}