Introducing task level computation abstraction#235
Conversation
|
what is the diff between |
For example, a task can be: We can extract each code block to build this temporary representation: Based on this temporary representation, we can perform resource binding (affine controller chaining, multi-CGRA binding, etc.). And then we can fuse these hyperblocks to get the |
|
When we extract to convert
I use the trait
Because actually, we can also wrap the innermost loop (including the loop control) into the hyperblock, and we can still handle loop control w/o counters. Furthermore, if a loop body contains |
In this pr,
taskflow.task: we ensure there are only data dependencies (e.g., producer-consumer, RAW, WAR, WAW) between different taskstaskflow.counterop: convert all the loop control into counter tree/graph, each counter represents a loop controltaskflow.hyperblock: wrap the rest code intohyperblockThis design enables us to perform three-level optimizations:
TODO:
Hyperblock fusion to generate the DFG/integrate to the
neura.kernelop.