Similarly, edge 112 illustrates a dependency between the first execution engine 210 and the second execution engine 220. For example, the computation operation of node 120 may require the result of the computation operation of node 110. Edge 122 further illustrates a non-dependency, since the operations of node 150 can follow the operations of node 120 without needing to wait for the operations of another execution engine to complete.
To accommodate the dependencies such as those illustrated by the examples of FIGS. 1 and 2, in various examples, the instructions generated for the integrated circuit device can make use of checkpoint registers of the integrated circuit device. In various examples, registers are a type of memory location in the integrated circuit device that can be written to by the execution engines of the integrated circuit device, and, in some cases, also be written to be devices outside of the integrated circuit device. Additionally, the execution engines can implement instructions that wait on a value (i.e., a checkpoint) to be written to a particular checkpoint register. When the value is written, the checkpoint is considered to have been reached and the required operations completed. Instructions that wait on a checkpoint can cause an execution engine to halt or stall further execution of instructions until the checkpoint is reached by the other execution engine. When the checkpoint is reached before the execution engine executes the checkpoint wait instruction, then the execution need not stop at the wait instruction.