|
| ITask () |
| Creates an ITask with number of threads equal to 1.
|
|
| ITask (size_t numThreads) |
| Constructs an ITask with a specified number of threads. More...
|
|
| ITask (size_t numThreads, bool isStartTask, bool poll, size_t microTimeoutTime) |
| Constructs an ITask with a specified number of threads as well as additional scheduling options. More...
|
|
virtual void | initialize () override |
| Virtual function that is called when an ITask is being initialized by it's owner thread.
|
|
virtual void | executeTask (std::shared_ptr< T > data)=0 |
| Pure virtual function that is called when an ITask's thread is to execute on data. More...
|
|
virtual bool | canTerminate (std::shared_ptr< AnyConnector > inputConnector) override |
| Virtual function that is called when an ITask is checking if it can be terminated. More...
|
|
virtual void | shutdown () override |
| Virtual function that is called when an ITask is being shutdown by it's owner thread. More...
|
|
virtual void | executeTaskFinal () override |
| Virtual function that is called just before the task has shutdown. More...
|
|
virtual std::string | getName () override |
| Virtual function to get the name of an ITask. More...
|
|
virtual std::string | getDotLabelName () override |
| Virtual function to get the label name used for dot graph viz. More...
|
|
virtual std::string | getDotShapeColor () override |
| Gets the color of the shape for graphviz dot. More...
|
|
virtual std::string | getDotFillColor () override |
| Gets the color for filling the shape for graphviz dot. More...
|
|
virtual std::string | getDotShape () override |
| Gets the shape for graphviz dot. More...
|
|
virtual std::string | getDotCustomProfile () override |
| Adds the string text to the profiling of this task in the graphviz dot visualization. More...
|
|
virtual void | printProfile () override |
| Prints the profile data to std::out. More...
|
|
virtual ITask< T, U > * | copy ()=0 |
| Pure virtual function to copy an ITask. More...
|
|
virtual size_t | getNumGraphsSpawned () |
| Gets the number of graphs spawned by this ITask. More...
|
|
virtual std::string | genDotProducerEdgeToTask (std::map< std::shared_ptr< AnyConnector >, AnyITask *> &inputConnectorDotMap, int dotFlags) override |
|
virtual std::string | genDotConsumerEdgeFromConnector (std::shared_ptr< AnyConnector > connector, int flags) override |
|
virtual std::string | genDotProducerEdgeFromConnector (std::shared_ptr< AnyConnector > connector, int flags) |
|
ITask< T, U > * | copyITask (bool deep) override |
| Copies the ITask (including a copy of all memory edges) More...
|
|
void | addResult (std::shared_ptr< U > result) |
| Adds results to the output list to be sent to the next connected ITask in a TaskGraph. More...
|
|
void | addResult (U *result) |
| Adds results to the output list to be sent to the next connected ITask in a TaskGraph. More...
|
|
void | initialize (size_t pipelineId, size_t numPipeline, TaskManager< T, U > *ownerTask) |
| Function that is called when an ITask is being initialized by it's owner thread. More...
|
|
template<class V > |
m_data_t< V > | getMemory (std::string name, IMemoryReleaseRule *releaseRule) |
| Retrieves memory from a memory edge. More...
|
|
template<class V > |
m_data_t< V > | getDynamicMemory (std::string name, IMemoryReleaseRule *releaseRule, size_t numElems) |
| Retrieves memory from a memory edge. More...
|
|
template<class V > |
void | releaseMemory (m_data_t< V > memory) |
| Releases memory onto a memory edge, which is transferred by the graph communicator. More...
|
|
void | resetProfile () |
| Resets profile data.
|
|
size_t | getThreadID () |
| Gets the thread ID associated with this task. More...
|
|
unsigned long long int | getTaskComputeTime () const |
| Gets the task's compute time. More...
|
|
std::string | inTypeName () override final |
| Gets the demangled input type name of the connector. More...
|
|
std::string | outTypeName () override final |
| Gets the demangled output type name of the connector. More...
|
|
std::string | getAddress () override final |
| Gets the address from the owner task, which is the address of the task graph. More...
|
|
void | setTaskManager (TaskManager< T, U > *ownerTask) |
| Sets the owner task manager for this ITask. More...
|
|
TaskManager< T, U > * | getOwnerTaskManager () |
| Gets the owner task manager for this ITask. More...
|
|
virtual void | gatherProfileData (std::map< AnyTaskManager *, TaskManagerProfile *> *taskManagerProfiles) |
| Gathers profile data. More...
|
|
| AnyITask () |
| Creates an ITask with number of threads equal to 1.
|
|
| AnyITask (size_t numThreads) |
| Constructs an ITask with a specified number of threads. More...
|
|
| AnyITask (size_t numThreads, bool isStartTask, bool poll, size_t microTimeoutTime) |
| Constructs an ITask with a specified number of threads as well as additional scheduling options. More...
|
|
virtual | ~AnyITask () |
| Destructor.
|
|
virtual std::string | genDot (int flags, std::string dotId, std::shared_ptr< htgs::AnyConnector > input, std::shared_ptr< htgs::AnyConnector > output) |
| Virtual function that generates the input/output and per-task dot notation. More...
|
|
virtual std::string | getConsumerDotIds () |
|
virtual std::string | getProducerDotIds () |
|
virtual std::string | genDot (int flags, std::string dotId) |
| Virtual function that adds additional dot attributes to this node. More...
|
|
virtual std::string | genCustomDot (ProfileUtils *profileUtils, int colorFlag) |
| Virtual function to generate customized dot file. More...
|
|
virtual void | debug () |
| Virtual function that is called to debug the ITask.
|
|
virtual std::string | debugDotNode () |
| Provides debug output for a node in the dot graph. More...
|
|
virtual void | profile () |
| Virtual function that is called to provide profile output for the ITask. More...
|
|
virtual std::string | profileStr () |
| Virtual function that is called after executionTask is called. More...
|
|
void | initialize (size_t pipelineId, size_t numPipeline) |
| Virtual function that is called when an ITask is being initialized by it's owner thread. More...
|
|
void | setPipelineId (size_t pipelineId) |
| Sets the pipeline Id for this ITask. More...
|
|
size_t | getPipelineId () |
| Gets the pipeline ID. More...
|
|
void | setNumPipelines (size_t numPipelines) |
| Sets the number of pipelines that this ITask belongs too. More...
|
|
size_t | getNumPipelines () const |
| Sets the task graph communicator. More...
|
|
size_t | getNumThreads () const |
| Gets the number of threads associated with this ITask. More...
|
|
bool | isStartTask () const |
| Gets whether this ITask is a starting task. More...
|
|
bool | isPoll () const |
| Gets whether this ITask is polling for data or not. More...
|
|
size_t | getMicroTimeoutTime () const |
| Gets the timeout time for polling. More...
|
|
void | copyMemoryEdges (AnyITask *iTaskCopy) |
| Copies the memory edges from this AnyITask to another AnyITask. More...
|
|
std::string | genDot (int flags, std::shared_ptr< AnyConnector > input, std::shared_ptr< AnyConnector > output) |
| Creates a dot notation representation for this task. More...
|
|
void | profileITask () |
| Provides profile output for the ITask,. More...
|
|
std::string | getDotId () |
| Gets the id used for dot nodes. More...
|
|
std::string | getNameWithPipelineId () |
| Gets the name of the ITask with it's pipeline ID. More...
|
|
const std::shared_ptr< ConnectorMap > & | getMemoryEdges () const |
| Gets the memory edges for the task. More...
|
|
const std::shared_ptr< ConnectorMap > & | getReleaseMemoryEdges () const |
| Gets the memory edges for releasing memory for the memory manager, used to shutdown the memory manager. More...
|
|
bool | hasMemoryEdge (std::string name) |
| Checks whether this ITask contains a memory edge for a specified name. More...
|
|
void | attachMemoryEdge (std::string name, std::shared_ptr< AnyConnector > getMemoryConnector, std::shared_ptr< AnyConnector > releaseMemoryConnector, MMType type) |
| Attaches a memory edge to this ITask to get memory. More...
|
|
unsigned long long int | getMemoryWaitTime () const |
| Gets the amount of time the task was waiting for memory. More...
|
|
void | incMemoryWaitTime (unsigned long long int val) |
| Increments memory wait time. More...
|
|
template<class T, class U>
class htgs::ITask< T, U >
An interface to process input data and forward results within a TaskGraph.
To use the ITask, a new class inherits ITask and defines the pure virtual functions. The ITask is then connected into a TaskGraphConf, which is bound to a TaskGraphRuntime. The ITask contains metadata that describes threading and scheduling rules. Using this metadata, the TaskGraphRuntime spawns threads into a pool for the ITask. Each thread is bound to a separate instance of the ITask, which is generated through the copy function.
The purpose of this interface is to provide the functions necessary to represent computational and logical operations for algorithms, which are added to a TaskGraphConf. Custom behavior for an ITask can be implemented, as demonstrated with other classes that derive from ITask; i.e., Bookkeeper, ExecutionPipeline, and ICudaTask.
An ITask should represent some component of an algorithm, such that multiple threads can concurrently process and stream data through a TaskGraphConf. The main pieces that impact the performance are: (1) Memory (reuse/capacity/locality), (2) Data dependencies, and (3) Computational complexity.
There are two methods for handling memory.
The first type of memory for an ITask is local memory. This type should be allocated in the initialize() function and freed in the shutdown() function. It is duplicated (one per thread) and should be local to that thread only.
The second type of memory is shared memory, which can be used by other tasks in a TaskGraphConf. One ITask is responsible for getting memory, while any other ITask or the main thread is responsible for releasing that memory. The memory is managed by an external MemoryManager, which allocates the memory and frees the memory once the TaskGraphConf is finished. Use the TaskGraph::addMemoryManagerEdge to attach a task to get memory. The memory that is acquired should be incorporated into the output data of the ITask and forwarded until it is released by some other task. The release memory operation should exist within the same task graph.
An ITask can get and release memory using the AnyITask::getMemory and AnyITask::releaseMemory routines, respectively. If there are cases where the ITask getting memory may not have a memory edge, then that task can use the AnyITask::hasMemoryEdge routine to verify if the edge exists.
If there are multiple computational ITasks within a TaskGraph, the number of threads processing each ITask should be determined based on the workload of each ITask with the aim of reducing the wait period for every ITask (if possible). By doing so, the overall compute time of a TaskGraph can be evenly distributed. The number of threads in use for computation should not exceed the number of logical cores on a system.
Example Implementation:
{
public:
ReadTask(
int numThreads,
long memorySize) :
ITask(numThreads), memorySize(memorySize) {}
virtual void initialize(
int pipelineId,
int numPipelines)
{
reusableMemory = new double[memorySize];
}
virtual void shutdown() {
delete [] reusableMemory; }
{
...
readData(data->getFile(), readBuffer->get());
...
}
virtual std::string
getName() {
return "ReadTask"; }
virtual bool isTerminated(std::shared_ptr<htgs::BaseConnector> inputConnector) { return inputConnector->isInputTerminated(); }
private:
double *reusableMemory;
long memorySize;
}
Usage Example:
int numThreadsPreprocess = 1;
int numThreadsRead = 2;
int numThreadsMultiply = 10;
PreProcessTask *preProcTask = new PreProcessTask(numThreadsPreprocess);
ReadTask *readTask = new ReadTask(numThreadsRead);
MultiplyTask *mulTask = new MultiplyTask(numThreadsMultiply);
taskGraph->
addEdge(preProcTask, readTask);
taskGraph->
addEdge(readTask, mulTask);
int otherMemoryPoolSize = 100;
int readMemoryPoolSize = 200;
taskGraph->
addMemoryManagerEdge(
"otherMemory", preProcTask,
new OtherMemoryAllocator(), otherMemoryPoolSize);
taskGraph->
addMemoryManagerEdge(
"readMemory", readTask,
new ReadMemoryAllocator(), readMemoryPoolSize);
- Template Parameters
-
T | the input data type for the ITask, T must derive from IData. |
U | the output data type for the ITask, U must derive from IData. |