For programmers working at higher levels of abstraction, a good compiler will automatically balance pipeline concurrency where possible.
In the context of high-level programming, a good compiler will automatically synchronize and manage concurrent processing in pipelines when suitable.