org.apache.sysml.runtime.controlprogram.parfor.TaskPartitionerFactoring Maven / Gradle / Ivy
Show all versions of systemml Show documentation
/*
* 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.runtime.controlprogram.parfor;
import java.util.LinkedList;
import java.util.List;
import org.apache.sysml.runtime.DMLRuntimeException;
import org.apache.sysml.runtime.controlprogram.ParForProgramBlock;
import org.apache.sysml.runtime.controlprogram.parfor.Task.TaskType;
import org.apache.sysml.runtime.instructions.cp.IntObject;
/**
* This factoring task partitioner virtually iterates over the given FOR loop (from, to, incr),
* creates iterations and group them to tasks. Note that the task size is used here.
* The tasks are created with decreasing size for good load balance of heterogeneous tasks.
*
*
* See the original paper for details:
* [Susan Flynn Hummel, Edith Schonberg, Lawrence E. Flynn:
* Factoring: a practical and robust method for scheduling parallel loops.
* SC 1991: 610-632]
*
*/
public class TaskPartitionerFactoring extends TaskPartitioner
{
private int _numThreads = -1;
public TaskPartitionerFactoring( long taskSize, int numThreads, String iterVarName, IntObject fromVal, IntObject toVal, IntObject incrVal )
{
super(taskSize, iterVarName, fromVal, toVal, incrVal);
_numThreads = numThreads;
}
@Override
public List createTasks()
throws DMLRuntimeException
{
LinkedList tasks = new LinkedList();
long lFrom = _fromVal.getLongValue();
long lTo = _toVal.getLongValue();
long lIncr = _incrVal.getLongValue();
int P = _numThreads; // number of parallel workers
long N = _numIter; // total number of iterations
long R = N; // remaining number of iterations
long K = -1; // next _numThreads task sizes
TaskType type = null; // type of iterations: range tasks (similar to run-length encoding) make only sense if taskSize>3
for( long i = lFrom; i<=lTo; )
{
K = determineNextBatchSize(R, P);
R -= (K * P);
type = (ParForProgramBlock.USE_RANGE_TASKS_IF_USEFUL && K>3 ) ?
TaskType.RANGE : TaskType.SET;
//for each logical processor
for( int j=0; j lTo ) //no more iterations
break;
//create new task and add to list of tasks
Task lTask = new Task( type );
tasks.addLast(lTask);
// add iterations to task
if( type == TaskType.SET )
{
//value based tasks
for( long k=0; k queue)
throws DMLRuntimeException
{
long numCreatedTasks = 0;
long lFrom = _fromVal.getLongValue();
long lTo = _toVal.getLongValue();
long lIncr = _incrVal.getLongValue();
int P = _numThreads; // number of parallel workers
long N = _numIter; // total number of iterations
long R = N; // remaining number of iterations
long K = -1; //next _numThreads task sizes
TaskType type = null; // type of iterations: range tasks (similar to run-length encoding) make only sense if taskSize>3
try
{
for( long i = lFrom; i<=lTo; )
{
K = determineNextBatchSize(R, P);
R -= (K * P);
type = (ParForProgramBlock.USE_RANGE_TASKS_IF_USEFUL && K>3 ) ?
TaskType.RANGE : TaskType.SET;
//for each logical processor
for( int j=0; j lTo ) //no more iterations
break;
//create new task and add to list of tasks
Task lTask = new Task( type );
// add iterations to task
if( type == TaskType.SET )
{
//value based tasks
for( long k=0; k