Porting a Program from C to HPVM-C¶
The following represents the required steps to port a regular C program into an HPVM program with HPVM-C. These steps are described at a high level; for more detail, please see hpvm-cava provided in general benchmarks. For a list of all supported HPVM-C directives, see the HPVM-C Specs.
Separate the computation that will become a kernel into its own (leaf node) function and add the attributes and target hint.
Create a level 1 wrapper node function that will describe the thread-level parallelism (for the GPU). The node will:
Use the
createNode[ND]()
method to create a kernel node and specify how many threads will execute it.Bind its arguments to the kernel arguments.
If desired, create a level 2 wrapper node function which will describe the threadblock-level parallalism (for the GPU). This node will:
Use the
createNode[ND]()
method to create a level 1 wrapper node and specify how many threadblocks will execute it.Bind its arguments to its child node’s arguments.
A root node function that creates all the top-level wrapper nodes, binds their arguments, and connects their edges.
Each root node represents a DFG.
All the above node functions have the combined arguments of all the kernels that are nested at each level.
The host code will have to include the following:
Initialize the HPVM runtime using the
init()
method.Create an argument struct for each DFG and assign its member variables.
Add all the memory that is required by the kernel into the memory tracker.
Launch the DFG by calling the
launch()
method on the root node function, and passing the corresponding argument struct.Wait for the DFG to complete execution.
Read out any generated memory using the
request_mem()
method.Remove all the tracked memory from the memory tracker.