The software (compiler) organises instructions that can be executed in parallel into a single very long instruction (512 bits to 1024 bits for example).
it bundles base instructions

The bundled instructions can be completely unrelated, not like in SIMD.

The CPU trusts the compiler and executes all of them at the same time.
It uses a pipeline kind of like a superscalar pipeline except no conflict checking.

Pros:

  • simpler hardware
    • no need for dependency checking
    • no need for instruction alignment/distribution to different functional units

Cons:

  • compiler needs to be very good
    • need to compile for hardware very specifically tied to performance of the uarch
  • low parallelism code bloat
    • a lot of NOPs
  • lockstep-execution if any instruction in a VLIW stalls all others stalls
    • happens often with memory instructions
    • in OoO-Execution we could work around this by then scheduling others latency tolerance

18.2 Trace / Superblock optimisations

The VLIW architecture forces compiler designers to implement optimisation techniques to really take advantage of the parallelism.

  • Trace Scheduling
  • Superblock scheduling

These aim to identify and optimise frequently executed path in the control flow by creating larger, straight-line code blocks.
static scheduling and parallelisation

In this example we create a superblock.

It has:

  • a “hot-path”
  • tail-duplication
    • we might have to abort the block because of an unexpected branch
    • for each possible branch out, we append the code that still needs to be executed to the end
  • strength reduction
    • use a mov instead of a second mul
    • find common subexpressions like <-r2,3